6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

KIT AppDeveloperAdvent Calendar 2015

Day 24

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

Posted at

本記事はKIT AppDeveloper Advent Calendar 2015の24日目の記事です。

どんなもの?

これです。
あなたが2015年によく使った言葉は?
スクリーンショット 2015-12-24 23.59.16.png

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

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

どうやって作ってるのか

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

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

準備

  1. 単語抽出と単語の頻出度を調べる
  2. 単語の頻度をランキングで上から名詞(赤),動詞(黄色),形容詞(白)をそれぞれ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便利なサービスが増えて欲しいです。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?