Wordle(6)からの続き
wiki-5.txtは,WIkipediaデータセットのWikiText-103 word から5文字単語を取り出したものだった。これに対して,n-gramの出現頻度を,1-gram, 2-gram, 3-gramに対して求めるpythonプログラム ngrm.py を作る。1-gramはアルファベット1文字,2-gramは連続するアルファベット2文字,3-gramは連続するアルファベット3文字を表している。ngrm.pyの出力結果は , を区切り文字として,出現回数とn-gramパターンの組なので,sort で区切り文字を , 数値として解釈した逆順をリダイレクトして適当なファイルに格納すると,1-gramから3-gramまで混ぜた出現頻度順のファイルが出来上がる。
# usage: ngrm.py wiki-5.txt | sort -n -r -t , >! alphabet
import sys
a=[0 for i in range(26)]
b=[[0 for i in range(26)] for j in range(26)]
c=[[[0 for i in range(26)] for j in range(26)] for k in range(26)]
def n_gram(target, n):
return [ target[idx:idx + n] for idx in range(len(target) -n + 1) ]
f = open(sys.argv[1], 'r')
datalist = f.readlines()
for data in datalist:
for l in range(5):
x = data[l]
i = ord(x) - 97
a[i] = a[i] + 1
if l in range(4):
y = data[l+1]
j = ord(y) - 97
b[i][j] = b[i][j] + 1
if l in range(3):
z = data[l+2]
k = ord(z) -97
c[i][j][k] = c[i][j][k] + 1
for i in range(26):
if a[i] > 49:
print(a[i],",",chr(i + 97))
for l in range(26*26):
i = l // 26
j = l % 26
if b[i][j] > 49:
print(b[i][j],",",chr(i+97)+chr(j+97))
for l in range(26*26*26):
i = l // (26*26)
j = (l // 26) % 26
k = l % 26
if c[i][j][k] > 49:
print(c[i][j][k],",",chr(i+97)+chr(j+97)+chr(k+97))
f.close()
wiki-5.txtにおけるベスト50は次のとおりであった(数字は出現数)。
5730707 , e
4092848 , r
3965317 , a
3759319 , t
3424032 , s
3108801 , o
3068296 , i
2603632 , h
2600893 , l
2398537 , n
1734820 , d
1574948 , c
1501211 , u
1291809 , w
1195832 , m
1086248 , g
1076779 , er
964115 , f
962898 , th
882193 , b
801081 , p
746024 , te
729576 , y
674447 , he
651813 , ou
636278 , st
604734 , ar
563176 , hi
559096 , re
556926 , v
556020 , or
533535 , in
521374 , k
521197 , es
519713 , ch
518219 , ir
514744 , al
514410 , wh
493762 , the
473288 , ea
427832 , le
417701 , ic
412433 , whi
412193 , an
409812 , il
384013 , la
372098 , at
369592 , se
364056 , ed
362684 , ter
0 件のコメント:
コメントを投稿