2017-11-01 2 views
0

Ich arbeite an einer Java-Anwendung, wo wir Suchfunktionen haben. Jetzt suche ich für die Suche mit Wildcards. Wenn also jemand "Hello Kitty" sucht, erhält er auch Ergebnisse für Kit, Hölle, Hallo usw. Nach der Suche weise ich den Ergebnissen basierend auf ihren Klicks Bewertungen zu, aber wie kann ich die Ergebnisse vergleichen, um daraus zu schließen, dass Ergebnisse sind eine 100% Übereinstimmung oder 80% Übereinstimmung, zum Beispiel "Hallo Kit", ist fast eine Übereinstimmung mit "Hallo Kitty". Gibt es eine Möglichkeit, dies zu tun?Java: Probabilistische Textübereinstimmung, erkennen, wie viel Prozent des Textes übereinstimmt.

Suche Code:

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(); 

Danke.

Antwort

2

Klingt, als ob Sie nach Dice's Coefficient suchen. Hier ist eine Java-Implementierung:

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

Der Algorithmus ordnet eine Zahl von 0 bis 1 zu einem Paar von Fäden, je höher die Zahl desto ähnlicher sind sie. Also im Grunde genau das, wonach du verlangst.

+0

Genau das, was ich brauchte. Danke, Mann. Können Sie bitte tatsächlichen Code als Antwort für mich, um Ihre Antwort zu akzeptieren. Pflegen Sie den Link auch für jetzt. :-) –

Verwandte Themen