LoginSignup
2
2

More than 3 years have passed since last update.

言語処理100本ノック-31(pandas使用):動詞

Last updated at Posted at 2020-02-20

言語処理100本ノック 2015「第4章: 形態素解析」31本目「動詞」記録です。
pandas使っているので1文で処理でき、拍子抜けするほど簡単です。

参考リンク

リンク 備考
031.動詞.ipynb 回答プログラムのGitHubリンク
素人の言語処理100本ノック:31 多くのソース部分のコピペ元
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を用いるとよい.

31. 動詞

動詞の表層形をすべて抽出せよ.

回答

回答プログラム 031.動詞.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[df['pos'] == '動詞']['surface']

回答解説

DataFrameの余分な行削除

ファイルから読み込んだ余分な行を削除しています。技術的には「削除」というより必要な行のみを抽出しています。
df['pos'] != '空白'は本来pos1(品詞細分類1)に対して指定すべきなのですが、前回解説したとおり空白は1列ずれてしまっていて、仕方なくpos(品詞)に対して条件指定しています。

df[(df['pos'] != '空白') & (df['surface'] != 'EOS') & (df['pos'] != '記号')]

余分な行を削除した結果、print(df.info())でDataFrameの情報は以下の通りになります。

Int64Index: 180417 entries, 0 to 212550
Data columns (total 4 columns):
 #   Column   Non-Null Count   Dtype 
---  ------   --------------   ----- 
 0   surface  180417 non-null  object
 1   pos      180417 non-null  object
 2   pos1     180417 non-null  object
 3   base     180417 non-null  object
dtypes: object(4)
memory usage: 6.9+ MB

そして、DataFrameの先頭と末尾5行。
image.png

動詞の表層形抽出

「動詞」の「表層形」を抽出している部分です。

df[df['pos'] == '動詞']['surface']

出力結果(実行結果)

プログラム実行すると以下の結果が出力されます。

出力結果
13        生れ
19        つか
31        泣い
37         し
39        いる
          ..
212527    死ん
212532    得る
212537    死な
212540     得
212541    られ
Name: surface, Length: 28119, dtype: object
2
2
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
2