uaa@emeraude:~$ cat ja.txt | ./nwc-toolkit/build/nwc-toolkit-unicode-normalizer |./nwc-toolkit/build/nwc-toolkit-text-filter > ja.txt.1
こんなんでどうかなー
nwc-toolkit-text-filterは必須だな。句点までを一文と認識して区切ってくれる。これで正しく<BOS><EOS>として処理ができるようになる。
20分で全体の1/5くらいが処理された感じか…?
ジョブを仕掛けて寝ちゃいたいし、無駄にディスクを消費したくないことを考えると…
uaa@emeraude:~$ time cat ja.txt | ./nwc-toolkit/build/nwc-toolkit-unicode-normalizer |./nwc-toolkit/build/nwc-toolkit-text-filter |mecab -Owakati > ja.txt.1
とでもしとこうかね。
uaa@emeraude:~$ !1989
time cat ja.txt | ./nwc-toolkit/build/nwc-toolkit-unicode-normalizer |./nwc-toolkit/build/nwc-toolkit-text-filter |mecab -Owakati > ja.txt.1
output: (standard output)
input: (standard input)
output: (standard output)
input: (standard input)
74360361986 / 74359156435 (15614sec)
74359156435 / 70019552893 (15614sec)
real 260m15.239s
user 257m11.925s
sys 17m23.622s
uaa@emeraude:~$
uaa@emeraude:~$ time nwc-toolkit/build/nwc-toolkit-ngram-counter -n 3 -l 24576 ja.txt.1
input: ja.txt.1
sentences: 592537734, tokens: 13797626505 (x23.29) (8105sec)
output: ngms-20230930-031634.0000.gz
real 167m6.627s
user 163m18.095s
sys 0m39.184s
uaa@emeraude:~$
あとはngram-mergerで3-gramの結果を得れば良い訳か。問題は出現頻度の値をどう設定するか、だよなあ。
1-gram(単語)ではなく3-gramでの出現頻度で判断しているけど、出現頻度の一番大きい数が200617497なので、今作った3-gramではこれがどうなるかを調べることかなあ。
ngram-counterの-sオプションは必須なのかなあ。これ1-gram, 2-gram, 3-gramを全部まとめて出すので後で分離しないといけないんだけど…
3-gramだけ取れれば良いからzcat a.gz |awk '$4 {printf("%s %s %s\t%s\n",$1,$2,$3,$4)}'で。
ソートは要らないかなあ…?どうせ読みを付加した時に付加するツール側でソートかけてるし。
出現頻度1000で切ってみて、異なり数を数えてみると1097868、日本語ウェブコーパス2010の形態素N-gram(3-gram)だと6395754…1/6くらいのサイズしかないか。CC100-jaが75GB、nwc2010が396GBのテキストでやっているので、入力量に比例していると言っても良いのかも。
日本語ウェブコーパス2010で頻度750以上の異なり数が8377628…これを満たす頻度を目指してみれば良いのかな
頻度1以上 707235917
頻度10以上 56327440
頻度25以上 26442415
頻度50以上 14955969
頻度75以上 10679502
頻度100以上8390195
頻度1000以上 1097868
log(75)=1.875, log(395)=2.597、雑に計算して10倍程度の違いがあるから、頻度もそれくらいの違いで考えれば良いってことかなあ