毎日テキストマイニング

180日間、毎日テキストマイニングをするブログです

2018/6/27【5日目】形態素解析で品詞の種類によって出力を分ける方法

昨日の分析結果ですと、どうしても名詞が目立ってしまいますので、面白くないですね。今日は今まで取得したテキストを使って、それぞれの品詞でどのような言葉が使われているのかを調べてみたいと思います。

MeCabTaggerのオプションを変更する

今まで何も考えずにMeCabに(“-Owakati”)を指定していましたが、これを変更することによって品詞情報を得られるようですね。

Taggerのオプションには次のものがあるらしいです。

  • 'mecabrc' : MeCabの標準出力
  • '-Ochasen' : ChaSen形式
  • '-Owakati' : 分かち書きで出力
  • '-Oyomi' : テキストの読みを出力

mecabrcの場合

tagger = MeCab.Tagger('mecabrc')

出力結果

.    名詞,サ変接続,*,*,*,*,*
今年  名詞,副詞可能,*,*,*,*,今年,コトシ,コトシ
も 助詞,係助詞,*,*,*,*,も,モ,モ
かき氷   名詞,一般,*,*,*,*,かき氷,カキゴオリ,カキゴオリ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
季節  名詞,一般,*,*,*,*,季節,キセツ,キセツ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
やってき    動詞,自立,*,*,カ変・クル,連用形,やってくる,ヤッテキ,ヤッテキ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
〜 記号,一般,*,*,*,*,〜,〜,〜
😊🍧    記号,一般,*,*,*,*,*
(以下、略)

Ochasenの場合

tagger = MeCab.Tagger('-Ochasen')

出力結果

.    .   .   名詞-サ変接続     
今年  コトシ   今年  名詞-副詞可能     
も モ も 助詞-係助詞        
かき氷   カキゴオリ かき氷   名詞-一般       
の ノ の 助詞-連体化        
季節  キセツ   季節  名詞-一般       
が ガ が 助詞-格助詞-一般     
やってき    ヤッテキ    やってくる 動詞-自立   カ変・クル 連用形
た タ た 助動詞   特殊・タ    基本形
〜 〜 〜 記号-一般       
😊🍧    😊🍧    😊🍧    記号-一般   

Oyomiの場合

tagger = MeCab.Tagger('-Oyomi')

出力結果

