[[ノート/テキストマイニング]]~

訪問者数 &counter();      最終更新 &lastmod();~

**Twitter APIから得たツイートを形態素解析する --- 2012/03/01 [#n7875ede]

形態素解析プログラムの候補はいろいろあるが、ChasenとMeCabを試してみよう

***Chasenでの解析例 [#b81288d6]

 # -*- coding: utf-8 -*-
 import sys
 import codecs
 import re
 import pycha
 import twitter
 #
 def hasKanji(s):
   #Returns True if string s contains a Kanji, False if not.
   kanji = False
   for c in s:
    if (((ord(c)&0xff00) == 0x3000) or (0x4e00 <= ((ord(c)&0xff00) <=0x9f00))):
      kanji = True
      break
   return kanji
 #
 r = re.compile(r'([^-]+)-*')
 api = twitter.Api()
 timeline = api.GetPublicTimeline()
 words = []
 for s in timeline:
   t = s.text
   if hasKanji(t):
     print "Source> ", t
 
     out = pycha.pycha(t)
     sonota1 = ''
     sonota2 = ''
     for go in out:
       gokan = go[0]
       if len(go)>=2:
         yomi = go[1]
       if len(go)>=3:

実行結果は、
 Source>  《殺戮の羅刹デス・クルーザー》 奴に仲間は居ない。それ故に一般的には同士討ちなどの躊躇いが生じる時でも遠慮せずに戦える。
 惑わされる物がない、それこそ理想的な最強の証であろう。最凶と呼ばれた覚醒者も所詮仲間に頼る存在でしかないのだ。
 gokan:  《 yomi:  《 hinshi:  記号
 gokan:  殺戮 yomi:  サツリク hinshi:  名詞
 gokan:  の yomi:  ノ hinshi:  助詞
 gokan:  羅刹 yomi:  ラセツ hinshi:  名詞
 gokan:  デ yomi:  デ hinshi:  助詞
 gokan:  ス yomi:  ス hinshi:  動詞
 gokan:  ・ yomi:  ・ hinshi:  記号
 gokan:  クルーザー yomi:  クルーザー hinshi:  名詞
 gokan:  》 yomi:  》 hinshi:  記号
 gokan:    yomi:    hinshi:  記号
 gokan:  奴 yomi:  ヤツ hinshi:  名詞
 gokan:  に yomi:  ニ hinshi:  助詞
 gokan:  仲間 yomi:  ナカマ hinshi:  名詞
 gokan:  は yomi:  ハ hinshi:  助詞
 gokan:  居 yomi:  イ hinshi:  動詞
 gokan:  ない yomi:  ナイ hinshi:  助動隧
 gokan:  。 yomi:  。 hinshi:  記号
 gokan:  それ yomi:  ソレ hinshi:  名詞
 gokan:  故 yomi:  ユエ hinshi:  名詞
 gokan:  に yomi:  ニ hinshi:  助詞
 gokan:  一般 yomi:  イッパン hinshi:  名詞
 gokan:  的 yomi:  テキ hinshi:  名詞
 gokan:  に yomi:  ニ hinshi:  助詞
 gokan:  は yomi:  ハ hinshi:  助詞
 gokan:  同士 yomi:  ドウシ hinshi:  名詞
 gokan:  討ち yomi:  ウチ hinshi:  動詞
 gokan:  など yomi:  ナド hinshi:  助詞
 gokan:  の yomi:  ノ hinshi:  助詞
 gokan:  躊躇い yomi:  タメライ hinshi:  動詞
 gokan:  が yomi:  ガ hinshi:  助詞
 gokan:  生じる yomi:  ショウジル hinshi:  動詞
 gokan:  時 yomi:  トキ hinshi:  名詞
 gokan:  でも yomi:  デモ hinshi:  助詞
 gokan:  遠慮 yomi:  エンリョ hinshi:  名詞
 gokan:  せ yomi:  セ hinshi:  動詞
 gokan:  ず yomi:  ズ hinshi:  助動隧
 gokan:  に yomi:  ニ hinshi:  助詞
 gokan:  戦える yomi:  タタカエル hinshi:  動詞
 gokan:  。 yomi:  。 hinshi:  記号
 gokan:  惑わさ yomi:  マドワサ hinshi:  動詞
 gokan:  れる yomi:  レル hinshi:  動詞
 gokan:  物 yomi:  モノ hinshi:  名詞
 gokan:  が yomi:  ガ hinshi:  助詞
 gokan:  ない yomi:  ナイ hinshi:  形容詞
 gokan:  、 yomi:  、 hinshi:  記号
 gokan:  それ yomi:  ソレ hinshi:  名詞
 gokan:  こそ yomi:  コソ hinshi:  助詞
 gokan:  理想 yomi:  リソウ hinshi:  名詞
 gokan:  的 yomi:  テキ hinshi:  名詞
 gokan:  な yomi:  ナ hinshi:  助動隧
 gokan:  最強 yomi:  サイキョウ hinshi:  名詞
 gokan:  の yomi:  ノ hinshi:  助詞
 gokan:  証 yomi:  アカシ hinshi:  名詞
 gokan:  で yomi:  デ hinshi:  助動隧
 gokan:  あろ yomi:  アロ hinshi:  助動隧
 gokan:  う yomi:  ウ hinshi:  助動隧
 gokan:  。 yomi:  。 hinshi:  記号
 gokan:  最 yomi:  サイ hinshi:  接頭詞
 gokan:  凶 yomi:  キョウ hinshi:  名詞
 gokan:  と yomi:  ト hinshi:  助詞
 gokan:  呼ば yomi:  ヨバ hinshi:  動詞
 gokan:  れ yomi:  レ hinshi:  動詞
 gokan:  た yomi:  タ hinshi:  助動隧
 gokan:  覚醒 yomi:  カクセイ hinshi:  名詞
 gokan:  者 yomi:  シャ hinshi:  名詞
 gokan:  も yomi:  モ hinshi:  助詞
 gokan:  所詮 yomi:  ショセン hinshi:  副詞
 gokan:  仲間 yomi:  ナカマ hinshi:  名詞
 gokan:  に yomi:  ニ hinshi:  助詞
 gokan:  頼る yomi:  タヨル hinshi:  動詞
 gokan:  存在 yomi:  ソンザイ hinshi:  名詞
 gokan:  で yomi:  デ hinshi:  助動隧
 gokan:  しか yomi:  シカ hinshi:  助詞
 gokan:  ない yomi:  ナイ hinshi:  助動隧
 gokan:  の yomi:  ノ hinshi:  名詞
 gokan:  だ yomi:  ダ hinshi:  助動隧
 gokan:  。 yomi:  。 hinshi:  記号
 gokan:  EOS yomi:  。 hinshi:  記号
 それ
 それ
 の
 クルーザー
 一般
 仲間
 仲間
 凶
 同士
 奴
 存在
 故
 時
 最強
 殺戮
 物
 理想
 的
 的
 羅刹
 者
 覚醒
 証
 遠慮


***MeCabでの解析例(1) Chasenと同じ形の出力をすると [#dbfdaea7]

 # -*- coding: utf-8 -*-
 import sys
 import codecs
 import re
 import MeCab
 import twitter
 sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
 
 def hasKanji(s):
   #Returns True if string s contains a Kanji, False if not.
   kanji = False
   for c in s:
    if (((ord(c)&0xff00) == 0x3000) or (0x4e00 <= ((ord(c)&0xff00) <=0x9f00))):
      kanji = True
      break
   return kanji
 #
 api = twitter.Api()
 timeline = api.GetPublicTimeline()
 
 for s in timeline:
   t = s.text
   if hasKanji(t):
     print "Source> ", t
 
     m = MeCab.Tagger('-Ochasen')
     print m.parse(t.encode('utf_8'))   <<< MeCabパッケージはUTF_8のstr型しか受付けないのでencodeしてから食わせる
出力結果は
 Source>  晴れて良かったね。卒業式に雪とか私そうだったわ
 晴れ    ハレ    晴れる  動詞-自立       一段    連用形
 て      テ      て      助詞-接続助詞
 良かっ  ヨカッ  良い    形容詞-非自立   形容詞・アウオ段        連用タ接続
 た      タ      た      助動詞  特殊・タ        基本形
 ね      ネ      ね      助詞-終助詞
 。      。      。      記号-句点
 卒業    ソツギョウ      卒業    名詞-サ変接続
 式      シキ    式      名詞-接尾-一般
 に      ニ      に      助詞-格助詞-一般
 雪      ユキ    雪      名詞-一般
 とか    トカ    とか    助詞-並立助詞
 私      ワタシ  私      名詞-代名詞-一般
 そう    ソウ    そう    名詞-接尾-助動詞語幹
 だっ    ダッ    だ      助動詞  特殊・ダ        連用タ接続
 た      タ      た      助動詞  特殊・タ        基本形
 わ      ワ      わ      助詞-終助詞
 EOS

***MeCab?での解析例(2) ノードを取り出す [#r19f8ac0]
MeCabパッケージでは、解析ノードをノードの形で取り出すことができる。
 # -*- coding: utf-8 -*-
 import sys
 import codecs
 import MeCab
 import twitter
 sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
 
 def hasKanji(s):
   #Returns True if string s contains a Kanji, False if not.
   kanji = False
   for c in s:
    if (((ord(c)&0xff00) == 0x3000) or (0x4e00 <= ((ord(c)&0xff00) <=0x9f00))):
      kanji = True
      break
   return kanji
 
 api = twitter.Api()
 timeline = api.GetPublicTimeline()
 for s in timeline:
   t = s.text
   if hasKanji(t):
     print "Source> ", t
 # Chasenと同じ形式 
     mt = MeCab.Tagger('-Ochasen')
     print mt.parse(t.encode('utf_8'))
 # ノードに整理
     mt = MeCab.Tagger()
     m = mt.parseToNode(t.encode('utf_8'))
     while m:
         print m.surface, "\t", m.feature
         m = m.next
     print "EOS"

出力は
 Source>  iPad3買う理由がまた1つ出来たw
 iPad    iPad    iPad    名詞-一般
 3       3       3       名詞-数
 買う    カウ    買う    動詞-自立       五段・ワ行促音便        基本形
 理由    リユウ  理由    名詞-一般
 が      ガ      が      助詞-格助詞-一般
 また    マタ    また    接続詞
 1       1       1       名詞-数
 つ      ツ      つ      助動詞  下二・タ行      基本形
 出来    デキ    出来る  動詞-自立       一段    連用形
 た      タ      た      助動詞  特殊・タ        基本形
 w       w       w       名詞-固有名詞-組織
 EOS
 
         BOS/EOS,*,*,*,*,*,*,*,*
 iPad    名詞,一般,*,*,*,*,*
 3       名詞,数,*,*,*,*,*
 買う    動詞,自立,*,*,五段・ワ行促音便,基本形,買う,カウ,カウ 
 理由    名詞,一般,*,*,*,*,理由,リユウ,リユー
 が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
 また    接続詞,*,*,*,*,*,また,マタ,マタ
 1       名詞,数,*,*,*,*,*
 つ      助動詞,*,*,*,下二・タ行,基本形,つ,ツ,ツ
 出来    動詞,自立,*,*,一段,連用形,出来る,デキ,デキ
 た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
 w       名詞,固有名詞,組織,*,*,*,*
         BOS/EOS,*,*,*,*,*,*,*,*
 EOS

TwitterのStreamインタフェースで、連続してツイートをアクセスしてみたい。(そうでないと、アクセス制限があって、連続して見ることができない)~
Streamインターフェースについて調べてみると、Pythonからは、裸で使う(自分でリクエストを組み立てて出す)か、ライブラリとしてはTweeetyが便利そうである。

次は、Tweetyを使ってStreamアクセスをしてみる ⇒ [[ノート/テキストマイニング/twitter-tweety1]]
次は、Tweetyを使ってStreamアクセスをしてみる ⇒ [[ノート/テキストマイニング/twitter-tweepy1]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS