oryou-sanのブログ

備忘録です

MeCabで分かち書き

はじめに

MeCabというライブラリを使って日本語の分かち書きをしてみます。


まずは使ってみる

出力はこんな感じになります。

s = 'おいしいパスタつくったお前'

import MeCab
mecab = MeCab.Tagger("-Ochasen")

print(mecab.parse(s))

# おいしい	オイシイ	おいしい	形容詞-自立	形容詞・イ段	基本形
# パスタ	パスタ	パスタ	名詞-一般		
# つくっ	ツクッ	つくる	動詞-自立	五段・ラ行	連用タ接続
# た	タ	た	助動詞	特殊・タ	基本形
# お前	オマエ	お前	名詞-代名詞-一般		
# EOS

出力は単語毎に'\n'(改行)で区切られ、文末には'EOS'が付されます。
各単語は原型・読み・品詞 などの情報が付加され、'\t'(タブ)で区切られています。


分かち書きの結果を出力

次に、品詞の情報などを取り除いて単純に分かち書きの結果を出力してみます。

wakachi = mecab.parse(s).split('\n')
wakachi = [w.split('\t') for w in wakachi if len(w.split('\t')) > 1]

wakachi_surface = [w[0] for w in wakachi]
wakachi_surface = ' '.join(wakachi_surface)
    
print(wakachi_surface)

# おいしい パスタ つくっ た お前

これを関数にして、複数文をforでとりこんでみます。

def wakachigaki(s):
    wakachi = mecab.parse(s).split('\n')
    wakachi = [w.split('\t') for w in wakachi if len(w.split('\t')) > 1]
    wakachi_surface = [w[0] for w in wakachi]
    wakachi_surface = ' '.join(wakachi_surface)
    return wakachi_surface

s1 = 'おいしいパスタつくったお前'
s2 = 'あなたを詐欺罪と器物損壊罪で訴えます'
s3 = 'その点トッポってすげぇよな'

data =[s1,s2,s3]

for s in data:
    print(wakachigaki(s))

# おいしい パスタ つくっ た お前
# あなた を 詐欺 罪 と 器物 損壊 罪 で 訴え ます
# その 点 トッポ って すげ ぇよな


分かち書きの結果を出力(応用編)

このままでも機械学習にかける前処理としては充分かもしれませんが、一工夫して以下の処理を加えてみます。

・活用が存在する品詞(形容詞、動詞)はその原型を出力とする
・出力は名詞・動詞・形容詞に絞る

def wakachigaki_bow(s):
    wakachi = mecab.parse(s).split('\n')
    wakachi = [w.split('\t') for w in wakachi if len(w.split('\t')) > 1]
    wakachi = list(filter(lambda x: x[3][:2] == '名詞'
                      or x[3][:2] == '動詞' 
                      or x[3][:3] == '形容詞', wakachi))

    wakachi_base = [w[2] for w in wakachi]
    wakachi_base = ' '.join(wakachi_base)
    return wakachi_base

for s in data:
    print(wakachigaki_bow(s))

# おいしい パスタ つくる お前
# あなた 詐欺 罪 器物 損壊 罪 訴える
# 点 トッポ すげる ぇよな