Más contenido relacionado Más de Koji Sekiguchi (20) Nlp4 l intro-201505132. NLP4Lとは?
Natural Language Processing for Lucene
ScalaベースのOSSプロジェクト
生テキストの代わりにLuceneインデックスのデータを使う
Luceneの強力なAnalyzerが使える
単語カウント、単語N-gramカウント、自由な基準による文書
ベクトルが容易に取得できる
独自MLツール+他MLツールとの連携機能
2
5. Luceneインデックスの基本
単語に分割して整理
カツオ:1, は:1, サザエ:1, の:1, 弟:1
サザエ:2, は:2, ワカメ:2, の:2, 姉:2
ワカメ:3, は:3, カツオ:3, の:3, 妹:3
5
8. アーキテクチャー
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
10. 開発メンバー
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
12. 楽しい その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
13. 楽しい その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
14. 楽しい その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