java - 如何从单词相似度到句子整体相似度

标签 java stanford-nlp wordnet sentence-similarity ws4j

我使用 WS4J 实现了句子相似度方法。

我读过文章中的句子相似度,它基于两个句子中的单词相似度。但我找不到一种方法可以根据单词相似度计算并返回整体句子相似度的单个值。

在本网站 sentence-similarity-using-ws4j 上也提出了类似的问题。

如您所见,我已成功使用 WS4J 进行编码,直到句子 a 中的任何单词在另一个句子中找到同义词集匹配(并且匹配值高于 0.9)时返回匹配消息。但我认为这不是一个好方法。

我找到了Yuhua等人的文章[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, Z. A.、O'shea, J. D. 和 Crockett, K. (2006)。基于语义网络和语料库统计的句子相似度。知识与数据工程,IEEE 汇刊,18(8), 1138-1150。

最佳答案

计算句子相似度有不同的方法,具体方法可能取决于您的用例或要求。 这样做的著名方法之一是考虑句子中最重要的句法单元,这些单元对句子的含义有重大影响。 (例如:动词、名词、副词、形容词等)。另外,使用 vector 空间模型来计算两个句子之间的相似度是一种非常准确的方法,并且这方面的资源非常多。

关于java - 如何从单词相似度到句子整体相似度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36156786/

相关文章:

java - JsafeJCE 对 KeyManagerFactory 支持的算法有哪些?

machine-learning - 合并机器学习中的两个模型

java - 斯坦福 pos 标记器中的 xml 格式

java - 在运行时更改 CoreNLP 设置

r - 在 R 中识别和分组同义词

Python:将变量传递给 NLTK 中的 Wordnet Synsets 方法

java - Android 将 ImageView 拖放到另一个 ImageView(或布局)中

java - 如何在文件行出现时读取它们并将它们表示为 Flux?

java - 静态工厂方法问题!

taxonomy - wordnet 3.0 分类法的最大深度