【问题标题】:Java: Probabilistic text matching, detect how much percentage of the text matches.Java:概率文本匹配,检测文本匹配的百分比。
【发布时间】:2018-04-13 18:03:48
【问题描述】:

我正在开发一个具有搜索功能的 Java 应用程序。现在,对于搜索,我正在使用通配符进行搜索。因此,如果有人搜索“Hello Kitty”,他们也会得到 kit、hell、hello 等的结果。搜索后,我根据他们的点击为结果分配分数,但我如何比较结果来得出结论结果是 100% 匹配或 80% 匹配,例如“Hello Kit”,几乎与“hello kitty”匹配。有没有办法做到这一点?

搜索代码:

Directory directory = FSDirectory.open(path);
 IndexReader indexReader = DirectoryReader.open(directory);
 IndexSearcher indexSearcher = new IndexSearcher(indexReader);
 Query query = new WildcardQuery(new Term("contents", "*" + str + "*"));
  TopDocs topDocs = indexSearcher.search(query, 1000);
 for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
        Document document = indexSearcher.doc(scoreDoc.doc);
        IndexableField value = document.getField("score");
        if (value != null) {
               sortedMap.put(Integer.valueOf(document.get("id")), (Integer) value.numericValue());
          } else {
               sortedMap.put(Integer.valueOf(document.get("id")), 0);
            }
  }
  indexSearcher.getIndexReader().close();
  directory.close();

谢谢。

【问题讨论】:

    标签: java search full-text-search


    【解决方案1】:

    听起来您正在寻找 Dice 的系数。这是一个java实现:

    public static double diceCoefficient(String s1, String s2)
    {
        Set<String> nx = new HashSet<String>();
        Set<String> ny = new HashSet<String>();
    
        for (int i=0; i < s1.length()-1; i++) {
            char x1 = s1.charAt(i);
            char x2 = s1.charAt(i+1);
            String tmp = "" + x1 + x2;
            nx.add(tmp);
        }
        for (int j=0; j < s2.length()-1; j++) {
            char y1 = s2.charAt(j);
            char y2 = s2.charAt(j+1);
            String tmp = "" + y1 + y2;
            ny.add(tmp);
        }
    
        Set<String> intersection = new HashSet<String>(nx);
        intersection.retainAll(ny);
        double totcombigrams = intersection.size();
    
        return (2*totcombigrams) / (nx.size()+ny.size());
    }
    

    https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Dice%27s_coefficient#Java

    该算法将一个从 0 到 1 的数字分配给一对字符串,数字越大,它们越相似。所以基本上就是你要的。

    【讨论】:

    • 正是我需要的。谢啦。您能否将实际代码放在答案中,以便我接受您的答案。暂时保持链接。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 2016-08-12
    • 2012-11-21
    相关资源
    最近更新 更多