2017-09-13 18 views
0

PostgreSQLでpg_trgmモジュールの類似性関数を使用していますが、今では類似の単語類似度関数を探しています。類似点 Pythonで。私はpythonで多くのメソッドを見つけました。 difflib、nltkですが、PostgreSQLのSimilarity関数と同様の結果は得られません。Postgresql類似度関数と同等のPython文字列一致関数

私はこのコードを単語の一致に使用していますが、結果はPostgreSQLの類似性関数の結果と大きく異なります。これらの結果は、PostgreSQLの類似性機能の結果より優れていますか? PostgreSQLに似た結果を生成するために使用できるメソッドやライブラリがありますか?類似性は機能しますか? PostgreSQLのドキュメントから

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

答えて

0

https://www.postgresql.org/docs/9.1/static/pgtrgm.html

トライグラムは、文字列から取られた3つの連続した文字のグループです。我々は、共有しているトリグラムの数を数えることによって、2つのストリングの類似性を測定することができる。この単純な考え方は、多くの自然言語の単語の類似性を測定するのに非常に有効であることがわかります。

:文字列が接頭二つの空間との文字列に含まれるトリグラムのセットを決定するときにサフィックスつのスペースを持っていると考えられます。たとえば、文字列 "cat"のトリグラムのセットは "c"、 "ca"、 "cat"、 "at"です。

この機能のためのモジュールはPythonにはありません。助けることができるfuzzysetのようなライブラリがあるかもしれませんが、いずれにせよ、これのためにPythonには標準的な機能はありません。

関連する問題