2016-11-21 7 views
0

Ich habe eine Datenbank von rund 300.000 Namen und Adressen. Es gibt viele Namen, die etwas anders geschrieben wurden, aber die gleiche Adresse haben. Ich habe versucht, solche Namen zusammen zu gruppieren. Hier ist ein Beispiel meiner Daten.Elasticsearch niedrige unscharfe Punktzahl

Ich bekomme eine sehr niedrige Trefferquote, wenn ich versuche, einen Namen unscharf zu finden. Hier ist ein Beispiel für die Abfrage ich benutze:

GET test/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "name": { 
       "query": "SREE BANGARAMMA MAHILA PODUPU SANGAM", 
       "fuzziness": 2, 
       "operator": "and"    

      } 
      } 
     } 
     ] 
    } 
    } 
} 

Wenn ich Fragen Sie diese kleine Menge Probe, für SREE BANGARAMMA MAHILA PODUPU SANGAM, erhalte ich eine max_score von 1.1982819 und die Fuzzy angepasst Dokument: SRI BANGARAMMA MAHILA PODUPU SANGAM eine score von 0.2869133 hat. Das signalisiert eine 23% Übereinstimmung. Es gibt einen kleinen Unterschied in ihren ersten Worten: SRI vs SREE.

Sowohl SRI als auch SREE sind in meinem Datensatz ziemlich häufig. Diese könnten mit einem Titel wie Sir gleichgesetzt werden. Der letzte Teil der Abfrage, MAHILA PODUPU SANGAM, wird auch in meinem Datensatz wiederholt. Die einzige eindeutige Entität in der Zeichenfolge wäre BANGARAMMA. Wäre die Term Frequency/Inverse Document Frequence der Grund für die verzerrten Ergebnisse?

Ich bekomme das Ergebnis, das ich wünsche, wenn ich dieses kleine Beispielset abfrage. Aber wenn ich dieselbe Abfrage auf meinem 300.000 Hauptdatensatz ausführen, bekomme ich nur das Ergebnis zurück, das dem Dokument 100% entspricht, und die Fuzzy-Übereinstimmung wird nicht angezeigt.

Ich habe versucht mit boost, aber das scheint nicht das Ergebnis zu liefern, ich will entweder.

Ich frage mich, ob dieses Problem wegen der niedrigen Fuzzy-Match-Score ist. Wenn die Fuzzy-Übereinstimmung in nur 12 Datenpunkten in der Stichprobenmenge so niedrig ist, schneidet sie wahrscheinlich viel niedriger ab, wenn sie mit 300.000 verglichen wird. Ich würde gerne wissen, wie ich die unscharfe Übereinstimmung zeigen könnte, wenn ich meinen Hauptdatensatz abfrage. Ehrlich gesagt, ich weiß nicht, was das Problem zu sein scheint. Könnte mir da jemand in die richtige Richtung weisen?

Das Ergebnis der Stichprobe sieht wie folgt aus:

"hits": { 
    "total": 2, 
    "max_score": 1.1982819, 
    "hits": [ 
     { 
     "_index": "test", 
     "_type": "test", 
     "_id": "AViGh5xU276qVT8pqAHz", 
     "_score": 1.1982819, 
     "_source": { 
      "name": "SREE BANGARAMMA MAHILA PODUPU SANGAM", 
      "address": "KSR PURAM", 
      "city": "VIZIANAGARAM" 
     } 
     }, 
     { 
     "_index": "test", 
     "_type": "test", 
     "_id": "AViGh5xU276qVT8pqAH2", 
     "_score": 0.2869133, 
     "_source": { 
      "name": "SRI BANGARAMMA MAHILA PODUPU SANGAM", 
      "address": "KSR PURAM", 
      "city": "VIZIANAGARAM" 
     } 
     } 
    ] 
    } 
+0

Sind Sie sicher, dass die Ergebnisse nicht da sind? Oder werden sie nicht gezeigt? Ihre Anfrage dort hat weder eine Größe noch eine Seite vorgeschlagen, die dann standardmäßig auf einen Wert gesetzt wird. Nebenbei bemerkt: Die Gleichung einer 23% Übereinstimmung ist nicht wirklich etwas, auf das man sich verlassen kann. Sie können nur Unterschiede zwischen dem abgefragten Satz sehen. Aber Sie sollten Prozent in keiner Weise verwenden. –

+0

Die Größe ist ein Standardwert von 10. Es gibt jedoch nur zwei Dokumente, die der obigen Abfrage entsprechen. Einer ist das Dokument in der Abfrage selbst, das eine 100% Übereinstimmung mit sich selbst hat. Und der andere ist derjenige, den die Fuzzy-Übereinstimmung abruft. Die Fuzzy-Übereinstimmung ruft nur das andere Dokument ab, wenn ich den oben angegebenen Beispielsatz abfrage. Es ruft nicht dasselbe Dokument ab, wenn ich es innerhalb meiner 300.000 Datenpunkte suche. Es zeigt einfach nicht. Es passt nur sich selbst und gibt ein Ergebnis zurück. – MetalloyD

Antwort

2

ich nicht auf tf-idf und Fuzzy-Abfragen verlassen würden zu tun, was Sie brauchen. Fuzzy-Abfragen reichen bei einer Bearbeitungsentfernung von 2 aus. So könnte "sri" mit "sree" übereinstimmen, aber nicht mit "shree".

Lesen Sie sich den SimHash-Algorithmus (eine Lokalität-sensitive Hash-Funktion für Strings :: Bedeutung ähnliche Strings haben Hash-Werte, die einander ähnlich sind).

Wenn Sie Ihren Quelldaten ein anderes Feld mit einem SimHash des Namens hinzufügen, bevor Sie es indizieren, können Sie diesen Wert verwenden, um den Bereich der "ähnlichen Namen" einzuschränken, die für eine bestimmte Adresse zurückgegeben werden.

Sie werden wahrscheinlich immer noch einige manuelle Deduplizierungsarbeiten durchführen müssen, um Ihre Liste solide zu machen, aber mindestens SimHashing-Namen machen diesen Prozess weniger schmerzhaft (z. B. nach Adresse sortieren, dann nach Name-Hash).

Sie können sich auch dafür entscheiden, Ehrenbezeichnungen wie "sri" einfach aus der Suchindizierung mithilfe eines Stoppwordfilters zu entfernen (wenn es 1000-mal in Ihrer Sammlung vorkommt, hilft es Ihnen tatsächlich, Leute zu finden? Oder sucht jemand "sri" alleine) ?)

ich auch einen gemeinsamen Subkontinent Spitznamen/name-Variantenliste empfehlen würde (falls Sie eins) als Synonym Liste finden zu normalisieren (zB Hari, Hariram => Hari) *

* wenn Sie finden/erstellen diese Liste, bitte teilen Sie sie! Viele Projekte brauchen das!

+0

Vielen Dank! Dies ist eine sehr interessante Antwort. Ich habe SimHash überprüft und werde es definitiv implementieren. Ich arbeite an vielen solchen Datensätzen, also würde ich irgendwann eine Synonymliste dafür brauchen. Ich werde Sie wissen lassen, ob ich eines finde oder wir selbst eines erstellen. Prost! :) – MetalloyD

1

Versuchen unter Abfrage

{ 
      "query": { 
      "multi_match": { 
         "query": "SREE BANGARAMMA MAHILA PODUPU SANGAM", 
       'fuzziness': 2, 
       'prefix_length': 1 
      } 
      } 
     }