SHOT4

社会人大学院生の勉強記録

35. 単語の出現頻度

問題文

文章中に出現する単語とその出現頻度を求め,出現頻度の高い順に並べよ.
nlp100.github.io

ソースコード

# MeCabのインポート
import MeCab
m = MeCab.Tagger('-Ochasen')

# ファイル名の指定
filename = 'neko.txt.mecab'

# ファイルの読み込みfilename = "neko.txt.mecab"
with open(filename,mode='rt',encoding='utf-8') as f:
    blockList = f.read().split('EOS\n') # 文章ごとに分割

# 空白行を削除する
blockList = list(filter(lambda x: x!='', blockList)) 

# 単語リストの作成
res = []
for block in blockList:
    for line in block.split("\n"):
        if line == "":
            continue
        surface = line.split("\t")[0]
        attr = line.split("\t")[1].split(",")
        lineDict = {
            'surface': surface,
            'base': attr[6],
            'pos': attr[0],
            'pos1': attr[1]
        }
        res.append(lineDict)

# 出現頻度の算出
ans = {}
for r in res:
    key = r['base']
    if key in ans:
        value = ans[key]
        ans[key] = value + 1
    else:
        ans[key] = 1

# 出現頻度の高い順に並び替え
ans = sorted(ans.items(), key = lambda x:x[1], reverse=True)

# 答えの出力
print("出現頻度の高い順に40位まで出力")
print(ans[:40])

出力

出現頻度の高い順に40位まで出力
[('の', 9194), ('。', 7486), ('て', 6848), ('、', 6772), ('は', 6420), ('に', 6243), ('を', 6071), ('だ', 5975), ('と', 5508), ('が', 5337), ('た', 4267), ('する', 3657), ('「', 3231), ('」', 3225), ('ない', 3052), ('も', 2479), ('ある', 2320), ('*', 2191), ('で', 2081), ('から', 2031), ('いる', 1777), ('ん', 1568), ('か', 1529), ('云う', 1408), ('事', 1207), ('です', 1164), ('ます', 1146), ('なる', 1120), ('へ', 1034), ('う', 987), ('もの', 981), ('君', 973), ('主人', 932), ('ぬ', 719), ('よう', 696), ('見る', 675), ('ね', 657), ('この', 649), ('御', 636), ('ば', 617)]

所感

まず単語リストの作成でかなり手こずり、いつも参考にさせていただいているupuraさんのブログから処理を作成する。次に出力してみるも、結果が授業スライドと異なり困惑する。

結論、「surface」を使うか「base」を使うかで結果が変わるのが原因と発覚。今回は単語の出現頻度が知りたいので、活用によって形が変わってしまうsurfaceではなく、baseを利用することで解決した。

また1行で並び替えができるsorted(list.items(),key = lambda x:x[1]. reverse=True)は今後頻出することになる。