WS4J を使用して文の類似性メソッドを実装しました。
2つの文の単語の類似性に基づく記事の文の類似性について読んだことがあります。しかし、単語の類似度に基づいて文全体の類似度を計算して単一の値を返すメソッドは見つかりませんでした。
同様の質問が、この Web サイト ( sentence-similarity-using-ws4j)で行われました。
ご覧のとおり、WS4J を使用して、文内の任意の単語が他の文で synset 一致を検出する (一致する値が 0.9 を超える) 場合に、一致メッセージを返すまでコーディングすることができました。しかし、これは良いアプローチではないと思います。
Yuhua et al [2] の記事を見つけました。すべて非常に便利ですが、全体的な文の類似性に使用した方法を理解できません。
public static String sentenceSim(String se1, String se2, RelatednessCalculator rc) {
String similarityMessage = "";
String similarityMessage2 = "";
if (se1 == null || se2 == null) {
return "null";
}
if (nlp == null) {
nlp = OpenNLPSingleton.INSTANCE;
}
// long t00 = System.currentTimeMillis();
String[] words1 = nlp.tokenize(se1); // base
String[] words2 = nlp.tokenize(se2); // sentence
String[] postag1 = nlp.postag(words1);
String[] postag2 = nlp.postag(words2);
String u = "";
int matchCount = 0;
int counter = 0;
String mLC = rc.toString().toLowerCase();
for (int j = 0; j < words2.length; j++) { // sentence
String pt2 = postag2[j];
String w2 = MorphaStemmer.stemToken(words2[j].toLowerCase(), pt2);
POS p2 = mapPOS(pt2);
// System.out.print(words2[j]+"(POS "+pt2+")");
for (int i = 0; i < words1.length; i++) { // base
String pt1 = postag1[i];
String origWord1 = words1[i];
String origWord2 = words2[j];
String w1 = MorphaStemmer.stemToken(words1[i].toLowerCase(), pt1);
POS p1 = mapPOS(pt1);
String popup = mLC + "( " + w1 + "#" + (p1 != null ? p1 : "INVALID_POS") + " , " + w2 + "#"
+ (p2 != null ? p2 : "INVALID_POS") + ")";
String dText;
// boolean acceptable = rc.getPOSPairs().isAcceptable(p1, p2);
// ALL WORDS FROM BASE HAS TO MATCH - IF ONE DOESNT,
// THEN ITS NOT MATCH
double d = -1;
if (p1 != null && p2 != null) {//
double r = wordSim(w1, w2, rc);
if (r > 0.9) {
matchCount++;
similarityMessage += "\t\t Similarity Found (Base : sentence) ('Base Word: " + origWord1 + "=" + w1 + " "
+ p1 + "', Sentence Word: '" + origWord2 + "=" + w2 + " " + p2 + "') = " + r + "\n";
System.out.println(similarityMessage);
}
}
}
// System.out.println();
}
// output if all words in sentence 1 have found matches in sentences 2
if (matchCount == words1.length) {
similarityMessage2 = "\t\tFound all matches for base in sentence: ";
System.out.println("\t\tBase " + se1);
System.out.println("\t\tFound all matches for base in sentence: ");
System.out.println(similarityMessage);
}
similarityMessage = "";
return similarityMessage;
}
コードを Java で作成したので、Java の実装を探していました。
[2]: Li, Y., McLean, D., Bandar, ZA, O'shea, JD, & Crockett, K. (2006). セマンティック ネットとコーパス統計に基づく文の類似性。知識とデータ工学、IEEE トランザクション、18(8)、1138-1150。