nlp4 l intro-20150513

21
楽しいNLP4L Luceneのための自然言語処理ツール のご紹介 関口宏司@ロンウイット @kojisays * 個人の感想です。 * 1

Upload: koji-sekiguchi

Post on 20-Jul-2015

1.867 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Nlp4 l intro-20150513

楽しいNLP4LLuceneのための自然言語処理ツール

のご紹介関口宏司@ロンウイット

@kojisays

* 個人の感想です。

*

1

Page 2: Nlp4 l intro-20150513

NLP4Lとは?Natural Language Processing for Lucene

ScalaベースのOSSプロジェクト

生テキストの代わりにLuceneインデックスのデータを使う

Luceneの強力なAnalyzerが使える

単語カウント、単語N-gramカウント、自由な基準による文書ベクトルが容易に取得できる

独自MLツール+他MLツールとの連携機能

2

Page 3: Nlp4 l intro-20150513

従来のNLPツールとの違い

NLPツール

コーパス(テキストデータ)

モデル等

ツールや目的に合わせて都度正規化

NLP4L

Luceneインデックス

Analyzer

コーパス(テキストデータ)

モデル、文書ベクトル等

Luceneの強力なAnalyzerにより自由に正規化

3

Page 4: Nlp4 l intro-20150513

Luceneインデックスの基本

インデックスに登録するテキストデータを用意

1. カツオはサザエの弟

2. サザエはワカメの姉

3. ワカメはカツオの妹

4

Page 5: Nlp4 l intro-20150513

Luceneインデックスの基本

単語に分割して整理

カツオ:1, は:1, サザエ:1, の:1, 弟:1

サザエ:2, は:2, ワカメ:2, の:2, 姉:2

ワカメ:3, は:3, カツオ:3, の:3, 妹:3

5

Page 6: Nlp4 l intro-20150513

Luceneインデックスの基本

転置インデックスのできあがり

の 1, 2, 3は 1, 2, 3カツオ 1, 3サザエ 1, 2ワカメ 2, 3弟 1姉 2妹 3

6

Page 7: Nlp4 l intro-20150513

NLP4LによるLuceneインデックスの利用

の 1, 2, 3は 1, 2, 3カツオ 1, 3サザエ 1, 2ワカメ 2, 3弟 1姉 2妹 3

Lucene/NLP4Lの関数termFreqtotalTermFreqdocFreq

:

正規化済みの性質のよい単語

7

Page 8: Nlp4 l intro-20150513

アーキテクチャー

Apache Lucene API

Scala Driver for Lucene (Analyzer, Word-counter, FST dictionary etc.)

Scala High Level API (for convenience in text mining, stats etc.)

Index Schema Browser (GUI/CUI)

File based Mahout/Spark connector

Lucene Index Model

RDD for Spark

Index

Interactive Shell for NLP4L

(REPL)

*2015年5月現在、提供されていない機能も含みます。8

Page 9: Nlp4 l intro-20150513

活用例

Lucene/Solr向け類義語辞書の自動生成

企業が保有するデータと公開データの名寄せ

トピックモデルを使ったレコメンド

9

Page 10: Nlp4 l intro-20150513

開発メンバーTomoko Uchida

Pure Python FST & Morphological Analyzer developer

Koji Sekiguchi

Apache Lucene/Solr Committer & PMC member

Tommaso Teofili

Apache Lucene/Solr, UIMA, OpenNLP, Hama, etc. Committer

10

Page 11: Nlp4 l intro-20150513

楽しい その1

日本語チュートリアルがついていてすぐ試せるから楽しい!

http://nlp4l.github.io/tutorial_ja.htmlビルドからサンプルコーパスダウンロード、インデクシングまでわずか1分

$ git clone https://github.com/NLP4L/nlp4l.git // NLP4Lの取得$ cd nlp4l$ sbt pack // ビルド$ ./target/pack/bin/nlp4l // REPLの起動nlp4l> downloadLdcc // サンプルコーパスのダウンロードnlp4l> :load examples/index_ldcc.scala // Luceneインデックスの作成

