Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
実務で使う自然言語処理をする
2017/3/6 サポーターズ勉強会
@kensuke3238
Who are you ?
三澤 賢佑 (ミツザワ ケンスケ)
Github Qiita
愛知県 出身
2012年 大阪外国語大学 ペルシア語科 卒
2014年 奈良先端科学技術大学院大学 卒
エン・ジャパン株式会社 兼 不満買取センター 出向...
本日の内容はサンプルコードがあります
Github Kensuke-Mitsuzawa
本日の内容はサンプルコードがあります
Github Kensuke-Mitsuzawa
Dockerコンテナもついてるよ!
なぜ、いまさら
はじめの一歩っぽい自然言語処理なのか?
先端のはやり技術 ≠ ビジネス最前線で使える技術
モデルの中身を理解は不可能。(少なくとも非技術者には)
パラメータチューニングもコストがかかる。
ビジネス価値が高い技術とは?
● シンプル、理解しやすい
● 説明可能(間違いの理由を顧客が理解...
先端技術 = ビジネス最前線技術はいつやってくる?
企業(システム提供者)、システム利用者(一般ユーザー)が
みんな「これくらいの間違いはしゃーないわな」と納得できるようになった時。
先端技術 = ビジネス最前線技術はいつやってくる?
企業(システム提供者)、システム利用者(一般ユーザー)が
みんな「これくらいの間違いはしゃーないわな」と納得できるようになった時。
Google photoゴリラ事件
出典 http://jp...
先端技術 = ビジネス最前線技術はいつやってくる?
企業(システム提供者)、システム利用者(一般ユーザー)が
みんな「これくらいの間違いはしゃーないわな」と納得できるようになった時。
Google photoゴリラ事件
出典 http://jp...
わかりやすいモデルは不滅
今後の産業界へ技術浸透(主観予想)
産業分野によっては「高い説明可能性」を求められる分野がある。(Ex. 医療系など)
わかりやすくて、間違いの理由も理解できるモデルは今後も生き残る。
ディープラーニング系技術 わかり...
自然言語処理への第一歩
1.形態素分割
Q. 形態素分割とはなにか?
A. テキストを単語にバラすこと[1]
[1] 厳密には単語と形態素は異なる。形態素⊆単語と認識すると良い。
Q. 形態素分割とはなにか?
A. テキストを単語にバラすこと[1]
[1] 厳密には単語と形態素は異なる。形態素⊆単語と認識すると良い。
なぜ、形態素分割が必要か?
● テキストデータでも集計処理をしたい
● 文、文書の状態だと、機械学習にも...
Q. 形態素分割とはなにか?
A. テキストを単語にバラすこと[1]
[1] 厳密には単語と形態素は異なる。形態素⊆単語と認識すると良い。
なぜ、形態素分割が必要か?
● テキストデータでも集計処理をしたい
● 文、文書の状態だと、機械学習にも...
Q. 形態素分割とはなにか?
A. テキストを単語にバラすこと[1]
[1] 厳密には単語と形態素は異なる。形態素⊆単語と認識すると良い。
なぜ、形態素分割が必要か?
● テキストデータでも集計処理をしたい
● 文、文書の状態だと、機械学習にも...
Q. 形態素分割とはなにか?
A. テキストを単語にバラすこと[1]
[1] 厳密には単語と形態素は異なる。形態素⊆単語と認識すると良い。
なぜ、形態素分割が必要か?
“きょうは、サポーターズのオフィスにやってきたよ!
あしたは、社畜としてバリ...
Q. 形態素分割とはなにか?
A. テキストを単語にバラすこと[1]
[1] 厳密には単語と形態素は異なる。形態素⊆単語と認識すると良い。
なぜ、形態素分割が必要か?
“きょうは、サポーターズのオフィスにやってきたよ!
あしたは、社畜としてバリ...
えっ、なんだか難しそう・・・?
たった1行で完結 on unixコンソール
% echo "きょうは、サポーターズのオフィスにやってきたよ!" | mecab -d /usr/local/lib/mecab/dic/mecab-
ipadic-...
えっ、なんだか難しそう・・・?
たった1行で完結 on python
In [2]: from JapaneseTokenizer import MecabWrapper
In [3]: MecabWrapper('neologd').¥
to...
形態素解析器の仕組み
「辞書データ + 形態素解析モデル」の組み合わせ。
「形態素解析モデル」は、ツールごとに違うアルゴリズムを採用
形態素解析器
辞書データ
形態素解析モデル
形態素解析器の勢力 (主観)
ツール名 特徴
Mecab 形態素解析界で一番有名。とりあえずMecabという風潮がある。
とにかく、動作が早い。
Kuromoji ElasticSearchとペアで使われる鉄板的な存在。
動作アルゴリズムに不透...
辞書の勢力 (主観)
辞書名 特徴
IPA辞書 Mecabの標準辞書としてアナウンスされている。
IPA-neologd辞書 IPA-Dicの体系で、新語に対応させまくっている。
Web系の新語にとにかく対応したいのなら、これ。
Unidc辞書...
形態素解析の性能とこれから
「きれいな文(新聞記事)」で98%くらいの分割精度(Mecab)
チャレンジ内容は「Web分野」や「話し言葉」への対応
形態素解析の性能とこれから
「きれいな文(新聞記事)」で98%くらいの分割精度(Mecab)
チャレンジ内容は「Web分野」や「話し言葉」への対応
Web分野と話し言葉への対応
Web文書には「Mecab + IPA neologd辞書」の組み...
Pythonでやってみる形態素分割と単語集計
“JapaneseTokenizer”で基本的なことがカバーできる。
Mecab, Juman, Juman++, Kyteaの呼び出し
品詞でフィルタリング
Stopword(分割結果から除外した...
自然言語処理への第一歩
2. キーワード抽出
どうしてキーワード抽出が必要か?
形態素の集計では、意味がない単語の出現
どうしてキーワード抽出が必要か?
単語 頻度
する 2513
なる 554
演 283
ある 270
信繁 195
Wikipediaの「テレビ番組」に関係する15文書を集計。
品詞には「動詞・自立」、「形容詞・自立」、「名詞・固有名詞」を利用...
どうしてキーワード抽出が必要か?
単語 頻度
する 2513
なる 554
演 283
ある 270
信繁 195
Wikipediaの「テレビ番組」に関係する15文書を集計。
品詞には「動詞・自立」、「形容詞・自立」、「名詞・固有名詞」を利用...
キーワード抽出へのアプローチ
キーワード抽出へのアプローチは大きく2つある。
今回は「データ重み付け」アプローチを紹介
データ重み付け
データベース照
合
文の集合に重み付け計算を行なう。
文や文書につけられた「ラベル」ベース
ラベルごとの出現...
重み付けアプローチの実例紹介
不満買取センターでの実例。
「不満で振り返る2016年 各月の注目キーワードTOP5」
【1月】 新成人 正月太り 大寒波 正月三が日 バルス
【2月】 歯舞 春一番 立春 グラミー賞 台湾地震
【3月】 ナベツネ...
重み付けアプローチの実例紹介
不満買取センターでの実例。
「不満で振り返る2016年 各月の注目キーワードTOP5」
抽出フローチャート
不満買取センター
DB
形態素分割
重み付け
計算
キーワード
単語集合
(2分でわかる)重み付け手法の概念
ある単語aについて、ラベルAとあるラベルBの出現差分を比較する。
(ラベルベース重み付け手法の場合)
ラベル- テレビ番組 ラベル- 自動車
新車
トヨタ
CM
多様な
視聴率
イグニッション
新車
トヨタ
...
(2分でわかる)重み付け手法の概念
ある単語aについて、ラベルAとあるラベルBの出現差分を比較する。
ラベル- テレビ番組 ラベル- 自動車
新車
トヨタ
CM
多様な
視聴率
イグニッション
新車
トヨタ
多様な
多様な
あう
販売
新車
ホ...
ある単語aについて、ラベルAとあるラベルBの出現差分を比較する。
ラベル- テレビ番組 ラベル- 自動車
CM
視聴者
多様な
CM
CM
視聴率
CM
多様な
視聴率
視聴者
視聴率
多様な
新車
多様な
CM
視聴率
新車
トヨタ
CM
多...
ラベル頻度をカウントすると
ラベル頻度(Documen Frequency); 単語が出現した「文書数」。単語頻度ではない。
ラベル- テレビ番組 ラベル- 自動車
単語 ラベル頻度
CM 3
視聴率 3
多様な 4
新車 1
単語 ラベル頻度...
ラベル頻度をカウントすると
ラベル頻度(Documen Frequency); 単語が出現した「文書数」。単語頻度ではない。
ラベル- テレビ番組 ラベル- 自動車
単語 頻度 差分
CM 3 +2
視聴率 3 +2
多様な 4 0
新車 1 ...
ラベル頻度をカウントすると
ラベル頻度(Documen Frequency); 単語が出現した「文書数」。単語頻度ではない。
ラベル- テレビ番組 ラベル- 自動車
単語 頻度 差分
CM 3 +2
視聴率 3 +2
多様な 4 0
新車 1 ...
Q. どんなラベルを使えばいいのか?
A. なんでもいい。
キーワードを分類する「カテゴリ」として意味ありそうなら。
ラベル情報の例
● 「タグ」のようなメタデータ
● 人手で分類をして、付与してきた「タグ」
● タイムスタンプ (週単位、月単...
Pythonで重み付けアプローチをやってみる
DocumentFeatureSelectionを使えば、TF-IDF, BNS, PMI, SOAが実行可能
Inputのデータ構造
{
“ラベル名-1”: [
[文1に出現する単語],
[文2に...
Pythonで重み付けアプローチをやってみる
Inputのデータ構造
{
"テレビ番組": [
["視聴率", "CM", "CM", "多様な", "新車", "視聴者"],
["トヨタ", "CM", "CM", "多様な", "視聴者"]...
Pythonで重み付けアプローチをやってみる
In [1]: from DocumentFeatureSelection import interface
In [2] : データは前スライドの入力データを利用。input_dict = 前スラ...
Pythonで重み付けアプローチをやってみる
In [1]: from DocumentFeatureSelection import interface
In [2] : データは前スライドの入力データを利用。input_dict = 前スラ...
Pythonで重み付けアプローチをやってみる
In [1]: from DocumentFeatureSelection import interface
In [2] : データは前スライドの入力データを利用。input_dict = 前スラ...
Pythonで重み付けアプローチをやってみる
シンプルにデータ入力できるインターフェース
4手法が利用可能
高速な計算
Cythonを利用
巨大データへのスケール性
10GB程度までのテキストデータに対応実績あり[1]
DocumentFeat...
自然言語処理への第一歩
3. カテゴリ分類(ラベル分類)
カテゴリ分類とは何か?
テキストデータを、「内容を考慮して」、カテゴリに分けること。
例:ニュース記事分類
日本経済新聞Web版 1/30 http://www.nikkei.com/article/DGXLASGM30H0T_Q7A130C1...
カテゴリ分類とは何か?
テキストデータを、「内容を考慮して」、カテゴリに分けること。
例:ニュース記事分類
カテゴリ分類
モデル
「国際」カテゴリ
カテゴリ分類とは何か?
テキストデータを、「内容を考慮して」、カテゴリに分けること。
例:ニュース記事分類
カテゴリ分類
モデル
「国際」カテゴリ
カテゴリ体系は「モデル」を作成す
る人が、自由に体系を設計する
カテゴリ分類のアプローチ手法
ルールベース 機械学習ベース
カテゴリ分類のアプローチ手法
ルールベース 機械学習ベース
人手ルールに従った分類
例えば
● 「アメリカ」が出現 ->
「国際」カテゴリ
● 「アメリカ」と「トランプ」
-> 「国際」カテゴリ
● など。
カテゴリ分類のアプローチ手法
ルールベース 機械学習ベース
スコアリングベース
分類器ベース
計算済みの重み付けスコアを使う。
カテゴリごとにスコアを足し算。
最高値のカテゴリ -> 予測カテゴリ。
予測のカテゴリを一意に出力する
例えば
● ...
カテゴリ分類のアプローチ手法
ルールベース 機械学習ベース
スコアリングベース
分類器ベース
人手ルールに従った分類
例えば
● 「アメリカ」が出現 ->
「国際」カテゴリ
● 「アメリカ」と「トランプ」
-> 「国際」カテゴリ
● など。
計...
スコアリングベース、カテゴリ分類の処理フロー
ラベル付き
テキストデータ
重み付け手法
重みスコアデータ
ラベルなし
テキストデータ
形態素分割
カテゴリ
スコア計算
予測
カテゴリ
2章の内容
形態素分割
Pythonでカテゴリ分類をやってみる
サンプルコードはこちら
スコアリング関数のゆるふわ疑似コード
seq_input_tokens; 形態素分割をした入力文 List[str]
dict_weight_score; 重み付けをした辞書データ...
Pythonでカテゴリ分類をやってみる
サンプルコードはこちら
スコアリング関数のゆるふわ疑似コード
{
“自動車ラベル”: 67.322,
“テレビ番組ラベル”: 32.1345,
“映画ラベル”: 23.432,
...
}
出力(dict...
Pythonでカテゴリ分類をやってみる
サンプルコードはこちら
スコアリング関数のゆるふわ疑似コード
{
“自動車ラベル”: 67.322,
“テレビ番組ラベル”: 32.1345,
“映画ラベル”: 23.432,
...
}
出力(dict...
モデルの性能評価をしよう。
「ワイが作ったモデルみてや〜。すごいんやで〜」と自慢するためには、
性能数値があると効果的です。
Accuracy指標
「予測結果が正しかった割合」を示す数値。
Accuracy指標 = N(予測が正解のデータ) /...
モデルの性能評価をしよう。
「ワイが作ったモデルみてや〜。すごいんやで〜」と自慢するためには、
性能数値があると効果的です。
Accuracy指標
評価用データのラベル 予測結果のラベル
自動車 自動車
テレビ番組 自動車
テレビ番組 テレビ番...
評価データの用意方法
重みスコアの作成元に「使わなかった」データを評価に
利用可能なラベル付きデータ
評価データの用意方法
重み付けスコア作成データ 評価用データ
重みスコアの作成元に「使わなかった」データを評価に
注:分類器ベースのモデルでは「N-fold 交差検定」という検証法をよく使います。興味がある人は検索DA☆
ちなみに・・・
サンプルコードでのモデル性能
k(Top-kに正解があったら正解とみなす) Accuracy
1 0.47 (10/21)
3 0.9 (19/21)
まとめ
形態素分割と単語集計
重み付けスコアリング法とキーワード抽出
重み付けスコアリング法とカテゴリ予測
「今すぐできる基礎レベル」を中心に紹介。
「すごいプロジェクト立ち上げるぜ!」の前に
こっそりと個人でやってみることをオススメします☆
自然言語処理 もっと先に進みたい人へ
分類器ベースのカテゴリ分類予測
単語の分散表現 (word2vec)
単語を越えた分散表現
言語モデル (LSTM)
フレーズ対訳モデル (seq2seq)
「こんな感じのこと知っておくといいお」技術
Upcoming SlideShare
Loading in …5
×

サポーターズ勉強会スライド

477 views

Published on

サポーターズ勉強会スライド
https://supporterz.jp/spevents/detail/890

Published in: Technology
  • Be the first to comment

サポーターズ勉強会スライド

  1. 1. 実務で使う自然言語処理をする 2017/3/6 サポーターズ勉強会 @kensuke3238
  2. 2. Who are you ? 三澤 賢佑 (ミツザワ ケンスケ) Github Qiita 愛知県 出身 2012年 大阪外国語大学 ペルシア語科 卒 2014年 奈良先端科学技術大学院大学 卒 エン・ジャパン株式会社 兼 不満買取センター 出向中 データサイエンティスト
  3. 3. 本日の内容はサンプルコードがあります Github Kensuke-Mitsuzawa
  4. 4. 本日の内容はサンプルコードがあります Github Kensuke-Mitsuzawa Dockerコンテナもついてるよ!
  5. 5. なぜ、いまさら はじめの一歩っぽい自然言語処理なのか?
  6. 6. 先端のはやり技術 ≠ ビジネス最前線で使える技術 モデルの中身を理解は不可能。(少なくとも非技術者には) パラメータチューニングもコストがかかる。 ビジネス価値が高い技術とは? ● シンプル、理解しやすい ● 説明可能(間違いの理由を顧客が理解しやすい) ● 早く、安いできる 一方でディープラーニング系の技術は?
  7. 7. 先端技術 = ビジネス最前線技術はいつやってくる? 企業(システム提供者)、システム利用者(一般ユーザー)が みんな「これくらいの間違いはしゃーないわな」と納得できるようになった時。
  8. 8. 先端技術 = ビジネス最前線技術はいつやってくる? 企業(システム提供者)、システム利用者(一般ユーザー)が みんな「これくらいの間違いはしゃーないわな」と納得できるようになった時。 Google photoゴリラ事件 出典 http://jp.wsj.com/articles/SB10468926462754674708104581082773456994848 Google Photoが黒人の人物がうつった写真を 「ゴリラ」と判別してしまった事件。 最初に騒ぎ出したのは、Web系の開発者。 人権団体を中心に大きな騒動になった。
  9. 9. 先端技術 = ビジネス最前線技術はいつやってくる? 企業(システム提供者)、システム利用者(一般ユーザー)が みんな「これくらいの間違いはしゃーないわな」と納得できるようになった時。 Google photoゴリラ事件 出典 http://jp.wsj.com/articles/SB10468926462754674708104581082773456994848 Google Photoが黒人の人物がうつった写真を 「ゴリラ」と判別してしまった事件。 最初に騒ぎ出したのは、Web系の開発者 人権団体を中心に大きな騒動になった。 技術系の人物でも、 このような間違いに厳しい段階。 非技術者にまで意識が浸透するのは、ま だまだ先か?
  10. 10. わかりやすいモデルは不滅 今後の産業界へ技術浸透(主観予想) 産業分野によっては「高い説明可能性」を求められる分野がある。(Ex. 医療系など) わかりやすくて、間違いの理由も理解できるモデルは今後も生き残る。 ディープラーニング系技術 わかりやすいモデル 精度さえよければ、 なんでもええわ!系産業 中身の説明を求める系産業
  11. 11. 自然言語処理への第一歩 1.形態素分割
  12. 12. Q. 形態素分割とはなにか? A. テキストを単語にバラすこと[1] [1] 厳密には単語と形態素は異なる。形態素⊆単語と認識すると良い。
  13. 13. Q. 形態素分割とはなにか? A. テキストを単語にバラすこと[1] [1] 厳密には単語と形態素は異なる。形態素⊆単語と認識すると良い。 なぜ、形態素分割が必要か? ● テキストデータでも集計処理をしたい ● 文、文書の状態だと、機械学習にも適応できない
  14. 14. Q. 形態素分割とはなにか? A. テキストを単語にバラすこと[1] [1] 厳密には単語と形態素は異なる。形態素⊆単語と認識すると良い。 なぜ、形態素分割が必要か? ● テキストデータでも集計処理をしたい ● 文、文書の状態だと、機械学習にも適応できない “きょうは、サポーターズのオフィスにやってきたよ! あしたは、社畜としてバリバリ働くよ。 今週も社畜生活だね! 社畜といえば、ぼくの友だちのAが..(このあとめちゃ長い).”
  15. 15. Q. 形態素分割とはなにか? A. テキストを単語にバラすこと[1] [1] 厳密には単語と形態素は異なる。形態素⊆単語と認識すると良い。 なぜ、形態素分割が必要か? ● テキストデータでも集計処理をしたい ● 文、文書の状態だと、機械学習にも適応できない “きょうは、サポーターズのオフィスにやってきたよ! あしたは、社畜としてバリバリ働くよ。 今週も社畜生活だね! 社畜といえば、ぼくの友だちのAが..(このあとめちゃ長い).” テキストの内容を俯瞰したい。 集計するにはどうしたら・・・?
  16. 16. Q. 形態素分割とはなにか? A. テキストを単語にバラすこと[1] [1] 厳密には単語と形態素は異なる。形態素⊆単語と認識すると良い。 なぜ、形態素分割が必要か? “きょうは、サポーターズのオフィスにやってきたよ! あしたは、社畜としてバリバリ働くよ。 今週も社畜生活だね! 社畜といえば、ぼくの友だちのAが..(このあとめちゃ長い).” 単語 頻度 社畜 23 休日 20 働く 15 ... ... ● テキストデータでも集計処理をしたい ● 文、文書の状態だと、機械学習にも適応できない
  17. 17. Q. 形態素分割とはなにか? A. テキストを単語にバラすこと[1] [1] 厳密には単語と形態素は異なる。形態素⊆単語と認識すると良い。 なぜ、形態素分割が必要か? “きょうは、サポーターズのオフィスにやってきたよ! あしたは、社畜としてバリバリ働くよ。 今週も社畜生活だね! 社畜といえば、ぼくの友だちのAが..(このあとめちゃ長い).” 単語 頻度 社畜 23 休日 20 働く 15 ... ... あっ、こいつ、自虐かよ・・・(´・ω・`) ● テキストデータでも集計処理をしたい ● 文、文書の状態だと、機械学習にも適応できない
  18. 18. えっ、なんだか難しそう・・・? たった1行で完結 on unixコンソール % echo "きょうは、サポーターズのオフィスにやってきたよ!" | mecab -d /usr/local/lib/mecab/dic/mecab- ipadic-neologd きょう 名詞,副詞可能,*,*,*,*,きょう,キョウ,キョー は 助詞,係助詞,*,*,*,*,は,ハ,ワ 、 記号,読点,*,*,*,*,、,、,、 サポーターズ 名詞,一般,*,*,*,*,* の 助詞,連体化,*,*,*,*,の,ノ,ノ オフィス 名詞,一般,*,*,*,*,オフィス,オフィス,オフィス に 助詞,格助詞,一般,*,*,*,に,ニ,ニ やってき 動詞,自立,*,*,カ変・クル,連用形,やってくる,ヤッテキ,ヤッテキ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ よ 助詞,終助詞,*,*,*,*,よ,ヨ,ヨ ! 記号,一般,*,*,*,*,!,!,! EOS
  19. 19. えっ、なんだか難しそう・・・? たった1行で完結 on python In [2]: from JapaneseTokenizer import MecabWrapper In [3]: MecabWrapper('neologd').¥ tokenize('きょうは、サポーターズのオフィスにやってきたよ!').¥ convert_list_object() Out[3]: ['きょう', 'は', '、', 'サポーターズ', 'の', 'オフィス', 'に', 'やってくる', 'た', 'よ', '!']
  20. 20. 形態素解析器の仕組み 「辞書データ + 形態素解析モデル」の組み合わせ。 「形態素解析モデル」は、ツールごとに違うアルゴリズムを採用 形態素解析器 辞書データ 形態素解析モデル
  21. 21. 形態素解析器の勢力 (主観) ツール名 特徴 Mecab 形態素解析界で一番有名。とりあえずMecabという風潮がある。 とにかく、動作が早い。 Kuromoji ElasticSearchとペアで使われる鉄板的な存在。 動作アルゴリズムに不透明なところがある。 Juman 人手でパラメタチューニングがされている。味があるツール。 単語の意味分類も教えてくれる。 Juman++ 日本語で最初にディープラーニング系のアルゴリズムを導入した。 いまのところ、最高精度。 Kytea 他とはまったく違うアルゴリズムを利用。 形態素解析研究コミュニティが好んでいる傾向がある。 RakutenMA 楽天市場の商品名を精度よく区切るためにチューニングされている Chasen Mecabの1世代前の子。いまは積極的に使われていない
  22. 22. 辞書の勢力 (主観) 辞書名 特徴 IPA辞書 Mecabの標準辞書としてアナウンスされている。 IPA-neologd辞書 IPA-Dicの体系で、新語に対応させまくっている。 Web系の新語にとにかく対応したいのなら、これ。 Unidc辞書 国立国語研究所で作成されている辞書 解析性能自体は、Unidicが一番高い。 Naist-j 辞書 Naistで作成された辞書。現在はメンテナンスされていない。 Juman辞書 Juman用の辞書。IPA辞書とは別の品詞体系を利用している。 意味分類が細かい。 “駅” -> 「交通・ドメイン」など 辞書の比較詳細に関しては、以下のページや論文を参加にしてください。 - 形態素解析に使う辞書は何が適切なのか? - 形態素解析辞書のベンチマークテスト
  23. 23. 形態素解析の性能とこれから 「きれいな文(新聞記事)」で98%くらいの分割精度(Mecab) チャレンジ内容は「Web分野」や「話し言葉」への対応
  24. 24. 形態素解析の性能とこれから 「きれいな文(新聞記事)」で98%くらいの分割精度(Mecab) チャレンジ内容は「Web分野」や「話し言葉」への対応 Web分野と話し言葉への対応 Web文書には「Mecab + IPA neologd辞書」の組み合わせで処理する人は多い。 Juman++に乗り換える人が増えてきている印象 (2017/3時点)
  25. 25. Pythonでやってみる形態素分割と単語集計 “JapaneseTokenizer”で基本的なことがカバーできる。 Mecab, Juman, Juman++, Kyteaの呼び出し 品詞でフィルタリング Stopword(分割結果から除外したい語)のフィルタリング 形態素分割 単語集計 Python標準のcollection.Counterクラスで一発処理 詳しくはサンプルコード on Githubを見てください
  26. 26. 自然言語処理への第一歩 2. キーワード抽出
  27. 27. どうしてキーワード抽出が必要か? 形態素の集計では、意味がない単語の出現
  28. 28. どうしてキーワード抽出が必要か? 単語 頻度 する 2513 なる 554 演 283 ある 270 信繁 195 Wikipediaの「テレビ番組」に関係する15文書を集計。 品詞には「動詞・自立」、「形容詞・自立」、「名詞・固有名詞」を利用。 形態素の集計では、意味がない単語の出現
  29. 29. どうしてキーワード抽出が必要か? 単語 頻度 する 2513 なる 554 演 283 ある 270 信繁 195 Wikipediaの「テレビ番組」に関係する15文書を集計。 品詞には「動詞・自立」、「形容詞・自立」、「名詞・固有名詞」を利用。 単語 CM 視聴者 視聴率 24時間テレビ 制作進行 理想的にはこんな 感じの出力がいい 形態素の集計では、意味がない単語の出現
  30. 30. キーワード抽出へのアプローチ キーワード抽出へのアプローチは大きく2つある。 今回は「データ重み付け」アプローチを紹介 データ重み付け データベース照 合 文の集合に重み付け計算を行なう。 文や文書につけられた「ラベル」ベース ラベルごとの出現差分を計算に考慮 既存のデータベースを「正解」のキーワード 既存のデータベースと照合して、キーワード 抽出。 Wikipediaがよく使われる。
  31. 31. 重み付けアプローチの実例紹介 不満買取センターでの実例。 「不満で振り返る2016年 各月の注目キーワードTOP5」 【1月】 新成人 正月太り 大寒波 正月三が日 バルス 【2月】 歯舞 春一番 立春 グラミー賞 台湾地震 【3月】 ナベツネ なでしこJAPAN 開花宣言 大相撲三月場 所 無観客試合 【4月】 エイプリル・フール 前震 前田健 桃田 震災対応 (1月分〜4月分までを抜粋) 抽出されたキーワード
  32. 32. 重み付けアプローチの実例紹介 不満買取センターでの実例。 「不満で振り返る2016年 各月の注目キーワードTOP5」 抽出フローチャート 不満買取センター DB 形態素分割 重み付け 計算 キーワード 単語集合
  33. 33. (2分でわかる)重み付け手法の概念 ある単語aについて、ラベルAとあるラベルBの出現差分を比較する。 (ラベルベース重み付け手法の場合) ラベル- テレビ番組 ラベル- 自動車 新車 トヨタ CM 多様な 視聴率 イグニッション 新車 トヨタ 多様な 多様な あう 販売 新車 ホンダ 低燃費 新車 多様な CM 視聴者 多様な CM CM 視聴率 CM 多様な 視聴率 視聴者 視聴率 多様な 新車 多様な CM 視聴率
  34. 34. (2分でわかる)重み付け手法の概念 ある単語aについて、ラベルAとあるラベルBの出現差分を比較する。 ラベル- テレビ番組 ラベル- 自動車 新車 トヨタ CM 多様な 視聴率 イグニッション 新車 トヨタ 多様な 多様な あう 販売 新車 ホンダ 低燃費 新車 多様な ラベルつき「複数文書」 「ラベル- テレビ番組」の文書が4文書 CM 視聴者 多様な CM CM 視聴率 CM 多様な 視聴率 視聴者 視聴率 多様な 新車 多様な CM 視聴率
  35. 35. ある単語aについて、ラベルAとあるラベルBの出現差分を比較する。 ラベル- テレビ番組 ラベル- 自動車 CM 視聴者 多様な CM CM 視聴率 CM 多様な 視聴率 視聴者 視聴率 多様な 新車 多様な CM 視聴率 新車 トヨタ CM 多様な 視聴率 トヨタ 新車 トヨタ 多様な 多様な あう 販売 新車 ホンダ 低燃費 新車 多様な 灰色四角=1文書 単語は文書に出現する単語 (2分でわかる)重み付け手法の概念
  36. 36. ラベル頻度をカウントすると ラベル頻度(Documen Frequency); 単語が出現した「文書数」。単語頻度ではない。 ラベル- テレビ番組 ラベル- 自動車 単語 ラベル頻度 CM 3 視聴率 3 多様な 4 新車 1 単語 ラベル頻度 CM 1 視聴率 1 多様な 4 新車 4 (2分でわかる)重み付け手法の概念
  37. 37. ラベル頻度をカウントすると ラベル頻度(Documen Frequency); 単語が出現した「文書数」。単語頻度ではない。 ラベル- テレビ番組 ラベル- 自動車 単語 頻度 差分 CM 3 +2 視聴率 3 +2 多様な 4 0 新車 1 -3 単語 頻度 差分 CM 1 -2 視聴率 1 -2 多様な 4 0 新車 4 +3 (2分でわかる)重み付け手法の概念 差分が大きい単語 ≒「ラベルに固有の単語」 大きな重みスコア
  38. 38. ラベル頻度をカウントすると ラベル頻度(Documen Frequency); 単語が出現した「文書数」。単語頻度ではない。 ラベル- テレビ番組 ラベル- 自動車 単語 頻度 差分 CM 3 +2 視聴率 3 +2 多様な 4 0 新車 1 -3 単語 頻度 差分 CM 1 -2 視聴率 1 -2 多様な 4 0 新車 4 +3 (2分でわかる)重み付け手法の概念 差分がない単語 ≒ 「一般的な単語」 低い重みスコア(または0)
  39. 39. Q. どんなラベルを使えばいいのか? A. なんでもいい。 キーワードを分類する「カテゴリ」として意味ありそうなら。 ラベル情報の例 ● 「タグ」のようなメタデータ ● 人手で分類をして、付与してきた「タグ」 ● タイムスタンプ (週単位、月単位に変換して「ラベル」に) ● 人手で最初にキーワード設定。キーワードを「ラベル」にして使う。 などなど。
  40. 40. Pythonで重み付けアプローチをやってみる DocumentFeatureSelectionを使えば、TF-IDF, BNS, PMI, SOAが実行可能 Inputのデータ構造 { “ラベル名-1”: [ [文1に出現する単語], [文2に出現する単語], ], “ラベル名-2”: [ [文1に出現する単語], [文2に出現する単語], ], }
  41. 41. Pythonで重み付けアプローチをやってみる Inputのデータ構造 { "テレビ番組": [ ["視聴率", "CM", "CM", "多様な", "新車", "視聴者"], ["トヨタ", "CM", "CM", "多様な", "視聴者"], ["CM", "CM", "多様な", "視聴者", "視聴率"], ], "自動車": [ ["新車", "トヨタ", "視聴率", "CM", "多様な"], ["新車", "トヨタ", "販売", "多様な"], ["新車", "販売店", "低燃費", "トヨタ", "多様な"], ["新車", "販売店", "低燃費", "ホンダ", "多様な"], ]}
  42. 42. Pythonで重み付けアプローチをやってみる In [1]: from DocumentFeatureSelection import interface In [2] : データは前スライドの入力データを利用。input_dict = 前スライドのデータ In [3]: interface.run_feature_selection(input_dict=input_dict,method='soa').ScoreMatrix2ScoreDictionary() Out[3]: [{'label': 'テレビ番組', 'score': 2.0, 'word': 'CM'}, {'label': '自動車', 'score': 1.5849625007211563, 'word': '新車'}, {'label': 'テレビ番組', 'score': 1.4150374992788437, 'word': '視聴率'}, {'label': '自動車', 'score': 1.1699250014423124, 'word': 'トヨタ'}, {'label': 'テレビ番組', 'score': -1.1699250014423124, 'word': 'トヨタ'}, ...略 サンプルコード
  43. 43. Pythonで重み付けアプローチをやってみる In [1]: from DocumentFeatureSelection import interface In [2] : データは前スライドの入力データを利用。input_dict = 前スライドのデータ In [3]: interface.run_feature_selection(input_dict=input_dict,method='soa').ScoreMatrix2ScoreDictionary() Out[3]: [{'label': 'テレビ番組', 'score': 2.0, 'word': 'CM'}, {'label': '自動車', 'score': 1.5849625007211563, 'word': '新車'}, {'label': 'テレビ番組', 'score': 1.4150374992788437, 'word': '視聴率'}, {'label': '自動車', 'score': 1.1699250014423124, 'word': 'トヨタ'}, {'label': 'テレビ番組', 'score': -1.1699250014423124, 'word': 'トヨタ'}, ...略 サンプルコード method = ‘手法名’を指定すればOK
  44. 44. Pythonで重み付けアプローチをやってみる In [1]: from DocumentFeatureSelection import interface In [2] : データは前スライドの入力データを利用。input_dict = 前スライドのデータ In [3]: interface.run_feature_selection(input_dict=input_dict,method='soa').ScoreMatrix2ScoreDictionary() Out[9]: [{'label': 'テレビ番組', 'score': 2.0, 'word': 'CM'}, {'label': '自動車', 'score': 1.5849625007211563, 'word': '新車'}, {'label': 'テレビ番組', 'score': 1.4150374992788437, 'word': '視聴率'}, {'label': '自動車', 'score': 1.1699250014423124, 'word': 'トヨタ'}, {'label': 'テレビ番組', 'score': -1.1699250014423124, 'word': 'トヨタ'}, ...略 サンプルコード “CM”がテレビ番組, “新車”が自動車 のラベルで高いスコアになった!
  45. 45. Pythonで重み付けアプローチをやってみる シンプルにデータ入力できるインターフェース 4手法が利用可能 高速な計算 Cythonを利用 巨大データへのスケール性 10GB程度までのテキストデータに対応実績あり[1] DocumentFeatureSelectionの特徴 [1] 64GBメモリマシンで実行。メモリを95%程度まで使い切り
  46. 46. 自然言語処理への第一歩 3. カテゴリ分類(ラベル分類)
  47. 47. カテゴリ分類とは何か? テキストデータを、「内容を考慮して」、カテゴリに分けること。 例:ニュース記事分類 日本経済新聞Web版 1/30 http://www.nikkei.com/article/DGXLASGM30H0T_Q7A130C1MM0000/
  48. 48. カテゴリ分類とは何か? テキストデータを、「内容を考慮して」、カテゴリに分けること。 例:ニュース記事分類 カテゴリ分類 モデル 「国際」カテゴリ
  49. 49. カテゴリ分類とは何か? テキストデータを、「内容を考慮して」、カテゴリに分けること。 例:ニュース記事分類 カテゴリ分類 モデル 「国際」カテゴリ カテゴリ体系は「モデル」を作成す る人が、自由に体系を設計する
  50. 50. カテゴリ分類のアプローチ手法 ルールベース 機械学習ベース
  51. 51. カテゴリ分類のアプローチ手法 ルールベース 機械学習ベース 人手ルールに従った分類 例えば ● 「アメリカ」が出現 -> 「国際」カテゴリ ● 「アメリカ」と「トランプ」 -> 「国際」カテゴリ ● など。
  52. 52. カテゴリ分類のアプローチ手法 ルールベース 機械学習ベース スコアリングベース 分類器ベース 計算済みの重み付けスコアを使う。 カテゴリごとにスコアを足し算。 最高値のカテゴリ -> 予測カテゴリ。 予測のカテゴリを一意に出力する 例えば ● SVM ● ニューラルネットワーク ● など 人手ルールに従った分類 例えば ● 「アメリカ」が出現 -> 「国際」カテゴリ ● 「アメリカ」と「トランプ」 -> 「国際」カテゴリ ● など。
  53. 53. カテゴリ分類のアプローチ手法 ルールベース 機械学習ベース スコアリングベース 分類器ベース 人手ルールに従った分類 例えば ● 「アメリカ」が出現 -> 「国際」カテゴリ ● 「アメリカ」と「トランプ」 -> 「国際」カテゴリ ● など。 計算済みの重み付けスコアを使う。 カテゴリごとにスコアを足し算。 最高値のカテゴリ -> 予測カテゴリ。 予測のカテゴリを一意に出力する 例えば ● SVM ● ニューラルネットワーク ● など
  54. 54. スコアリングベース、カテゴリ分類の処理フロー ラベル付き テキストデータ 重み付け手法 重みスコアデータ ラベルなし テキストデータ 形態素分割 カテゴリ スコア計算 予測 カテゴリ 2章の内容 形態素分割
  55. 55. Pythonでカテゴリ分類をやってみる サンプルコードはこちら スコアリング関数のゆるふわ疑似コード seq_input_tokens; 形態素分割をした入力文 List[str] dict_weight_score; 重み付けをした辞書データ。Ex.{‘単語’: [ (‘自動車ラベル’, 4.023) ]} dict_label_score = {} // ラベルごとのスコア足し算結果を保存するハッシュマップ for token in seq_input_tokens { 1. “token” が “dict_weight_score” にあるかチェックする。なければ、next 2. “token” のラベルごとのスコアを dict_label_score に保存する。 }
  56. 56. Pythonでカテゴリ分類をやってみる サンプルコードはこちら スコアリング関数のゆるふわ疑似コード { “自動車ラベル”: 67.322, “テレビ番組ラベル”: 32.1345, “映画ラベル”: 23.432, ... } 出力(dict_label_score)はこのようになる。(数値は適当な例)
  57. 57. Pythonでカテゴリ分類をやってみる サンプルコードはこちら スコアリング関数のゆるふわ疑似コード { “自動車ラベル”: 67.322, “テレビ番組ラベル”: 32.1345, “映画ラベル”: 23.432, ... } 出力(dict_label_score)はこのようになる。(数値は適当な例) 予測結果を1つだけにしたい。 -> スコアが最大なTop1だけ使う。 予測ラベルを複数つけたい。 -> 上からスコア多い順にN件使う。
  58. 58. モデルの性能評価をしよう。 「ワイが作ったモデルみてや〜。すごいんやで〜」と自慢するためには、 性能数値があると効果的です。 Accuracy指標 「予測結果が正しかった割合」を示す数値。 Accuracy指標 = N(予測が正解のデータ) / N(評価用のデータ)
  59. 59. モデルの性能評価をしよう。 「ワイが作ったモデルみてや〜。すごいんやで〜」と自慢するためには、 性能数値があると効果的です。 Accuracy指標 評価用データのラベル 予測結果のラベル 自動車 自動車 テレビ番組 自動車 テレビ番組 テレビ番組 映画 映画 Accuracy指標; 0.75 = 3 / 4
  60. 60. 評価データの用意方法 重みスコアの作成元に「使わなかった」データを評価に 利用可能なラベル付きデータ
  61. 61. 評価データの用意方法 重み付けスコア作成データ 評価用データ 重みスコアの作成元に「使わなかった」データを評価に 注:分類器ベースのモデルでは「N-fold 交差検定」という検証法をよく使います。興味がある人は検索DA☆
  62. 62. ちなみに・・・ サンプルコードでのモデル性能 k(Top-kに正解があったら正解とみなす) Accuracy 1 0.47 (10/21) 3 0.9 (19/21)
  63. 63. まとめ 形態素分割と単語集計 重み付けスコアリング法とキーワード抽出 重み付けスコアリング法とカテゴリ予測 「今すぐできる基礎レベル」を中心に紹介。 「すごいプロジェクト立ち上げるぜ!」の前に こっそりと個人でやってみることをオススメします☆
  64. 64. 自然言語処理 もっと先に進みたい人へ 分類器ベースのカテゴリ分類予測 単語の分散表現 (word2vec) 単語を越えた分散表現 言語モデル (LSTM) フレーズ対訳モデル (seq2seq) 「こんな感じのこと知っておくといいお」技術

×