2017-09-13 1 views
0

Ich habe Ähnlichkeitsfunktion von pg_trgm Modul in PostgreSQL verwendet und jetzt bin ich auf der Suche nach einem Wort Ähnlichkeitsfunktion ähnlich wie Ähnlichkeit in Python. Ich habe viele Methoden in Python gefunden, z.B. difflib, nltk, aber keine dieser Methoden erzeugt ähnliche Ergebnisse wie die Similarity-Funktion von PostgreSQL.Python String Matching genau gleich Postgresql Ähnlichkeitsfunktion

Ich habe diesen Code für Wörter verwendet, die übereinstimmen, aber die Ergebnisse unterscheiden sich sehr von denen der PostgreSQL Ähnlichkeitsfunktion. Sind diese Ergebnisse besser als die der Similarity-Funktion von PostgreSQL? Gibt es eine Methode oder eine Bibliothek, die ich verwenden kann, um die Ergebnisse ähnlich PostgreSQL Similarity Funktion zu erzeugen?

from difflib import SequenceMatcher 
import nltk 
from fuzzywuzzy import fuzz 

def similar(a,b): 
    return SequenceMatcher(None,a,b).ratio() 

def longest_common_substring(s1, s2): 
    m = [[0] * (1 + len(s2)) for i in xrange(1 + len(s1))] 
    longest, x_longest = 0, 0 
    for x in xrange(1, 1 + len(s1)): 
     for y in xrange(1, 1 + len(s2)): 
      if s1[x - 1] == s2[y - 1]: 
       m[x][y] = m[x - 1][y - 1] + 1 
       if m[x][y] > longest: 
        longest = m[x][y] 
        x_longest = x 
      else: 
       m[x][y] = 0 
    return s1[x_longest - longest: x_longest] 

def similarity(s1, s2): 
    return 2. * len(longest_common_substring(s1, s2))/(len(s1) + len(s2)) * 100 

print similarity("New Highway Classic Academy Lahore","Old Highway Classic Academy") 
print nltk.edit_distance("This is Your Shop","This") 
print fuzz.ratio("ISE-Tower","UfTowerong,") 

Antwort

0

Von der PostgreSQL-Dokumentation: https://www.postgresql.org/docs/9.1/static/pgtrgm.html

A Trigram ist eine Gruppe von drei aufeinanderfolgenden Zeichen aus einem String genommen. Wir können die Ähnlichkeit zweier Strings messen, indem wir die Anzahl der Trigramme, die sie teilen, zählen. Diese einfache Idee erweist sich als sehr effektiv für die Messung der Ähnlichkeit von Wörtern in vielen natürlichen Sprachen.

Hinweis: Eine Zeichenkette wird in Betracht gezogen haben zwei Räume Präfix und ein Raum suffixed wenn der Satz von Trigramme in der Zeichenfolge enthalten sind bestimmen. Zum Beispiel ist der Satz von Trigrammen in der Zeichenkette "cat" "c", "ca", "cat" und "at".

Es gibt kein integriertes Modul für diese Funktionalität in Python. Es kann Bibliotheken wie fuzzyset geben, die helfen können - aber in beiden Fällen gibt es dafür keine Standardfunktion in Python.