Raskite panašumo metriką tarp dviejų eilučių.

Kaip gauti tikimybę, kad eilutė atrodys kaip kita eilutė „Python“?

Noriu gauti dešimtainę reikšmę, pvz., 0,9 (tai reiškia 90%) ir tt Pageidautina su standartine „Python“ ir biblioteka.

Pavyzdžiui.

 similar("Apple","Appel") #would have a high prob. similar("Apple","Mango") #would have a lower prob. 
175
30 июня '13 в 10:35 2013-06-30 10:35 tenstar nustatoma birželio 30 d. 13 val. 10:35 2013-06-30 10:35
@ 7 atsakymai

Yra įmontuotas.

 from difflib import SequenceMatcher def similar(a, b): return SequenceMatcher(None, a, b).ratio() 

Naudojant jį:

 >>> similar("Apple","Appel") 0.8 >>> similar("Apple","Mango") 0.0 
383
30 июня '13 в 11:18 2013-06-30 11:18 atsakymas pateikiamas Inbar Rose birželio 30 d., 13 val. 11:18 2013-06-30 11:18

Manau, kad galbūt ieškote algoritmo, apibūdinančio atstumą tarp eilučių. Štai keletas iš jų, kuriuos galite nurodyti:

53
30 июня '13 в 11:45 2013-06-30 11:45 atsakymą pateikė hbprotoss birželio 30 d. 13 val. 11:45 2013-06-30 11:45

Fuzzy Wuzzy yra paketas , įgyvendinantis „Levenshtein“ atstumą Fuzzy Wuzzy , kai kurios pagalbinės funkcijos padeda tam tikrose situacijose, kur jums gali prireikti dviejų skirtingų linijų, kurios laikomos identiškomis. Pavyzdžiui:

 >>> fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear") 91 >>> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear") 100 
22
19 янв. atsakymas pateikiamas BLT sausio 19 d 2017-01-19 01:26 '17 at 1:26 2017-01-19 01:26

Sprendimas # 1: įterptas „Python“

naudokite difflib SequenceMatcher

Pro : integruota python biblioteka, nereikia papildomo paketo.
minus : pernelyg ribotas, yra daug kitų gerų algoritmų eilutės panašumui.

pavyzdys:
 >>> from difflib import SequenceMatcher >>> s = SequenceMatcher(None, "abcd", "bcde") >>> s.ratio() 0.75 

Sprendimas # 2: medūzų biblioteka

tai labai gera biblioteka, pasižyminti gerais pasiekimais ir keliomis problemomis. jis palaiko:
- „Levenshtein“ atstumas
- Dahmeru-Levenshtein Distance
- Jaro atstumas
- Atstumas Yaro-Winkler

- atitikimo atitikimo atitikimas
- „Hamming“ atstumas

Argumentai "už" : lengva naudoti, įvairūs palaikomi algoritmai, įrodyta.
minus : ne gimtoji biblioteka.

pavyzdys:

 >>> 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 
17
09 сент. Atsakyti Iman Mirzadeh 09 Sep 2017-09-09 01:49 '17 at 1:49 2017-09-09 01:49

Galite sukurti tokią funkciją kaip:

 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)) 
9
30 июня '13 в 10:41 2013-06-30 10:41 atsakymą pateikė Saullo GP Castro birželio 13 d., 10:41 2013-06-30 10:41

Atstumo paketą sudaro „Levenshtein“ atstumas:

 import distance distance.levenshtein("lenvestein", "levenshtein") # 3 
6
11 апр. Atsakymą pateikė Enrique Pérez Herrero balandžio 11 d. 2017-04-11 01:02 '17 at 1:02 2017-04-11 01:02

SequenceMatcher labai lėtas dideliame įvestyje, kaip tai padaryti, naudodami difrakto pleistrą :

 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 
3
30 апр. atsakymas pateikiamas damio 30 d. 2018-04-30 17:24 '18, 17:24 val. 2018-04-30 17:24