2017-09-13 3 views
0

J'ai utilisé la fonction de similarité du module pg_trgm dans PostgreSQL et maintenant je suis à la recherche d'une fonction de similitude des mots similaire à Similitude en Python. J'ai trouvé beaucoup de méthodes en python, par exemple difflib, nltk, mais aucune de ces méthodes ne produit des résultats similaires à ceux de la fonction Similarity de PostgreSQL.Python String correspondant exactement à la fonction de similarité Postgresql

J'ai utilisé ce code pour la correspondance de mots mais les résultats sont très différents de ceux de la fonction de similarité de PostgreSQL. Ces résultats sont-ils meilleurs que ceux de la fonction Similarity de PostgreSQL? Y at-il une méthode ou une bibliothèque que je peux utiliser pour produire les résultats similaires à PostgreSQL Similarité fonction?

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,") 

Répondre

0

De la documentation de PostgreSQL: https://www.postgresql.org/docs/9.1/static/pgtrgm.html

Un trigramme est un groupe de trois caractères consécutifs pris à partir d'une chaîne. Nous pouvons mesurer la similarité de deux chaînes en comptant le nombre de trigrammes qu'elles partagent. Cette idée simple s'avère très efficace pour mesurer la similitude des mots dans de nombreuses langues naturelles.

Remarque: Une chaîne est considérée avoir deux espaces préfixés et un espace suffixé pour déterminer l'ensemble des trigrammes contenus dans la chaîne. Par exemple, l'ensemble des trigrammes dans la chaîne "cat" est "c", "ca", "cat" et "at".

Il n'y a pas de module intégré pour cette fonctionnalité en python. Il peut y avoir des bibliothèques telles que fuzzyset qui peuvent aider - mais de toute façon il n'y a pas de fonction standard en python pour cela.