koh’s blog

Sys Admin who loves automation

日本語の自然言語処理ライブラリのGINZAとojichatで遊んでみた

話題になっているojichatを日本語解析してみたらどうなるのかなと思ったので試してみました。
なおネタ投稿です。
日本語解析とかド素人ですし、別におじさんに詳しいわけでもないです。

やりたいこと

おじさんっぽい文章を解析して遊ぶ

使ったもの

ojichat

github.com

[koh@macbook] ~
% ojichat
オイラは紗愛チャン一筋ダヨ😎(^^;;オイラは紗愛チャンの味方だかラネ(^з<)😃✋
[koh@macbook] ~
%

GINZA

www.recruit.co.jp https://megagonlabs.github.io/ginza/

[koh@macbook] ~/work/oji
% python -m spacy.lang.ja_ginza.cli
Loading model 'ja_ginza_nopn'
mode is C
disabling sentence separator
日本語の自然言語処理ライブラリのGINZAとojichatで遊んでみた
# text = 日本語の自然言語処理ライブラリのGINZAとojichatで遊んでみた
1   日本語   日本語   NOUN    名詞-普通名詞-一般  _   6   nmod    _   SpaceAfter=No|NP_B
2   の の ADP 助詞-格助詞    _   1   case    _   SpaceAfter=No
3   自然  自然  NOUN    名詞-普通名詞-一般  _   6   compound    _   SpaceAfter=No|NP_B
4   言語  言語  NOUN    名詞-普通名詞-一般  _   6   compound    _   SpaceAfter=No|NP_I
5   処理  処理  NOUN    名詞-普通名詞-サ変可能    _   6   compound    _   SpaceAfter=No|NP_I
6   ライブラリ ライブラリー  NOUN    名詞-普通名詞-一般  _   8   nmod    _   SpaceAfter=No|NP_I
7   の の ADP 助詞-格助詞    _   6   case    _   SpaceAfter=No
8   GINZA   ginza   NOUN    名詞-普通名詞-一般  _   10  nmod    _   SpaceAfter=No|NP_B|NE=ORG_B
9   と と ADP 助詞-格助詞    _   8   case    _   SpaceAfter=No
10  ojichat ojichat NOUN    名詞-普通名詞-一般  _   12  nmod    _   SpaceAfter=No|NP_B
11  で で ADP 助詞-格助詞    _   10  case    _   SpaceAfter=No
12  遊ん  遊ぶ  VERB    動詞-一般   _   0   root    _   SpaceAfter=No
13  で で SCONJ   助詞-接続助詞 _   12  mark    _   SpaceAfter=No
14  み 見る  AUX 動詞-非自立可能  _   12  aux _   SpaceAfter=No
15  た た AUX 助動詞   _   12  aux _   SpaceAfter=No

[koh@macbook] ~/work/oji
%

準備

環境

macOS Mojave 10.14.5
python 3.7.3
ojichat 0.2.0
ginza 1.0.2

インストール

ojichat:

go get -u github.com/greymd/ojichat

GINZA:

pip install "https://github.com/megagonlabs/ginza/releases/download/v1.0.2/ja_ginza_nopn-1.0.2.tgz"

以上です。
コマンド一発でインストールできるの本当に便利
なおgoとpipのインストール手順は割愛させていただきます。

解析開始

素人なので何をしていいのかいまいちわからなかったが、とりあえず使われている品詞の種類/割合を比べてみることにしました。

使ったスクリプト

[koh@macbook] ~/work/oji
% cat kaiseki.py
import sys
import spacy
import collections


textfile = sys.argv[1]
f = open(textfile, 'r')

nlp = spacy.load('ja_ginza_nopn')
doc = nlp(f.read())
lst = [token._.pos_detail.replace(',*', '').replace(',', '-') for sent in doc.sents for token in sent]

f.close()
print(collections.Counter(lst))
[koh@macbook] ~/work/oji
%

引数にテキストファイルを渡すとテキスト内で使われている品詞を集計します。
"名詞-普通名詞-一般"とか"助詞-接続助詞"とかです。

[koh@macbook] ~/work/oji
% cat example.txt
仙石線
仙石線(せんせきせん)は、宮城県仙台市青葉区のあおば通駅から仙台駅を経由し宮城県石巻市の石巻駅を結ぶ東日本旅客鉄道(JR東日本)の鉄道路線(幹線)である。このほか、陸前山下駅 - 石巻港駅間の日本貨物鉄道(JR貨物)の貨物支線を持つ。
[koh@macbook] ~/work/oji
% python kaiseki.py example.txt
Counter({'助詞-格助詞': 9, '名詞-普通名詞-一般': 8, '名詞-固有名詞-地名-一般': 6, '名詞-固有名詞-一般': 5, '補助記号-括弧開': 4, '補助記号-括弧閉': 4, '動詞-一般': 3, '接尾辞-名詞的-一般': 2, '補助記号-読点': 2, '動詞-非自立可能': 2, '補助記号-句点': 2, '助詞-係助詞': 1, '名詞-普通名詞-サ変可能': 1, '助動詞': 1, '連体詞': 1, '名詞-普通名詞-副詞可能': 1, '補助記号-一般': 1, '接尾辞-名詞的-副詞可能': 1})
[koh@macbook] ~/work/oji
%

こんな感じです。

とりあえずojichatを1000回叩いてみました。

[koh@macbook] ~/work/oji
% for i in {1..1000}
do
ojichat >> oji.txt
done
[koh@macbook] ~/work/oji
% wc oji.txt
    1000    3056  178662 oji.txt
[koh@macbook] ~/work/oji
% head -n 1 oji.txt;tail -n 1 oji.txt
結麻ちゃん、会社をサボるなんて、悪い子だなぁ😄❗😃なんてね(^o^)😃😄今日は楽しい時間をありがとうね(笑)❗😆すごく、楽しかったヨ(笑)💕(^з<)
れほチャン、お疲れ様〜(^_^)今日も頑張ってネ(^_^)
[koh@macbook] ~/work/oji
%

カオスなテキストファイルができました。

比較対象としてwikipediaを使います。

http://medialab.di.unipi.it/wiki/Wikipedia_Extractor
これを参考にwikipediaのテキストのdumpとってoji.txtと大体同じくらいのサイズのファイルを作りました。

[koh@macbook] ~/work/oji
% grep title wiki.txt
<doc id="3130" url="https://ja.wikipedia.org/wiki?curid=3130" title="アセンブリ言語">
<doc id="3131" url="https://ja.wikipedia.org/wiki?curid=3131" title="3月7日">
<doc id="3132" url="https://ja.wikipedia.org/wiki?curid=3132" title="自動列車制御装置">
<doc id="3133" url="https://ja.wikipedia.org/wiki?curid=3133" title="オペラ">
<doc id="3135" url="https://ja.wikipedia.org/wiki?curid=3135" title="万景峰号">
<doc id="3137" url="https://ja.wikipedia.org/wiki?curid=3137" title="ピーマン">
[koh@macbook] ~/work/oji
% wc wiki.txt
     288    2103  173636 wiki.txt
[koh@macbook] ~/work/oji
% head -n 1 wiki.txt;tail -n 1 wiki.txt
アセンブリ言語
日本の一般家庭で広く普及したのは、第二次世界大戦後の1950年代以降である。
[koh@macbook] ~/work/oji
%

記事は上記、記事の区切り(doc)と空行は弾いてます。

では実際に解析します。

[koh@macbook] ~/work/oji
% python kaiseki.py wiki.txt
Counter({'名詞-普通名詞-一般': 6343, '助詞-格助詞': 6096, '名詞-普通名詞-サ変可能': 2989, '動詞-非自立可能': 2326, '助動詞': 1990, '補助記号-読点': 1788, '動詞-一般': 1384, '助詞-係助詞': 1328, '名詞-数詞': 1170, '助詞-接続助詞': 1003, '名詞-普通名詞-助数詞可能': 901, '補助記号-句点': 830, '名詞-普通名詞-副詞可能': 778, '補助記号-括弧閉': 774, '補助記号-括弧開': 773, '補助記号-一般': 745, '接尾辞-名詞的-一般': 438, '助詞-副助詞': 434, '名詞-固有名詞-人名-一般': 432, '名詞-普通名詞-形状詞可能': 365, '名詞-固有名詞-一般': 320, '名詞-固有名詞-地名-一般': 283, '副詞': 228, '名詞-固有名詞-地名-国': 204, '連体詞': 203, '形状詞-一般': 197, '接続詞': 180, '接頭辞': 155, '形容詞-一般': 137, '代名詞': 132, '形状詞-助動詞語幹': 91, '助詞-準体助詞': 69, '形容詞-非自立可能': 67, '接尾辞-名詞的-助数詞': 66, '接尾辞-名詞的-副詞可能': 66, '名詞-固有名詞-人名-姓': 43, '名詞-普通名詞-サ変形状詞可能': 32, '接尾辞-形状詞的': 30, '名詞-固有名詞-人名-名': 28, '接尾辞-名詞的-サ変可能': 19, '接尾辞-形容詞的': 13, '助詞-終助詞': 8, '形状詞-タリ': 3, '感動詞-一般': 2, '感動詞-フィラー': 1})
[koh@macbook] ~/work/oji
% python kaiseki.py oji.txt
Counter({'補助記号-一般': 7223, '名詞-普通名詞-一般': 3674, '助詞-終助詞': 2343, '助動詞': 2207, '名詞-普通名詞-サ変可能': 1689, '補助記号-括弧開': 1634, '助詞-格助詞': 1618, '補助記号-読点': 1439, '助詞-係助詞': 1313, '接尾辞-名詞的-一般': 1261, '補助記号-括弧閉': 1113, '動詞-非自立可能': 1081, '補助記号-AA-顔文字': 1053, '名詞-普通名詞-副詞可能': 938, '動詞-一般': 900, '形容詞-一般': 811, '助詞-接続助詞': 731, '副詞': 718, '記号-文字': 714, '名詞-固有名詞-人名-名': 599, '代名詞': 522, '助詞-準体助詞': 437, '補助記号-句点': 406, '助詞-副助詞': 347, '接頭辞': 288, '形状詞-一般': 283, '感動詞-一般': 228, '名詞-普通名詞-助数詞可能': 212, '連体詞': 207, '名詞-固有名詞-人名-一般': 179, '形状詞-助動詞語幹': 176, '名詞-普通名詞-形状詞可能': 144, '名詞-数詞': 139, '形容詞-非自立可能': 137, '名詞-固有名詞-地名-一般': 93, '空白': 74, '接尾辞-形状詞的': 73, '感動詞-フィラー': 61, '名詞-普通名詞-サ変形状詞可能': 38, '名詞-固有名詞-人名-姓': 26, '名詞-固有名詞-一般': 22, '接続詞': 19, '名詞-固有名詞-地名-国': 17, '記号-一般': 6, '接尾辞-形容詞的': 2, '接尾辞-名詞的-助数詞': 2})
[koh@macbook] ~/work/oji
%

分かりづらいので円グラフにしました。
要素が多すぎたので6位以降はotherでまとめました。
lab.syncer.jp

f:id:koh-sh:20190720211915p:plain f:id:koh-sh:20190720211938p:plain

ちなみにojichatの一位の"補助記号-一般"は絵文字です。圧倒的ですね。
あとは"補助記号-AA-顔文字"も1053あるのでだいぶ多いですね。

まとめ

おじさんのメッセージには絵文字がたくさん使われていることがわかりました(知ってた)