maaya ishida
I'm system engineer in Tokyo. I join ... - Java Women Group Tokyo - PyLadies Tokyo
2.ディズニーランドに遊びに行く時はパスポートが必要です
東京 1
ディズニーランド 1, 2
千葉 1, 3
遊び 2, 3
パスポート 2, 3
行く 2, 3
必要 2
不要 3
です 2, 3
ます 1 etc...
今回はKuromoji
を使ってみました
とりあえず
使ってみました
辞書依存のため流行語や略語を解析させることができる
辞書のメンテナンスが必要
辞書を持たずに機械的にテキストから単語を区切って抽出
辞書レス。辞書メンテ不要
東京都問題に要注意。ノイズ増加の可能性の考慮が必要
利用するアナライザーを決定する
インデックスの書き込みモードを決定する
インデックス生成スタート
//アナライザの選択
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
//インデックス書き込み方法の決定
config.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
IndexWriter writer = new IndexWriter(readyDirectory(), config);
//インデックス生成
try (FileReader fr = new FileReader(LuceneTestConfig.dataDir);
BufferedReader br = new BufferedReader(fr)){
//インデックスへデータを追加
String text;
while ((text = br.readLine()) != null) {
writer.addDocument(getDocument(text));
}
} catch { }
Open Mode
インデックス作成時に、すでに出来上がっているデータをどのように取り扱うかを設定できる値。
既存インデックスを全て削除
既存インデックスが
ある場合:インデックスの追加
ない場合:新規インデックスの作成
インデックスの追加
既存インデックスが存在しない場合はエラーになる
通常の単語分割
複合語を細かく分割。
例)「関西国際空港」→ 関西/国際/空港。「国際」や「空港」で「関西国際空港」をヒットさせることができる
SEARCHモード+辞書にない語をuni-gramに分割。
例)「ディジカメ」→デ/ィ/ジ/カ/メ。
Tokenizer tokenizer = new JapaneseTokenizer(
reader, null, false, JapaneseTokenizer.Mode.NORMAL);
2. Kuromoji トークンフィルター設定
単語を基本形に変換する. 例) 「行け」→「行く」
単語の代わりに、単語の読みに変換する
例 ) 「合格」→「ゴウカク」
TokenStream = new JapaneseBaseFormFilter(tokenizer);
TokenStreamComponents tscompornents =
new TokenStreamComponents(tokenizer, tokenStream);
try (Directory dir = readyDirectory();
IndexReader reader = DirectoryReader.open(dir)){
//検索条件の指定
//Termはコンストラクタで検索対象とするフィールド名と、
//キーワードを指定して生成を行う
TermQuery termQuery = new TermQuery(
new Term(
LuceneTestConfig.fieldName, searchWord));
//検索。limitCount=返却件数
IndexSearcher searcher = new IndexSearcher(reader);
TopDocs topdocs = searcher.search(query, limitCount);
} catch { }
検索単語の解析と、検索モードの設定を行うと
複数単語による検索も実行できます。
//fieldName=インデックス作成時にインデックスを登録したフィールドの名前
Analyzer analyzer = new JapaneseAnalyzer();
QueryParser parser = new QueryParser(fieldName, analyzer);
//パースのデフォルト検索モードはOR検索
//Query query = parser.parse(searchWord);
Query query =parser.createBooleanQuery(
fieldName, searchWord, BooleanClause.Occur.MUST);
//検索。limitCount=返却件数
IndexSearcher searcher = new IndexSearcher(reader);
TopDocs topdocs = searcher.search(query, limitCount);
AND検索
OR検索
NOT検索
利用例)
→ Apache Solr やElasticsearch等を利用するといいらしいです!
(すみません!こちらまで今回は手が回りませんでした!)
お勉強に使ったサイト
https://github.com/johtani/jjug-example/blob/master/src/main/java/info/johtani/jjug/lucene/sample/
https://speakerdeck.com/johtani/lucenetori-ben-yu-falsejian-suo
http://d.hatena.ne.jp/Kazuhira/20130602/1370163286
http://www.kakiro-web.com/lucene/index.html
http://thinkit.co.jp/free/article/0710/17/1/
By maaya ishida
I'm system engineer in Tokyo. I join ... - Java Women Group Tokyo - PyLadies Tokyo