免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求助,遍历newword列表里单词,grep众多txt文件,从中取出相关行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-05 14:26 |只看该作者 |倒序浏览
本帖最后由 blackantt 于 2014-01-05 16:32 编辑

相关文件有3种
A1.  /1/abc/newword.txt      (约有1000个词)
apple
get on
apply
....

A2. /1/abc/phonetic.txt       音标及同义词/反义词文件 (约有30000行)
apple            /æpl/  [syn] pear fruit [ayn] animal
apply            /ə'plaɪ/  [syn] abc def [ayn] ghi xyz
.........

A3. /1/xyz/*.txt       文本文件目录,(约有300个txt文件,共约30M或者更大)

a.txt

  I am the first.I am the second.I have an apple.Do you want to eat?I am the fourth apple.I am the fifth.
................
................

b.txt

....



   a.第1步,以A1里newword.txt里的apple为关键字,
   b.第2步,用apple在A3里txt目录的各文件中匹配每1个apple,取出它的    "apple所在句的上1句,apple所在句,apple所在句的下1句"。共3句,放在1行里。形如

apple  I am the second.I have an [ apple ].Do you want to eat?  #a.txt
apple  Do you want to eat?I am the fourth [ apple ].I am the fifth.   #a.txt
....

   c.第3步,用每行行首的apple与A2文件里每行行首的apple进行查找,形成结果(增加了A2文件里的音标内容进结果)
最终形成结果/1/ok.txt (以newword.txt里的apple为例)

apple /æpl/  [syn] pear fruit [ayn] animal  . I am the second.I have an [ apple ].Do you want to eat? #a.txt
apple /æpl/  [syn] pear fruit [ayn] animal . Do you want to eat?I am the fourth [ apple ].I am the fifth.  #a.txt
............


以上结果,行首关键字(apple)来自A1的newword.txt,音标与同反义词(/æpl/  [syn] pear fruit [ayn] animal )来自A2的phonetic.txt,上下文(I am the second.I have an [ apple ].Do you want to eat?)来自A3的txt目录   

  其实就是批量用 grep 从newword里取关键字来遍历全文检索txt里的上下文,最后再把音标等vlookup进去

  有朋友在perl下实现,我只用几个词试了一下,当时非常棒。但后来如果单词变多。perl就等不到结果了。(perl实现   http://bbs.chinaunix.net/thread-4116107-1-1.html)

(测试文件  在  http://en.mail.qq.com/cgi-bin/ft ... d&code=f5227e21 )

现在看能否在shell下实现,只要5个小时以内有最终结果就ok了。thanks


论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
2 [报告]
发表于 2014-01-05 14:32 |只看该作者
结果多贴点出来, 不知道什么规律

论坛徽章:
0
3 [报告]
发表于 2014-01-05 16:22 |只看该作者
回复 2# elu_ligao

   更新了,我怕表达不清楚,说的很多。其实就是  批量用 grep 找出txt里的上下文,再把音标加到每1行。
thanks


   

论坛徽章:
1
未羊
日期:2014-01-02 10:31:18
4 [报告]
发表于 2014-01-06 16:31 |只看该作者
本帖最后由 huzikan 于 2014-01-06 16:32 编辑

下面是用perl写的版本,因为你的文本处理要求相对复杂,需要一些复杂的逻辑判断和正则匹配,所以感觉用perl比较方便一点。下面的代码还不能完全实现你的要求,主要是在一些特殊情况下,比如关键词apple如果在两个相邻的句子中重复出现,那么程序匹配到第一个apple的时候会输出完整的三句(前一句,自己,后一句),且后一句也为带apple关键字的行,那么第二次就不会再次匹配到相邻的apple了,另外如果两个apple之间只相隔一个句子,那么前一个apple会输出完整三句,而后一个apple变不会再次输出两个之间的那句话。本来想把这个问题也处理一下的,但是发现处理起来有很大的难度。最后UNIX下面不支持你文本中的音标字符“阿尔法”等,为了测试方便我已经去掉了。另你需要把脚本中的文件名改为你自己的绝对路径,脚本支持正文文件中一个句子不在一行上或者每个单词之间含有多个空格符的情况,最后都按统一格式输出。脚本没用大数据文本测试过,具体效率未知~
  1. #! /usr/bin/perl
  2. use strict;
  3. my (%hash,$str,$key);
  4. open FILE,"<newword.txt" or die $!;
  5. while (<FILE>) {
  6.     chomp;
  7.     $hash{$_}=1;
  8. }

  9. open FILE,"<phonetic.txt" or die $!;
  10. while (<FILE>) {
  11.     chomp;
  12.     /(\w+)/;
  13.     $key=$1;
  14.     if (defined $hash{$key}){
  15.         s/\s+/ /g;#把输出间隔统一为一个空格
  16.         $hash{$key}=$_;
  17.     }
  18. }

  19. for my $file (glob "../*.txt") {
  20.     open FILE,"<$file" or die $!;
  21.     $str = "";
  22.     $file =~ s/.*\///;
  23.     while (<FILE>) {
  24.         $str .= $_;
  25.     }
  26.     $str =~ s/\s+/ /g;#把输出间隔统一为一个空格
  27.     $str =~ s/^\s+//;
  28.     for (keys %hash) {
  29.         while ($str =~ /([^.?!]*[.?!]?[^.?!]*)\b$_\b([^.?!]*[.?!]?[^.?!]*[.?!])/g) {
  30.             print "$hash{$_}\.$1\[ $_ \]$2 \#$file\n";
  31.         }
  32.     }
  33. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2014-01-06 21:48 |只看该作者
回复 4# huzikan

   thanks

  1. 我有30M的txt,几个小时,程序结束不了。出了300K结果
  2.   300K结果里,关键词是 [  ], 行首也没有关键词。所以不知道它匹配的对不对。

我想用perl处理30M文件,可能速度上确实有困难。maybe需要先把txt放入数据库。


  不知道perl在数据比对时为啥这么慢.
   

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
6 [报告]
发表于 2014-01-08 11:20 |只看该作者
几个问题:
1. 如果newword.txt    里的生词在phonetic.txt  或者xyz目录里找不到,如何输出?
2. newword.txt 里有很多生词是词组,带空格的, phonetic.txt里的都是单词,这些如何处理?

论坛徽章:
0
7 [报告]
发表于 2014-01-08 14:54 |只看该作者
本帖最后由 blackantt 于 2014-01-08 14:55 编辑

回复 6# rdcwayx

1. 如果newword.txt    里的生词在phonetic.txt  或者xyz目录里找不到,如何输出?
   
  答:  (希望)如果newword.txt里的词在其它的地方找不到,也在结果里占1行。(就把生词放在行首即可)

2. newword.txt 里有很多生词是词组,带空格的, phonetic.txt里的都是单词,这些如何处理?

   答:  (希望)生词放在行首,中间空出phonetic.txt的位置放上定界符方便必要时在excel里分列,后面接内容。

   最终希望形成以下结果,用来助记单词

apple /æpl/  [syn] pear fruit [ayn] animal  . I am the second.I have an [ apple ].Do you want to eat? #a.txt
apple /æpl/  [syn] pear fruit [ayn] animal . Do you want to eat?I am the fourth [ apple ].I am the fifth.  #a.txt
app11
get on           //                                         a car is coming.[ get on ] quickly.In a hurry.  #b.txt


  如果某些方面处理有困难,或者效率上有困难,也可以修改原文件,也可以自由编写,例如上面的2个问题完全可以自由处理(只是助记单词用,不能细就粗点也行,只要能出类似结果)。  比如 只取关键句的上1句及关键句。

  再次谢谢
  


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP