0

我目前正在研究一个从输入文件中提取所有 n-gram 的 awk 脚本。在文件上运行我的 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 是正确的,但出现次数不正确。

输入文件:http ://cl.ly/202j3r0B1342

4

2 回答 2

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 到预期的。

但是,两者都不匹配。抓着我的头。

顺便说一句,我没有对脚本中的 ngram 进行排序,而是以适合将它们管道传输到sort -rn. 但这不应该引起差异,我猜。

for (ngram in freq_tabel)
    printf "%7i %s\n", freq_tabel[ngram], ngram
于 2013-03-17T21:42:49.577 回答
0

我在你的班,所以这里有一些提示:

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

另外,上面的 $1 = $1 有什么意义?

于 2013-03-17T10:46:52.613 回答