楽しいNLP4L
Luceneのための自然言語処理ツール
のご紹介
関口宏司@ロンウイット
@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の関数
termFreq
totalTermFreq
docFreq
:
正規化済みの
性質のよい単語
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

Nlp4 l intro-20150513