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

訪問者数 1275      最終更新 2012-03-01 (木) 15:15:36

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

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

Chasenでの解析例

# -*- 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と同じ形の出力をすると

# -*- 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) ノードを取り出す

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-tweepy1


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-03-01 (木) 15:15:36 (4045d)