0

現在、入力ファイルからすべての n-gram を抽出する awk スクリプトに取り組んでいます。ファイルで awk スクリプトを実行すると、すべての n-gram (ソート済み) が出力され、横に出現回数が表示されます。入力ファイルでテストすると、n-gram の正しい順序が出力されます。発生数だけが正しくありません。nグラムを抽出するために、次のコードがあります。

$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 に変換しましたか? 私は2セットのフィギュアを手に入れました:

==> 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 に答える