我目前正在开发一个awk脚本,它可以从输入文件中提取所有的n-gram。当对一个文件运行awk脚本时,它会打印出每个n元语法(排序后)以及它旁边出现的次数。在对输入文件进行测试时,它会打印出n元语法的正确顺序。只有出现的次数不正确。为了提取n-gram,我有以下代码:
$1=$1
line=tolower($0)
split(line,chars,"")
begin_len=0
for (i in chars){
ngram=""
for (ind=0;ind<n;ind++){
ngram=ngram""chars[i+ind]
}
if(begin_len == 0){
begin_len=length(ngram)
}
if(length(ngram) == begin_len){
counter+=1
freq_tabel[ngram]+=1
}
}(未包含排序功能)我想知道代码中是否有错误。还是有一些我忽略了的方面?
我应该得到的输出如下:
35383
1580 n
1323 en
1081 e
940 de
839 v
780 er
716 d
713 an
615 t 相反,我有以下输出:
34845
1561 n
1302 en
1067 e
930 de
827 v
772 er
711 d
703 an
609 t如你所见,n-gram是正确的,但出现的次数不正确。
输入文件:http://cl.ly/202j3r0B1342
发布于 2013-03-18 05:42:50
没有答案,但可能会对你有所帮助(假设是n=2)。
您是否碰巧将原始文件(看起来像是UTF-8)转换成了拉丁文-1?我得到了两组数据:
==> sorted.latin1_in_utf8_locale <==
1566 n
1308 en
1072 e
929 de
836 v
==> sorted.utf8_in_utf8_locale <==
1579 n
1320 en
1080 e
940 de
838 v使用拉丁语-1输入,数字与您的更接近。将utf-8转换为预期的值。
然而,两者都不匹配。抓我的头。
顺便说一句,我不是对脚本中的ngram进行排序,而是以适合将它们输出到sort -rn的形式输出。但我想,这应该不会造成不同。
for (ngram in freq_tabel)
printf "%7i %s\n", freq_tabel[ngram], ngram发布于 2013-03-17 18:46:53
我在你的班上,所以这里有几个提示:
另外,上面的$1 = $1的意义是什么?
https://stackoverflow.com/questions/15455691
复制相似问题