「形態素解析とは?」から始める自然言語処理実践入門
https://handsons.doorkeeper.jp/events/72427
日時と場所
日時:
2018-04-07(土)14:00 - 18:00
場所:
ピクスタ株式会社
東京都渋谷区渋谷2-12-19 東建インターナショナルビル本館 5F
今回の勉強会のリポジトリ
https://github.com/hidetomasuoka/NLP-hands-ons
実行環境
https://colab.research.google.com/
作ったソースは、GoogleDriveに保存される
メモ
-
WebDB 100号に今回の勉強会の内容に類似した記事がある
http://gihyo.jp/magazine/wdpress/archive/2017/vol100 -
用語
-
文章 Sentence
1つの文 -
文書 Document
複数の文章の集まり -
コーパス Coprus
文書を構造化して集積したテキストデータ -
表層 surface
活用された単語のこと <-> 原型 -
原型 Original
辞書に載っている単語のこと
例: 原型=食べる, 表層=食べない、食べるとき、食べろ -
特徴 Feature
文書から抽出された -
辞書 Lexicon
-
固有表現抽出
人名、地名などの情報のみ取得すること
-
-
「東京都」問題
- 「東京+都:とうきょうと」とも、「東+京都:ひがしきょうと」とも取れてしまう
実際には「ひがしきょうと」という地名はないので、人なら「とうきょうと」だと理解することができる。 -
特徴抽出
文章を単語に分けて、単語の一覧を作る -
正規化
データ処理の前に、データの正規化が必要- 文字コード
- 改行コード
- 全角・半角の統一
- unicodeの正規化 (002d, 2011, 2012 -> 002d)
-
英語を扱う上で面倒な点
英語は分かち書きは簡単だが、イディオムの解析が面倒。イディオムというのは、"in front of"のように、複数の単語で1つの意味をなす表現のこと。 -
形態素解析のエンジンたち
- MeCab
- Chasen
- sudachi
- Janome (jsで書かれている)
- Kuromoji (Elastic Searchで使われている)
Colaboratoryで自然言語処理
詳細は前述のgithubリポジトリに書いてある。
- mecabのインストール
!apt install aptitude
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3
- mecabを使用してみる
import MeCab
m = MeCab.Tagger ("-Ochasen")
print (m.parse ("なのはちゃんかわいい"))
# なのは ナノハ なのは 名詞-固有名詞-人名-一般
# ちゃん チャン ちゃん 名詞-接尾-人名
# かわいい カワイイ かわいい 形容詞-自立 形容詞・イ段 基本形
- 辞書を入れ替える
mecab-ipadic-NEologdという辞書があり、新語が多く採用されている。
Apache License, Version 2.0で、毎週2回更新されている。
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
!xz -dkv mecab-ipadic-neologd/seed/mecab-user-dict-seed.*.csv.xz
# 日付はその時での最新のモノにする必要あり
!/usr/lib/mecab/mecab-dict-index -d /usr/share/mecab/dic/ipadic -u mecab-user-dict-seed.20180322.dic -f utf-8 -t utf-8 mecab-ipadic-neologd/seed/mecab-user-dict-seed.20180322.csv
!cp -p ./mecab-user-dict-seed.20180322.dic /usr/share/mecab/dic/
!echo "userdic = /usr/share/mecab/dic/mecab-user-dict-seed.20180322.dic" >> /etc/mecabrc
辞書を入れ替えてから再度試すと、分かち書きのされ方が変わる(特に流行語など)
Word2Vecを試す
詳細はhttps://github.com/hidetomasuoka/NLP-hands-ons/tree/master/word2vecのipynbを参照
gensimをインストールする
!pip install gensim
モデルをダウンロードする
※今回はビズリーチが作ったモデルを取り込む
!wget https://github.com/bizreach/ai/releases/download/2018-03-13/stanby-jobs-200d-word2vector.bin
ダウンロードできたかチェック
!ls /content
ダウンロードしたモデルをロードする
from gensim.models import KeyedVectors
import sys
w2v = KeyedVectors.load_word2vec_format("/content/stanby-jobs-200d-word2vector.bin", binary=True)
Javaと類似した単語を検索
w2v.most_similar('Java', topn=5)
# [(u'PHP', 0.9712682962417603),
# (u'JAVA', 0.9526373147964478),
# (u'C#', 0.9488359689712524),
# (u'Ruby', 0.9369792938232422),
# (u'.NET', 0.9361047744750977)]
cabochaを使って係り受けの解析を試して見る
下記のファイルをローカルに持ってくる
https://github.com/hidetomasuoka/NLP-hands-ons/blob/master/morphological_analysismecab/Dockerfile
以下のコマンドでDockerのコンテナを作って実行する
$ docker build -t webdb100 .
$ docker run -it -v `pwd`:/webdb100 webdb100:latest
コンテナが立ち上がったら、cabocha
コマンドを実行する。
適当な文章を入力してEnterすると係り受けの解析がなされる。
(python3.6) [root@ae86f29c36a4 /]# cabocha
誕生日翌日にして、少し24歳の一年間を思い出しつつも、25歳へのバトンタッチにやや戸惑いを隠しながら、もはや目もはっきりしないままノソノソと行き着いた先に、私の開きもしない目に入って来たのがこのチラシでした
誕生日-D
翌日に-D
して、-------D
少し-D |
24歳の-D |
一年間を-D
思い出しつつも、-------------------------------D
25歳への-D |
バトンタッチに-----D |
やや---D |
戸惑いを-D |
隠しながら、---------D |
もはや---D | |
目も-D | |
はっきりしないまま---D |
ノソノソと-D |
行き着いた-D |
先に、---------D
私の-D |
開きも-D |
しない-D |
目に-D
入って来たのが---D
この-D
チラシでした
EOS
出力を、下記の事例1と見比べると読み取り方がわかる。記号の"D"を下矢印と読み替えると良さそう。
-> 滝沢カレンの理解不能な文章を言語解析してみた。