Nlp4 l intro-20150513
-
Upload
koji-sekiguchi -
Category
Technology
-
view
1.867 -
download
0
Transcript of Nlp4 l intro-20150513
楽しいNLP4LLuceneのための自然言語処理ツール
のご紹介関口宏司@ロンウイット
@kojisays
* 個人の感想です。
*
1
NLP4Lとは?Natural Language Processing for Lucene
ScalaベースのOSSプロジェクト
生テキストの代わりにLuceneインデックスのデータを使う
Luceneの強力なAnalyzerが使える
単語カウント、単語N-gramカウント、自由な基準による文書ベクトルが容易に取得できる
独自MLツール+他MLツールとの連携機能
2
従来のNLPツールとの違い
NLPツール
コーパス(テキストデータ)
モデル等
ツールや目的に合わせて都度正規化
NLP4L
Luceneインデックス
Analyzer
コーパス(テキストデータ)
モデル、文書ベクトル等
Luceneの強力なAnalyzerにより自由に正規化
3
Luceneインデックスの基本
インデックスに登録するテキストデータを用意
1. カツオはサザエの弟
2. サザエはワカメの姉
3. ワカメはカツオの妹
4
Luceneインデックスの基本
単語に分割して整理
カツオ:1, は:1, サザエ:1, の:1, 弟:1
サザエ:2, は:2, ワカメ:2, の:2, 姉:2
ワカメ:3, は:3, カツオ:3, の:3, 妹:3
5
Luceneインデックスの基本
転置インデックスのできあがり
の 1, 2, 3は 1, 2, 3カツオ 1, 3サザエ 1, 2ワカメ 2, 3弟 1姉 2妹 3
6
NLP4LによるLuceneインデックスの利用
の 1, 2, 3は 1, 2, 3カツオ 1, 3サザエ 1, 2ワカメ 2, 3弟 1姉 2妹 3
Lucene/NLP4Lの関数termFreqtotalTermFreqdocFreq
:
正規化済みの性質のよい単語
7
アーキテクチャー
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
活用例
Lucene/Solr向け類義語辞書の自動生成
企業が保有するデータと公開データの名寄せ
トピックモデルを使ったレコメンド
9
開発メンバー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
楽しい その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
楽しい その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
楽しい その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
楽しい その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
楽しい その5
ShingleFilterが意外に活躍するところを目の当たりにして楽しい!
応用例
言語モデル
隠れマルコフモデル
連語分析モデル15
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
言語モデル
言語の流暢さを表す
Nグラムモデル=最も広範に使われる言語モデル
2グラムモデルの計算例
17
Luceneインデックスと言語モデル
ShingleFilterを使ったフィールドがあれば、Luceneインデックスから言語モデルが計算可能
*NLP4LではTermDocs.totalTermFreq()で単語出現数を得られます。
ShingleFilter(N=2)のフィールドで”an apple”の出現数をカウント
通常のフィールドで”an”の出現数をカウント
18
ShingleFilterを使ったサンプル
隠れマルコフモデル
hmm_postagger.scala
trans_katakana_alpha.scala
連語分析モデル
colloc_analysis_[brown|ldcc].scala
Brownコーパスを学習して品詞タグを付加するサンプル
カタカナ語・英単語対応データを学習してカタカナ語から英単語を推定するサンプル
アルク社「英辞郎 on the WEB Pro」の「頻度集計」ライクな出力をするサンプル
19
アルク社:英辞郎 on the WEB Pro
20
CollocationalAnalysisModel
連語分析のためのデータモデル
アルク社「英辞郎 on the WEB Pro」の頻度集計と同じことができる
ShingleFilter + BothEndsFilter(自作)
21