ツイッターで流行ってる「今年一番使った言葉」的なテキスト解析

本記事は[KIT AppDeveloper Advent Calendar 2015](http://qiita.com/advent-calendar/2015/kitappdeveloper)の24日目の記事です。


# どんなもの？

これです。
[あなたが2015年によく使った言葉は？](http://textmining.userlocal.jp/sp)
![スクリーンショット 2015-12-24 23.59.16.png](https://qiita-image-store.s3.amazonaws.com/0/42327/ed1e4f5e-5cbf-5d41-e82c-81619a7ffcc6.png)

（ちなみに、自分のアカウントでやった結果なのですがスプラトゥーンとAppleMusic辺りが多かった様です。イカ楽しいしAppleMusicも最高です。）

注意: 中の人ではありませんので、全く同じものを作るわけではありません。

# どうやって作ってるのか

1. ツイートを収集する
2. 単語抽出と単語の頻出度を調べる
3. 単語の頻度をランキングで上から名詞(赤),動詞(黄色),形容詞(白)をそれぞれ20個ぐらい抽出
4. 単語の頻出度が高いものを中心に、単語を可視化する

という感じでしょうか。
この記事では2,3の部分をやってみようと思います。


# 準備

> 2. 単語抽出と単語の頻出度を調べる
> 3. 単語の頻度をランキングで上から名詞(赤),動詞(黄色),形容詞(白)をそれぞれ30個ぐらい抽出

単純にこの2つを行うだけならpythonなどでも行けると思うのですが、データを集めて今後利用するってことを考えてpostgresqlにツイートを保存しています。

本記事では以下のものを利用します。

* mecab
* mecab-ipadic
* postgresql
* textsearch_ja（postgresqlでmecabを利用するため）
* ツイートなど大量の文章


# やってみる

データベース名: db
テーブル名: timeline
ツイート本文カラム: text

なお、クエリの実行結果は適当に省略しています。

## 1. to_tsvector()を使って、語彙素（似ている単語のようなイメージ）ごとに分ける

to_tsvector('言語', 'テキスト')
クエリは最新のツイートを語彙素に変換しています。

```
db=# select to_tsvector('japanese', text) from timeline;
                                to_tsvector
--------------------------------------------------------------------------------
'soni':3 'wacod':2 'yuki':1 'てる':8 'れる':7 '一方':4 '愛す':6 '的':5
'qiita':2 'する':6 'てる':7 'メリクリ':1 '今':8 '勘違い':5 '日付':4 '書く':9 '記事':3
'感じ':3 '緑':1 '蒼':2
'てる':5 'ー':8 '炎':7 '燃やす':2 '緑色':6 '薪':1 '見る':4 '配信':3
'fme':2 'mac':1 'できる':6 'ひどい':12 'やる':10 '使う':3 '画質':11 '簡単':8 '自動':4 '試し':7 '配信':5,9
 …
```

## 2. ts_stat()を使って、語彙素の統計情報を降順で出す

ts_stat(tsvector列)

word: 語彙素の値
ndoc: 単語が含まれる文書の数
nentry: 含まれる単語の数

日本語の文章なので、動詞が多いですね。
次に画像のURL、リツイートといった感じです。

```
db=# select * from ts_stat('select to_tsvector(''japanese'', text) from timeline') order by nentry desc
                  word                  | ndoc | nentry 
----------------------------------------+------+--------
 する                                   |  738 |    934
 てる                                   |  459 |    522
 t.co                                   |  437 |    492
 rt                                     |  317 |    320
 なる                                   |  287 |    319
 …
```

## 3. ja_analyze()を使って、統計情報のwordを品詞別に抽出する

js_analyze('テキスト')

js_analyze()の結果はこんな感じです

```
db=# select * from ja_analyze('楽しい');
  word  |  type  | subtype1 | subtype2 | subtype3 |   conjtype   | conjugation | basic  |   ruby   | pronounce 
--------+--------+----------+----------+----------+--------------+-------------+--------+----------+-----------
  楽しい | 形容詞 | 自立     |          |          | 形容詞・イ段 | 基本形      | 楽しい | タノシイ | タノシイ
```

js_analyze()の結果から品詞(type)が形容詞のもののみ抽出しています。

```
db=# select word from (select * from ts_stat('select to_tsvector(''japanese'', text) from timeline') order by nentry desc) as t where (select type from ja_analyze(t.word) limit 1) = '形容詞' limit 20;
     word     
--------------
 いい
 ない
 良い
 楽しい
 多い
 …
```

# 名詞、動詞、形容詞をそれぞれ抽出した結果

以下の様な感じになりました。

名詞

```
 t.co
 rt
 人
 ー
 3
 w
 2
 (友人のアカウント)
 (友人のアカウント)
 さん
 (友人のアカウント)
 1
 自分
 (友人のアカウント)
 時間
 感じ
 今
 好き
 的
 7
```

動詞

```
 する
 てる
 なる
 いる
 思う
 ある
 見る
 れる
 できる
 やる
 行く
 くる
 言う
 みる
 使う
 いく
 いう
 すぎる
 考える
 書く
```

形容詞

```
 いい
 ない
 良い
 楽しい
 多い
 欲しい
 すごい
 面白い
 やすい
 遅い
 おいしい
 強い
 めんどくさい
 眠い
 早い
 よい
 やばい
 辛い
 怖い
 少ない
```

最初に挙げたサービスではこのような結果を可視化している感じですね。

ただ、今回の場合特に名詞の結果が良いものではありません。
mecabの辞書単語を増やしたり、ブロックワードなどを決める必要がありますね。

# どうでしたか？

なぜ本記事を書いたかというと

**このレベルであれば日本語を解析することは意外と簡単にできる！**

ということを感じ取ってもらえたら嬉しいなと思い、もっと面白いor便利なサービスが増えて欲しいです。