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