NLP4L は Scala で書かれた Apache Lucene のための自然言語処理ツールです。NLP4L は、NLP 技術を用いて Lucene ユーザの検索エクスペリエンスを向上させることを主な目的としています。たとえば、Lucene/Solr は検索キーワードのオートコンプリートやサジェスチョンの機能などを今でも提供していますが、NLP4L の開発メンバーは NLP 技術を適用することでよりよいキーワードを提示することが可能ではないかと考えています。また、NLP4L は既存の機械学習ツールと連携するための機能も提供します。たとえば、Lucene インデックスから直接文書ベクトルを生成し、LIBSVM 形式のファイルに出力することができます。
NLP4L は Lucene インデックスに登録されている文書データを処理対象にしています。そのため、Lucene の強力な Analyzer によって正規化された単語データベースに直接アクセスができるほか、便利な検索機能が使えます。また Scala で書かれているため、会話型でアドホックな処理を試すなども得意としています。
詳しいドキュメントは以下をご覧ください。
- Lucene/Solr/Elasticsearch など、Apache Lucene のユーザ
- Apache Spark や Apache Mahout など既存の機械学習ツールへの入力に、さまざまな文書ベクトルを試したいユーザ
- その他の NLPツールユーザや Scala プログラマ
$ sbt pack
$ target/pack/bin/nlp4l
Welcome to NLP4L!
Type in expressions to have them evaluated.
Type :help for more information
Type :? for information about NLP4L utilities
nlp4l>
nlp4l> :?
nlp4l> :? open
-- method signature --
def open(idxDir: String): RawReader
-- description --
Open Lucene index in the directory. If an index already opened, that is closed before the new index will be opened.
-- arguments --
idxDir Lucene index directory
-- return value --
Return : index reader
-- usage --
nlp4l> open("/tmp/myindex")
nlp4l> open("/tmp/index-ldcc")
Index /tmp/index-ldcc was opened.
res4: org.nlp4l.core.RawReader = IndexReader(path='/tmp/index-ldcc',closed=false)
nlp4l> status
========================================
Index Path : /tmp/index-ldcc
Closed : false
Num of Fields : 5
Num of Docs : 7367
Num of Max Docs : 7367
Has Deletions : false
========================================
Fields Info:
========================================
# | Name | Num Terms
----------------------------------------
0 | body | 64543
1 | url | 7367
2 | date | 6753
3 | title | 14205
4 | cat | 9
========================================
nlp4l> browseTerms("title")
Browse terms for field 'title', page size 20
Type "nextTerms(skip)" or "nt" to browse next terms.
Type "prevTerms(skip)" or "pt" to browse prev terms.
Type "topTerms(n)" to find top n frequent terms.
// nt で次のページ
nlp4l> nt
Indexed terms for field 'title'
0 (DF=152, Total TF=176)
000 (DF=13, Total TF=13)
003 (DF=3, Total TF=3)
0048 (DF=1, Total TF=1)
007 (DF=8, Total TF=8)
...
// pt で前のページに戻る
nlp4l> pt
Indexed terms for field 'title'
chat (DF=1, Total TF=1)
check (DF=2, Total TF=2)
chochokure (DF=1, Total TF=1)
christian (DF=1, Total TF=1)
...
nlp4l> browseTermDocs("title", "iphone")
Browse docs for term 'iphone' in field 'title', page size 20
Type "nextDocs(skip)" or "nd" to browse next terms.
Type "prevDocs(skip)" or "pd" to browse prev terms.
// nd で次のページ
nlp4l> nd
Documents for term 'iphone' in field 'title'
Doc(id=49, freq=1, positions=List(pos=5))
Doc(id=270, freq=1, positions=List(pos=0))
Doc(id=648, freq=1, positions=List(pos=0))
Doc(id=653, freq=1, positions=List(pos=2))
Doc(id=778, freq=1, positions=List(pos=2))
Doc(id=780, freq=2, positions=List(pos=0, pos=15))
...
// pd で前のページに戻る
nlp4l> pd
Documents for term 'iphone' in field 'title'
Doc(id=1173, freq=1, positions=List(pos=1))
Doc(id=1176, freq=1, positions=List(pos=0))
Doc(id=1180, freq=1, positions=List(pos=2))
Doc(id=1195, freq=1, positions=List(pos=5))
Doc(id=1200, freq=1, positions=List(pos=11))
Doc(id=1203, freq=1, positions=List(pos=5))
...
nlp4l> showDoc(1195)
Doc #1195
(Field) cat: [it-life-hack]
(Field) url: [http://news.livedoor.com/article/detail/6608703/]
(Field) title: [GoogleドライブのファイルをiPhoneからダイレクトに編集する【知っ得!虎の巻】]
...
nlp4l> close
Index /tmp/index-ldcc was closed.
$ sbt test
- 最適化が施されていないインデックスでは正確な単語カウントが取得できない可能性があります。
- 大量データを処理しようとすると OutOfMemoryError になる場合があります。