きっかけ
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