programing

퍼지 문자열 비교에 적합한 Python 모듈?

newsource 2022. 11. 27. 21:18

퍼지 문자열 비교에 적합한 Python 모듈?

간단한 퍼지 문자열 비교가 가능한 파이썬 모듈을 찾고 있습니다.구체적으로, 줄이 얼마나 비슷한지 비율을 알고 싶어요.이것이 잠재적으로 주관적이라는 것을 알고 있기 때문에, 위치 비교 및 가장 긴 유사한 문자열 매칭을 할 수 있는 라이브러리를 찾고 있었습니다.

기본적으로는 어떤 유형의 비교를 수행할지 지정할 수 있을 만큼 충분히 구성 가능하면서도 단일 비율을 산출할 수 있는 단순한 방법을 찾고자 합니다.

difflib은 할 수 있어요.

문서의 예:

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('apple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']

이것을 확인해 보세요.커스텀을 작성하는 데 도움이 되는 다른 기능이 있습니다.

Levenshtein Python 확장 및 C 라이브러리.

https://github.com/ztane/python-Levenshtein/

Levenshtein Python C 확장 모듈에는 Levenshtein(편집) 거리를 빠르게 계산할 수 있는 함수와 편집 작업 - 문자열 유사성 - 대략적인 중위수 문자열 및 일반적으로 문자열 평균화 - 문자열 및 집합 유사성 문자열이 모두 지원됩니다.

$ pip install python-levenshtein
...
$ python
>>> import Levenshtein
>>> help(Levenshtein.ratio)
ratio(...)
    Compute similarity of two strings.

    ratio(string1, string2)

    The similarity is a number between 0 and 1, it's usually equal or
    somewhat higher than difflib.SequenceMatcher.ratio(), becuase it's
    based on real minimal edit distance.

    Examples:
    >>> ratio('Hello world!', 'Holly grail!')
    0.58333333333333337
    >>> ratio('Brian', 'Jesus')
    0.0

>>> help(Levenshtein.distance)
distance(...)
    Compute absolute Levenshtein distance of two strings.

    distance(string1, string2)

    Examples (it's hard to spell Levenshtein correctly):
    >>> distance('Levenshtein', 'Lenvinsten')
    4
    >>> distance('Levenshtein', 'Levensthein')
    2
    >>> distance('Levenshtein', 'Levenshten')
    1
    >>> distance('Levenshtein', 'Levenshtein')
    0

nosklo가 말했듯이 Python 표준 라이브러리의 difflib 모듈을 사용합니다.

difflib 모듈은 다음을 사용하여 시퀀스의 유사성 측정을 반환할 수 있습니다.ratio()SequenceMatcher() 객체의 메서드.유사성은 0.0~1.0 범위의 플로트로 반환됩니다.

>>> import difflib

>>> difflib.SequenceMatcher(None, 'abcde', 'abcde').ratio()
1.0

>>> difflib.SequenceMatcher(None, 'abcde', 'zbcde').ratio()
0.80000000000000004

>>> difflib.SequenceMatcher(None, 'abcde', 'zyzzy').ratio()
0.0

젤리피쉬는 음성 매칭을 포함한 많은 문자열 비교 지표를 지원하는 파이썬 모듈입니다.Levenstein 편집 거리의 순수 Python 구현은 젤리피쉬 구현에 비해 매우 느립니다.

사용 예:

import jellyfish

>>> jellyfish.levenshtein_distance('jellyfish', 'smellyfish')
2 
>>> jellyfish.jaro_distance('jellyfish', 'smellyfish')
0.89629629629629637
>>> jellyfish.damerau_levenshtein_distance('jellyfish', 'jellyfihs')
1
>>> jellyfish.metaphone('Jellyfish')
'JLFX'
>>> jellyfish.soundex('Jellyfish')
'J412'
>>> jellyfish.nysiis('Jellyfish')
'JALYF'
>>> jellyfish.match_rating_codex('Jellyfish')
'JLLFSH'`

노스크로의 답변이 마음에 듭니다.또 다른 방법은 다메라우-레벤슈테인 거리입니다.

"정보 이론과 컴퓨터 과학에서 Damerau-Levenshtein 거리는 두 문자열 사이의 거리(문자열 메트릭)입니다. 즉, 유한한 일련의 기호로, 한 문자열을 다른 문자열로 변환하는 데 필요한 최소 연산 횟수를 세어 주어지며, 여기서 연산은 단일 문자의 삽입, 삭제 또는 치환으로 정의됩니다.ter 또는 두 글자의 전치입니다.

Wikibooks의 Python 구현:

def lev(a, b):
    if not a: return len(b)
    if not b: return len(a)
    return min(lev(a[1:], b[1:])+(a[0] != b[0]), \
    lev(a[1:], b)+1, lev(a, b[1:])+1)

Wikibooks에서는 가장 긴 공통 서브스트링(LCS)의 길이를 제공합니다.

def LCSubstr_len(S, T):
    m = len(S); n = len(T)
    L = [[0] * (n+1) for i in xrange(m+1)]
    lcs = 0
    for i in xrange(m):
        for j in xrange(n):
            if S[i] == T[j]:
                L[i+1][j+1] = L[i][j] + 1
                lcs = max(lcs, L[i+1][j+1])
    return lcs

구글 자체 google-diff-match-patch("현재 자바, 자바스크립트, C++, 파이썬")도 있습니다.

(저도 python의 difflib밖에 사용하지 않았기 때문에 코멘트할 수 없습니다)

또 다른 대안은 최근에 출시된 패키지 Fuzzy Wuzzy를 사용하는 것입니다.패키지로 지원되는 다양한 기능에 대해서도 이 블로그 포스트에서 설명합니다.

저는 부적처럼 작동하는 더블 메타폰을 사용하고 있습니다.

예:

>>> dm(u'aubrey')
('APR', '')
>>> dm(u'richard')
('RXRT', 'RKRT')
>>> dm(u'katherine') == dm(u'catherine')
True

업데이트: 해파리도 가지고 있습니다.Phonetic 부호화에 포함됩니다.

시트 긱의 퍼지 우지를 잘 써왔어요

https://github.com/seatgeek/fuzzywuzzy

특히 토큰 세트 비율 함수...

또, 퍼지 문자열의 매칭의 프로세스에 대해서도, 훌륭하게 기술했습니다.

http://seatgeek.com/blog/dev/fuzzywuzzy-fuzzy-string-matching-in-python

Charicar의 simhash를 사용하는 방법은 긴 문서에도 적합하며 문서의 어순을 변경할 때도 100% 유사성이 검출됩니다.

http://blog.simpliplant.eu/calculating-similarity-between-text-strings-in-python/

다음은 가장 긴 공통 부분 문자열을 두 단어로 계산하는 python 스크립트입니다(다중 단어 구문에 대해 작동하려면 조정해야 할 수 있습니다).

def lcs(word1, word2):

    w1 = set(word1[i:j] for i in range(0, len(word1))
             for j in range(1, len(word1) + 1))

    w2 = set(word2[i:j] for i in range(0, len(word2))
             for j in range(1, len(word2) + 1))

    common_subs = w1.intersection(w2)

    sorted_cmn_subs = sorted([
        (len(str), str) for str in list(common_subs)
        ])

    return sorted_cmn_subs.pop()[1]

Fuzzy 모듈을 살펴봅니다.Soundex, NYSIIS, 더블 메타폰의 고속(C로 작성) 기반 알고리즘을 갖추고 있습니다.

좋은 소개는 http://www.informit.com/articles/article.aspx?p=1848528 에서 찾을 수 있습니다.

언급URL : https://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy-string-comparison