awk n-gram提取不正确

时间:2013-03-16 22:54:56

标签: awk extraction

我目前正在开发一个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

2 个答案:

答案 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)

我在你的课堂上,所以这里有几个提示:

  • 复制确切的输入文件(使用克隆来自github,不要做原始副本)
  • 重新阅读作业,你应该摆脱前导和尾随空格,并用一个空格替换所有多个标签/空格。

此外,$ 1 = $ 1的重点是什么?