エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

luceneで文章の類似性を試す

きっかけ

Javaで文章の類似性を数値化できないか調べたところ、luceneというライブラリで実現可能なようなので、サンプル実装して動かしてみた。

環境

IntelliJ IDEA 2019.2.1 (Community Edition)
Build #IC-192.6262.58, built on August 20, 2019
Runtime version: 11.0.3+12-b304.39 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
GC: ParNew, ConcurrentMarkSweep
Memory: 2002M
Cores: 4
Registry: 
Non-Bundled Plugins: net.seesharpsoft.intellij.plugins.csv

実装

GitHub - suzaku-tec/sample-lucene

githubにコード載せておいたので、適時参照してね。

Gradle dependencies

必要になるのは、下記

    // https://mvnrepository.com/artifact/org.apache.lucene/lucene-core
    compile group: 'org.apache.lucene', name: 'lucene-core', version: '8.2.0'

    // https://mvnrepository.com/artifact/org.apache.lucene/lucene-spellchecker
    compile group: 'org.apache.lucene', name: 'lucene-spellchecker', version: '3.6.2'

今回試す分は、上記だけで大丈夫。

TestBatch.java

import org.apache.lucene.search.spell.JaroWinklerDistance;
import org.apache.lucene.search.spell.LevensteinDistance;

public class TestBatch {

    public static void main(String[] arg) throws Exception {

        String one = "今日の東京は非常に寒いです。でも、天気は快晴ですよ!";
        String two = "今日の京都は非常に暑いです。";

        //1に近いほど似ている
        LevensteinDistance l_algo = new LevensteinDistance();

        JaroWinklerDistance j_algo = new JaroWinklerDistance();

        System.out.println("実行結果(LevensteinDistance):" + l_algo.getDistance(one,two));
        System.out.println("実行結果(JaroWinklerDistance):" + j_algo.getDistance(one,two));

    }

}

やることは、インスタンスを生成して比較するだけ。

実行すると、下記のような表示になるはず。

実行結果(LevensteinDistance):0.42307693
実行結果(JaroWinklerDistance):0.7990983

感想

意外と簡単に試せた。
比較のアルゴリズムが、全然分からないから、調査が必要そう。
たぶんだが、コサイン類似度を使ってるんだろうなって気はする。

タスク

参考サイト

Java で Firebase を使う方法のまとめ。 | ソフトコミュ開発ブログ

2つの文字列がどれだけ類似しているかを判定するレーベンシュタイン距離とジャロ・ウィンクラー距離(Java編) | ぱーくん plus idea