. コトシ モ カキゴオリ ノ キセツ ガ ヤッテキ  タ 〜 😊🍧 . ミヤザキ ケン [ リン ' Z ] トイウ キッサテン ☕ ️ プリンセス ピーチ トイウ ネーミング モ カワイ スギル ♡ 🍑 . # カキゴオリ -------- コンヤ テレ ヒガシ 18 : 55 〜 ! 📺 アリエ ヘン ∞ セカイ 2 ジカン SP 📺 # テレ ヒガシ オンガク サイ ガッタイ コラボ キカク 🎤 VTR デ シュツエン シ  ! ミ テ ネ 〜 ☺ ️💕 -------- 21 ジハン カラ showroom ヤリ  ! オ ヒマ ダッ タラ ゼヒ 🙂🙂💕 -------- ファン ノ ミナサン カラ 、 オ ハナ ヲ イタダキ  タ … 💐💗 ホントウニ アリガトウ ゴザイ  ( ; _ ; ) -------- # ムラヤマ チーム 4 # チーム 4 コウエン アリガトウ ゴザイ  タ 😊💛

ある品詞だけを取得する

品詞の種類を指定しないといけないのですが、tagger = MeCab.Tagger('mecabrc’)で出力すると、次の通りに出力されるらしいです。

表層形\t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音

実際に出力されているものを見るとその通りになっていますね。

今年   名詞,副詞可能,*,*,*,*,今年,コトシ,コトシ

なので、このTabの後の[0]が”名詞”だとか”動詞”だとかを指定すれば取得したい品詞が得られそうですね。

実践

まずは単純にfor文で1行1行回してみます。

for hinshis in mecab:
     print(hinshis)

実行結果

.
    
名
詞
,
サ
変
接
続
,
*
,
*
,
*
,
*
,
*


今
年
    
名
詞
,
副
詞
可
能
,
*
,
*
,
*
,
*
,

あれ、思ったよりもテキストが分解されてますね。 for文で回す前に、リストにして1行1行を区切った方が良さそうですね。splitlines()メソッドで区切り文字に改行文字(\n)を指定すればできるようです。

import sys
import MeCab

tagger = MeCab.Tagger('')
# MeCab.Tagger ("-Owakati")

text = open('kaiseki.txt', 'r')
# 改行をなくす
kaisekiyou = text.read().split('¥n')
string = ' '.join(kaisekiyou)
mecab = tagger.parse(string)

#.splitlines()だけで改行を表せる
kaigyou = mecab.splitlines()
print(kaigyou)

実行結果。

['.\t名詞,サ変接続,*,*,*,*,*', '今年\t名詞,副詞可能,*,*,*,*,今年,コトシ,コトシ', 'も\t助詞,係助詞,*,*,*,*,も,モ
(以下略)

あ、いい感じにリストで区切られてそうですね。 再びfor文で回していきます。以下、再びコード全文です。

import sys
import MeCab

tagger = MeCab.Tagger('')
# MeCab.Tagger ("-Owakati")

text = open('kaiseki.txt', 'r')
# 改行をなくす
kaisekiyou = text.read().split('¥n')
string = ' '.join(kaisekiyou)
mecab = tagger.parse(string)

kaigyou = mecab.splitlines()

for hinshis in kaigyou:
    tab = hinshis.split('\t')
        syurui = tab[1]
        print(syurui)

実行結果。

  File "hinsi.py", line 17, in <module>
    syurui = tab[1]
IndexError: list index out of range

エラーが起きますね。指定しているのがリストの長さ以外とのこと。len関数で長さを確認してみます。

for hinshis in kaigyou:
    tab = hinshis.split('\t')
    print (len(hinshis))

実行結果

(中略)
19
22
30
26
19
29
29
26
3

この極端に小さな3という数がエラーの源ぽいですね。 if文を追加して、この3の長さのものを取り除いてみます。

for hinshis in kaigyou:
    tab = hinshis.split('\t')
    #3以上を指定しないとエラーになる。
    if len(hinshis) >= 4:
        syurui = tab[1]
        print(syurui)

実行結果

名詞,サ変接続,*,*,*,*,*
名詞,副詞可能,*,*,*,*,今年,コトシ,コトシ
助詞,係助詞,*,*,*,*,も,モ,モ
名詞,一般,*,*,*,*,かき氷,カキゴオリ,カキゴオリ
助詞,連体化,*,*,*,*,の,ノ,ノ
名詞,一般,*,*,*,*,季節,キセツ,キセツ
助詞,格助詞,一般,*,*,*,が,ガ,ガ
動詞,自立,*,*,カ変・クル,連用形,やってくる,ヤッテキ,ヤッテキ
助動詞,*,*,*,特殊・タ,基本形,た,タ,
(中略)

おぉ、いい感じにできていますね。リストで無くなっていますが、これを再びリストにして","で区切って、[0]番目にくる文字を[0] == ”動詞”というように比較して、前から7番目を取得すれば良さそうですね。

for hinshis in kaigyou:
     tab = hinshis.split('\t')
     if len(hinshis) >= 4:
         syurui = tab[1].split(",")
         if syurui[0] =="動詞":
             print(syurui[6])

実行結果

やってくる
すぎる
ありえる
する
みる
やる
頂く
たつ
書く
下さる
ある
頑張る
(以下、中略)

動詞だけを取得できました。

深夜3時になってしましましたので、AKBメンバーによる呟きは明日分析してみます。

今日の結果

AKBメンバーによる呟きは57件でした。いつもより多いですね。 User Localにテキストを投げたところ頻出単語は下記の通りでした。

  • 名詞,テレ東音楽祭,23
  • 名詞,出演,10
  • 名詞,チョコミント,8
  • 名詞,ありがとう,7
  • 名詞,AKB48,7
  • 名詞,今日,7
  • 名詞,作戦,6

今日勉強したこと

  • MeCab.Taggerのオプション
  • .splitlines()の使い方
  • .split('\t')、.split(“,”)での区切りかた
  • len関数で長さを調べる
  • 品詞の種類で出力を分ける方法