파이썬에서 문자열이 다른 문자열과 비슷할 확률을 어떻게 얻습니까?
0.9 (90 %를 의미하는) 등의 10 진수 값을 얻고 싶습니다. 표준 Python 및 라이브러리를 사용하는 것이 좋습니다.
예 :
similar("Apple","Appel") #would have a high prob.
similar("Apple","Mango") #would have a lower prob.
파이썬에서 문자열이 다른 문자열과 비슷할 확률을 어떻게 얻습니까?
0.9 (90 %를 의미하는) 등의 10 진수 값을 얻고 싶습니다. 표준 Python 및 라이브러리를 사용하는 것이 좋습니다.
예 :
similar("Apple","Appel") #would have a high prob.
similar("Apple","Mango") #would have a lower prob.
답변:
내장되어 있습니다.
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
그것을 사용 :
>>> similar("Apple","Appel")
0.8
>>> similar("Apple","Mango")
0.0
get_close_matches
내가 발견하지만, 내장을 sorted(... key=lambda x: difflib.SequenceMatcher(None, x, search).ratio(), ...)
더 신뢰할 수있는 사용자 정의와 sorted(... .get_matching_blocks())[-1] > min_match
검사
get_closest_matches
)에 주목합니다 . 그것은 당신이 찾고있는 편의 기능입니다. AKA는 문서를 읽었습니다! 내 특정 응용 프로그램에서 나는 잘못된 입력을 제공하는 사용자에게 기본적인 오류 확인 /보고를하고 있었고이 답변을 통해 잠재적 인 일치 와 "유사성"이 무엇인지 보고 할 수 있습니다 . 당신이 유사성을 표시 할 필요가없는 경우,하지만 확실히 체크 아웃get_closest_matches
아마 당신은 문자열 사이의 거리를 설명하는 알고리즘을 찾고 있다고 생각합니다. 다음은 참조 할 수있는 것입니다.
difflib 에서 SequenceMatcher 사용
장점 : 네이티브 파이썬 라이브러리, 별도의 패키지가 필요 없습니다.
단점 : 너무 제한적이며 문자열 유사성을위한 다른 좋은 알고리즘이 많이 있습니다.
>>> from difflib import SequenceMatcher
>>> s = SequenceMatcher(None, "abcd", "bcde")
>>> s.ratio()
0.75
적용 범위가 좋고 문제가 거의없는 매우 훌륭한 라이브러리입니다. 그것은 지원
- Levenshtein 거리
- Damerau - Levenshtein 거리
- JARO의 거리
- JARO - 윈 클러 거리
- 경기 평가 접근법 비교
- 해밍 거리
장점 : 사용하기 쉽고 지원되는 알고리즘의 범위가 테스트되었습니다.
단점 : 네이티브 라이브러리가 아닙니다.
예 :
>>> import jellyfish
>>> jellyfish.levenshtein_distance(u'jellyfish', u'smellyfish')
2
>>> jellyfish.jaro_distance(u'jellyfish', u'smellyfish')
0.89629629629629637
>>> jellyfish.damerau_levenshtein_distance(u'jellyfish', u'jellyfihs')
1
다음과 같은 함수를 만들 수 있습니다.
def similar(w1, w2):
w1 = w1 + ' ' * (len(w2) - len(w1))
w2 = w2 + ' ' * (len(w1) - len(w2))
return sum(1 if i == j else 0 for i, j in zip(w1, w2)) / float(len(w1))
if self.similar(search_string, item.text()) > 0.80:
는 지금 작동합니다. 감사합니다
내장 SequenceMatcher
은 큰 입력에서 매우 느립니다. diff-match-patch 로 수행하는 방법은 다음과 같습니다.
from diff_match_patch import diff_match_patch
def compute_similarity_and_diff(text1, text2):
dmp = diff_match_patch()
dmp.Diff_Timeout = 0.0
diff = dmp.diff_main(text1, text2, False)
# similarity
common_text = sum([len(txt) for op, txt in diff if op == 0])
text_length = max(len(text1), len(text2))
sim = common_text / text_length
return sim, diff
참고 difflib.SequenceMatcher
만 이 예를 들어, 요구되는없는 것을 종종 가장 긴 연속 일치하는 시퀀스를 찾습니다
>>> a1 = "Apple"
>>> a2 = "Appel"
>>> a1 *= 50
>>> a2 *= 50
>>> SequenceMatcher(None, a1, a2).ratio()
0.012 # very low
>>> SequenceMatcher(None, a1, a2).get_matching_blocks()
[Match(a=0, b=0, size=3), Match(a=250, b=250, size=0)] # only the first block is recorded
두 스트링 사이의 유사성을 찾는 것은 생물 정보학에서의 쌍별 서열 정렬 개념과 밀접한 관련이있다. biopython을 포함하여 이것에 대한 많은 전용 라이브러리가 있습니다 . 이 예제는 Needleman Wunsch 알고리즘을 구현합니다 .
>>> from Bio.Align import PairwiseAligner
>>> aligner = PairwiseAligner()
>>> aligner.score(a1, a2)
200.0
>>> aligner.algorithm
'Needleman-Wunsch'
다양한 점수 체계와 알고리즘을 사용할 수 있으므로 biopython 또는 다른 생물 정보학 패키지를 사용하는 것이 Python 표준 라이브러리의 어느 부분보다 융통성이 있습니다. 또한 실제로 일어나는 일을 시각화하기 위해 일치하는 시퀀스를 얻을 수 있습니다.
>>> alignment = next(aligner.align(a1, a2))
>>> alignment.score
200.0
>>> print(alignment)
Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-Apple-
|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-|||-|-
App-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-elApp-el
이 링크에서 대부분의 텍스트 유사성 방법과 계산 방법을 찾을 수 있습니다. https://github.com/luozhouyang/python-string-similarity#python-string-similarity 여기에 몇 가지 예가 있습니다.
정규화, 메트릭, 유사성 및 거리
(정규화 된) 유사성과 거리
미터 거리