免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2755 | 回复: 5
打印 上一主题 下一主题

[文本处理] 求脚本把中文关键字/词相关的句子 从语料库里摘录出来? 已经解决! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-09-19 15:56 |只看该作者 |倒序浏览
本帖最后由 blackantt 于 2018-09-21 09:37 编辑

1.比如  当前目录下关键字/词文件 key.txt 如下(每行1个中文的字/词)
cat key.txt

中国
一网打尽

2.  当前目录下的txt目录里有多个中文 txt 文件。
--------------------------------------------------------------
            从2中的txt目录下的多个txt文件中,把1中的关键字/词所在的完整句子(2个中文句号之间的句子认为是完整的)摘录出来。并做上标记。最终的文件形式如3

3.最终形成的结果文件 result.txt ,形式如下(最后的句中关键字用括号引起来,取关键字/词前一个句号与后一个句号之间的句子 )
五. 我有[五]个朋友,还有更多女朋友。
五. 他说话一[五]一十。
.....
中国. 我是[中国]人。
中国. 说到[中国],它是个美丽的国家,有十几亿人。
....
一网打尽. [一网打尽]是个成语。
一网打尽. 昨晚,小偷被[一网打尽]了。


   就是从2中的语料库的多个txt文件中,把1中的关键字/词所在的完整句子(2个中文句号之间的句子认为是完整的)摘录出来。并做上标记。最终的文件形式如3。








word.zip

983.38 KB, 下载次数: 14

论坛徽章:
0
2 [报告]
发表于 2018-09-19 17:22 |只看该作者
bash-4.2$ cat 1

中国
一网打尽
bash-4.2$ cat 2
五. 我有五个朋友,还有更多朋友。
五. 他说话一五一十。
中国. 我是中国人。
中国. 说到中国,它是个美丽的国家,有十几亿人。
一网打尽. 一网打尽是个成语。
一网打尽. 昨晚,小偷被一网打尽了。
bash-4.2$ awk 'NR == FNR {a[$0]++; next} { for (i in a) gsub(i, "["i"]", $0); print}' 1 2
[五]. 我有[五]个朋友,还有更多朋友。
[五]. 他说话一[五]一十。
[中国]. 我是[中国]人。
[中国]. 说到[中国],它是个美丽的国家,有十几亿人。
[一网打尽]. [一网打尽]是个成语。
[一网打尽]. 昨晚,小偷被[一网打尽]了。

论坛徽章:
0
3 [报告]
发表于 2018-09-19 18:48 |只看该作者
本帖最后由 blackantt 于 2018-09-19 18:50 编辑
csccyab 发表于 2018-09-19 17:22
bash-4.2$ cat 1

中国

   这个实现的是 “从2中的语料库的多个txt文件中,把1中的关键字/词所在的完整句子(2个中文句号之间的句子认为是完整的)摘录出来。并做上标记。最终的文件形式如3。” 吗?
  我用gawk在windows下运行不了。麻烦再帮看下 (如果没有windows下的gawk,在linux下的语句也可以)。你可用附件的word.zip试下

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
4 [报告]
发表于 2018-09-20 12:50 |只看该作者
回复 3# blackantt


  1. gawk "NR == FNR {a[$0]++; next} { for (i in a) if ($0~i) {gsub(i, \"[\"i\"]\", $0); print}}" .\word\key.txt .\word\txt\1.txt > result.txt
复制代码

试试这样在你的Windows上能执行吗?得到的结果有什么问题吗?

论坛徽章:
0
5 [报告]
发表于 2018-09-20 13:52 |只看该作者
$ awk 'NR == FNR {a[$0]++; next} { for (i in a) if ($0~i) {print gensub(i, "["i"]", 2, $0)}}' 1 2
五. 我有[五]个朋友,还有更多朋友。
五. 他说话一[五]一十。
中国. 我是[中国]人。
中国. 说到[中国],它是个美丽的国家,有十几亿人。
一网打尽. [一网打尽]是个成语。
一网打尽. 昨晚,小偷被[一网打尽]了。

论坛徽章:
0
6 [报告]
发表于 2018-09-21 09:30 |只看该作者
本帖最后由 blackantt 于 2018-09-21 09:37 编辑

谢谢各位

   已经有朋友给用perl解决了。红包已发。只用了一个数据作测试。基本能用就行。

use Cwd;
use Data:umper;
use Encode;
use utf8;
my $dir = getcwd;

my $keyfile = $dir.'/key.txt';
my $targetpath = $dir.'/txt';
my $resultfile = $dir.'/result.txt';
print $keyfile;
open(RD,$keyfile);
my @keys;
while(<RD>{
        my $line = $_;
        $line =~ s/\n//isg;
        $line = decode('utf8',$line);
        push @keys,$line;
}
close RD;
print Dumper @keys;
opendir DIR,${targetpath};
my @filelist = readdir DIR;
shift @filelist;
shift @filelist;
open(WT,">".$resultfile);
shift @keys;
for my $onekey (@keys){
        my $num = 0;
        my $flag = 'no';
        print WT "result of ".$onekey.":\n";
        for my $one (@filelist){
                open(RDD,$targetpath.'\\'.$one);
                $/ = encode('utf8',"。";
                my @lines=<RDD>;
                for my $oneline (@lines){
                        $oneline = decode("utf8", $oneline);
                        my $newline = $oneline;
                                $newline =~ s/$onekey/(*$onekey*)/isg;
                        if ($newline ne $oneline){
                                print WT $onekey,"...",$newline."\n\n";
                                $num++;
                        }
                        if ($num ==20){
                                $flag = 'yes';
                                last;
                        }
                }
                if ($flag eq 'yes'){
                        last;
                }
                print $one;
        }
}


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP