プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

python3でもっとも簡単に言語解析を使う

s51517765.hatenadiary.jp

twitterから趣味の似たユーザーを探すために、もっと多くのキーワードを抽出したいと思い、言語解析に挑戦しました。

Pythonで使える言語解析パッケージとしては、mecab(めかぶ)が有名なようです。
しかし、Windowsではなかなかインストールが一筋縄ではいかないということで、↓の記事のように簡単にできるよ、と書かれていても私にはやり遂げることはできませんでした。
qiita.com

例に漏れず、文字コードが分からないよ^^というErrorでくじけました。

C:\Users\****>pip install mecab-python3
Collecting mecab-python3
  Downloading mecab-python3-0.7.tar.gz (41kB)
    100% |████████████████████████████████| 51kB 1.1MB/s
Exception:
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\pip\compat\__init__.py", line 73, in console_to_str
    return s.decode(sys.__stdout__.encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x82 in position 15: invalid start byte

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

そこで、重いのでお勧めしないという声がありますが、janome(蛇の目)をインストールすることにしました。
こちらは、数分かかりましたがインストールできました。

C:\Users\***>pip install janome
Collecting janome
  Downloading Janome-0.3.5.tar.gz (20.0MB)
    100% |████████████████████████████████| 20.0MB 137kB/s
Building wheels for collected packages: janome
  Running setup.py bdist_wheel for janome ... done
  Stored in directory: C:\Users\nakas\AppData\Local\pip\Cache\wheels\35\26\c9\43f2970612ffeda9113bd1c345d7d39216fdfe5118c40a18b3
Successfully built janome
Installing collected packages: janome
Successfully installed janome-0.3.5

早速試してみます。

from janome.tokenizer import Tokenizer
t = Tokenizer()
for token in t.tokenize('今日はpythonが終わったら、夕ご飯に餃子を食べようと思っている。'):
    print(token)
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
python	名詞,固有名詞,組織,*,*,*,python,*,*
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
終わっ	動詞,自立,*,*,五段・ラ行,連用タ接続,終わる,オワッ,オワッ
たら	助動詞,*,*,*,特殊・タ,仮定形,た,タラ,タラ
、	記号,読点,*,*,*,*,、,、,、
夕	名詞,副詞可能,*,*,*,*,夕,ユウ,ユー
ご飯	名詞,一般,*,*,*,*,ご飯,ゴハン,ゴハン
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
餃子	名詞,一般,*,*,*,*,餃子,ギョウザ,ギョーザ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べよ	動詞,自立,*,*,一段,未然ウ接続,食べる,タベヨ,タベヨ
う	助動詞,*,*,*,不変化型,基本形,う,ウ,ウ
と	助詞,格助詞,引用,*,*,*,と,ト,ト
思っ	動詞,自立,*,*,五段・ワ行促音便,連用タ接続,思う,オモッ,オモッ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
いる	動詞,非自立,*,*,一段,基本形,いる,イル,イル
。	記号,句点,*,*,*,*,。,。,。

とりあえず、ただしく動作しているようです。
ちなみにここで、ファイル名を"janome.py"にしたら、Errorになりました。

ModuleNotFoundError: No module named 'janome.Tokenizer';'janome' is not a package

こんな罠があるんですよ。
Errorが出る場合は、その中で一番最後に出てくるもののなかに、一番重要なものがありますので、そのメッセージでぐぐるとqiitaやstackoverflow、teratermの該当記事にたどりつくことができます。
Python 3.x - janomeを使った形態素解析が出来ない(84652)|teratail

ここからが、本題。
まず、解析にかけるテキストとしては、自身のtimeLineを約3時間分取得しました。
タイムラインはtweepyで以下のように指定すれば取得できます。
最大取得数が100のようなので、30分ごとに取得します。
これをテキストファイルとして保存しておきます。

for tweet in api.home_timeline(count=100): #タイムライン

このファイルをjanomeにかけます。

# -*- coding: utf-8 -*-
from janome.tokenizer import Tokenizer
t = Tokenizer()

file = open('s51517765_timeline.txt', 'r', encoding='utf')  # UTFを指定する
text=file.read()
dict={} #カウント用の辞書の初期化

for token in t.tokenize(text):
    hinshi = token.part_of_speech.split(',')[0]
    isNum = token.part_of_speech.split(',')[1]
    word = token.base_form #単語
    if hinshi == '名詞' and (isNum!='数' and isNum!='サ変接続'):
        print(token)
        if word in dict:
            dict[word] += 1
        else:
            dict[word] = 1

    elif hinshi == '動詞':
        print(token)
        if word in dict:
            dict[word] += 1
        else:
            dict[word] = 1
for k, v in sorted(dict.items(), key=lambda x: -x[1]): #降順ソート
    if v>3:
        print(str(k) + " : " + str(v))

f:id:s51517765:20171125181815p:plain
ここで、品詞を確認し、名詞と動詞だけを抽出します。ただし、名詞の中の”数”と”サ変接続”は除外します。
"数"はいわゆるアラビア数字でサ変接続は:(コロン)や;(セミコロン)などの記号を除外します。
elif hinshi=='動詞'のところは、うまく記述すればifの中に含めることも可能だとは思いますが、ここでは視認性を重視し分割しました。

これで、欲しい単語のみを抽出できました。
これを辞書に登録しながらカウントし、降順ソートします。

する : 156
https : 133
t : 133
co : 128
RT : 94
いる : 46
の : 41
てる : 35
なる : 34
人 : 31
こと : 29
れる : 28
ある : 26
やる : 21
ん : 20
できる : 18
ブログ : 17
くる : 16
思う : 15
さん : 15
見る : 14
的 : 14
よう : 13
化 : 12
中 : 12
時間 : 12
これ : 12
使う : 11
記事 : 11
今日 : 11
みる : 10
そう : 10
フレーム : 10
暗号 : 10
x : 9
電子 : 9
者 : 9
出る : 9
ため : 9
方 : 8
自分 : 8
言う : 8
私 : 8
わかる : 8
年 : 8
それ : 8
時 : 8
せる : 7
駅 : 7
A : 7
ー : 7
方式 : 7
られる : 7
出す : 7
日 : 7
みたい : 7
鍵 : 7
くれる : 6
作る : 6
書く : 6
系 : 6
電気 : 6
さ : 6
持つ : 6
つく : 6
前 : 6
知る : 6
映画 : 6
気 : 6
危険 : 6
物 : 6
ケーブル : 6
学生 : 6
code : 6
festival : 6
しまう : 5
以外 : 5
しれる : 5
コード : 5
アプリ : 5
人間 : 5
Android : 5
技術 : 5
m : 5
C : 5
回路 : 5
回 : 5
読む : 5
PC : 5
手 : 5
いう : 5
たち : 5
情報 : 5
ロボット : 5
普通 : 5
英語 : 5
機器 : 5
企業 : 5
おる : 5
買う : 5
綺麗 : 5
問題 : 4
切る : 4
いただく : 4
w : 4
インターネット : 4
すぎる : 4
可能 : 4
y : 4
穴 : 4
ちゃう : 4
県 : 4
u : 4
日本 : 4
何 : 4
s : 4
全体 : 4
見える : 4
r : 4
食べる : 4
GitLab : 4
数学 : 4
ガール : 4
秘密 : 4
分 : 4
頭 : 4
以上 : 4
もの : 4
対象 : 4
度 : 4
T : 4
聞く : 4
思い出す : 4
姿 : 4
アニメ : 4
死ぬ : 4
でる : 4
つける : 4
ツイート : 4
画像 : 4
車 : 4
ぶつ : 4
森 : 4
どこ : 4
定期 : 4
経済 : 4
今 : 4
本 : 4
必要 : 4
ナイフ : 4
Excel : 4
アクセサリー : 4

まだ、一般的すぎる単語が多い気がしますが、うまく組み合わせれば使えそうな単語が拾えているようにも思います。
このListを見たら何となく理系っぽいイメージが出ているのではないでしょうか?

参考資料

辞書型の使い方