퍼지 문자열 비교에 적합한 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
'programing' 카테고리의 다른 글
파이어베이스 관찰 방법auth().currentUser.displayName 및 기타 변경 속성 (0) | 2022.11.27 |
---|---|
풀 패스를 지정하면 모듈을 Import하려면 어떻게 해야 합니까? (0) | 2022.11.27 |
TEXT와 VARCHAR 중 어떤 DATATYPE을 사용하는 것이 더 좋습니까? (0) | 2022.11.27 |
선언에 DEASTIC, NO SQL 또는 READS SQL 데이터가 포함되어 있으며 이진 로그가 활성화되어 있습니다. (0) | 2022.11.27 |
C에서 실행 파일을 생성하시겠습니까? (0) | 2022.11.27 |