我目前正在开发一个awk脚本,它从输入文件中提取所有n-gram。 在文件上运行我的awk脚本时,它会打印出每个n-gram(已排序)并显示其旁边的出现次数。 在输入文件上进行测试时,会打印出正确的n-gram顺序。只有出现次数不正确。 为了提取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是正确的,但出现次数不是。
INPUT FILE:http://cl.ly/202j3r0B1342
答案 0 :(得分:1)
不是答案,但可以帮助你(假设n = 2)。
您是否碰巧将原始文件(似乎是UTF-8)转换为latin-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
使用latin-1输入数字更接近你的数字。用utf-8到预期的那些。
然而,两者都不匹配。抓我的头。
BTW,我没有在脚本中对ngrams进行排序,而是以适合将它们传递给sort -rn
的形式输出。但我想这不应该造成差异。
for (ngram in freq_tabel)
printf "%7i %s\n", freq_tabel[ngram], ngram
答案 1 :(得分:0)
我在你的课堂上,所以这里有几个提示:
此外,$ 1 = $ 1的重点是什么?