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