11

Page 12: Nlp4 l intro-20150513

楽しい その2

REPLからLuceneインデックスブラウザが動くから楽しい!

nlp4l> :? // ヘルプの表示nlp4l> open(“/tmp/index-ldcc”) // Luceneインデックスのオープンnlp4l> status // Luceneインデックスの状態表示nlp4l> browseTerms(“title”) // titleフィールドの単語一覧を取得する宣言nlp4l> nt // 「次」の単語一覧の表示nlp4l> nextTerms(500) // 500単語スキップして表示nlp4l> topTerms(100) // titleフィールドのトップ100単語の表示

12

Page 13: Nlp4 l intro-20150513

楽しい その3

LuceneのいろいろなAnalyzerがREPLから使えるので楽しい!

# StandardAnalyzer を取得nlp4l> val analyzer1 = Analyzer(new org.apache.lucene.analysis.standard.StandardAnalyzer)# StandardAnalyzer で英文を解析nlp4l> analyzer1.tokens(“Lucene is a popular software.”)# JapaneseAnalyzer を取得nlp4l> val analyzer2 = Analyzer(new org.apache.lucene.analysis.ja.JapaneseAnalyzer)# JapaneseAnalyzer で日本語文を解析nlp4l> analyzer2.tokens(“旅にこだわりたい若者から人気”)

13

Page 14: Nlp4 l intro-20150513

楽しい その4

Luceneの処理結果をScalaで加工できるので楽しい!

# 名詞のみterm要素を表示nlp4l> analyzer2.tokens(“旅にこだわりたい若者から人気").

filter(_.getOrElse("partOfSpeech",null).startsWith("名詞")).map(_.getOrElse("term",null))

# 簡単ファセット(カテゴリごとの文書数をカウント)nlp4l> val searcher = ISearcher(“/tmp/index-ldcc”)nlp4l> searcher.search(rows=10000).map(_.getValue("cat").get(0)).foldLeft(scala.collection.mutable.Map.empty[String, Int]){(m,c) => m += (c -> (m.getOrElse(c,0)+1))}.foreach(println(_))

14

Page 15: Nlp4 l intro-20150513

楽しい その5

ShingleFilterが意外に活躍するところを目の当たりにして楽しい!

応用例

言語モデル

隠れマルコフモデル

連語分析モデル15

Page 16: Nlp4 l intro-20150513

ShingleFilterとは?

単語Nグラムフィルター

WhitespaceTokenizer

ShingleFilter (N=2)

“Lucene is a popular software”

Lucene/is/a/popular/software

Lucene is/is a/a popular/popular software

16

Page 17: Nlp4 l intro-20150513

言語モデル

言語の流暢さを表す

Nグラムモデル=最も広範に使われる言語モデル

2グラムモデルの計算例

17

Page 18: Nlp4 l intro-20150513

Luceneインデックスと言語モデル

ShingleFilterを使ったフィールドがあれば、Luceneインデックスから言語モデルが計算可能

*NLP4LではTermDocs.totalTermFreq()で単語出現数を得られます。

ShingleFilter(N=2)のフィールドで”an apple”の出現数をカウント

通常のフィールドで”an”の出現数をカウント

18

Page 19: Nlp4 l intro-20150513

ShingleFilterを使ったサンプル

隠れマルコフモデル

hmm_postagger.scala

trans_katakana_alpha.scala

連語分析モデル

colloc_analysis_[brown|ldcc].scala

Brownコーパスを学習して品詞タグを付加するサンプル

カタカナ語・英単語対応データを学習してカタカナ語から英単語を推定するサンプル

アルク社「英辞郎 on the WEB Pro」の「頻度集計」ライクな出力をするサンプル

19

Page 20: Nlp4 l intro-20150513

アルク社:英辞郎 on the WEB Pro

20

Page 21: Nlp4 l intro-20150513

CollocationalAnalysisModel

連語分析のためのデータモデル

アルク社「英辞郎 on the WEB Pro」の頻度集計と同じことができる

ShingleFilter + BothEndsFilter(自作)

21