LoginSignup
2
3

More than 3 years have passed since last update.

言語処理100本ノック-36(pandas使用):単語の出現頻度

Posted at

言語処理100本ノック 2015「第4章: 形態素解析」36本目「単語の出現頻度」記録です。
今回は出現回数カウントとソートというpandasが得意とする内容なので、超簡単です。

参考リンク

リンク 備考
036.単語の出現頻度.ipynb 回答プログラムのGitHubリンク
素人の言語処理100本ノック:36 多くのソース部分のコピペ元
MeCab公式 最初に見ておくMeCabのページ

環境

種類 バージョン 内容
OS Ubuntu18.04.01 LTS 仮想で動かしています
pyenv 1.2.16 複数Python環境を使うことがあるのでpyenv使っています
Python 3.8.1 pyenv上でpython3.8.1を使っています
パッケージはvenvを使って管理しています
Mecab 0.996-5 apt-getでインストール

上記環境で、以下のPython追加パッケージを使っています。通常のpipでインストールするだけです。

種類 バージョン
pandas 1.0.1

第4章: 形態素解析

学習内容

夏目漱石の小説『吾輩は猫である』に形態素解析器MeCabを適用し,小説中の単語の統計を求めます.

形態素解析, MeCab, 品詞, 出現頻度, Zipfの法則, matplotlib, Gnuplot

ノック内容

夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をMeCabを使って形態素解析し,その結果をneko.txt.mecabというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ.

なお,問題37, 38, 39はmatplotlibもしくはGnuplotを用いるとよい.

36. 単語の出現頻度

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

回答

回答プログラム 036.単語の出現頻度.ipynb

import pandas as pd

def read_text():
    # 0:表層形(surface)
    # 1:品詞(pos)
    # 2:品詞細分類1(pos1)
    # 7:基本形(base)
    df = pd.read_table('./neko.txt.mecab', sep='\t|,', header=None, 
                       usecols=[0, 1, 2, 7], names=['surface', 'pos', 'pos1', 'base'], 
                       skiprows=4, skipfooter=1 ,engine='python')
    return df[(df['pos'] != '空白') & (df['surface'] != 'EOS') & (df['pos'] != '記号')]

df = read_text()

df['surface'].value_counts()[:30]

# 助詞と助動詞を除外
df[~df['pos'].str.startswith('助')]['surface'].value_counts()[:30]

回答解説

出現頻度カウントとソート

ノック19本目「各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる」で使ったvalue_countsで重複削除とソートをします。デフォルトで降順ソートをしてくれるのが便利ですね。

df['surface'].value_counts()[:30]

助詞と助動詞を除外は、条件を加えているだけです。「助」から始まる品詞は助詞と助動詞くらいだろう、ということでstr.startswithの否定条件にしました。

# 助詞と助動詞を除外
df[~df['pos'].str.startswith('助')]['surface'].value_counts()[:30]

出力結果(実行結果)

プログラム実行すると以下の結果が出力されます。
全対象の上位30件です。当然ではありますが、助詞と助動詞ばっかりで内容の類推ができないです。

出力結果(全対象)
の     9109
て     6697
は     6384
に     6147
を     6068
と     5476
が     5259
た     3916
で     3774
も     2433
だ     2272
し     2264
ない    2254
から    2001
ある    1705
な     1579
か     1446
ん     1416
いる    1249
事     1177
へ     1033
する     986
です     974
もの     971
君      955
云う     937
主人     928
う      922
よう     687
ね      673
Name: surface, dtype: int64

助詞と助動詞を出力対象外にしました。すべてを対象にするより、だいぶ「吾輩は猫である」の類推がしやすいです。

出力結果(助詞と助動詞を除外)
し     2201
の     1597
いる    1249
事     1177
する     986
もの     971
君      955
云う     937
主人     928
ある     723
ない     708
よう     687
ん      667
この     635
御      598
その     560
何      518
吾輩     477
人      449
そう     448
い      443
なる     410
なっ     403
これ     397
それ     370
来      367
見      349
迷亭     343
れ      327
時      316
Name: surface, dtype: int64
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3