2012-03-22 160 views
10

Id喜歡兩個字符串在Ruby中比較,發現它們的相似紅寶石比較兩個字符串的相似百分比

我有一個看看Levenshtein寶石,但似乎這是最後更新於2008年,我找不到文檔如何使用它。隨着一些博客暗示其破

我試過text寶石與萊文斯坦,但它提供了一個整數(越小越好)

顯然,如果兩個字符串的長度是可變的我碰上與Levenshtein算法問題(說比較兩個名字,其中一個有中間名,一個沒有)。

你會建議我做一個百分比比較?

編輯:林尋找類似的東西PHP的similar text

+0

可能重複的http://stackoverflow.com/questions/4761793/how-to-do-advanced-string-comparison-in-ruby – 2012-03-22 12:17:25

+0

這會生成一個差異列表,即時查找%相似度 – Akshat 2012-03-22 12:19:09

+0

如果字符串長度不同,應該將哪一個作爲計算百分比的基礎? – 2012-03-22 12:19:51

回答

14

我認爲你的問題可以用一些澄清這樣做,但這裏的東西快速和骯髒(以上計算爲較長的字符串,按您的澄清的百分比) :

def string_difference_percent(a, b) 
    longer = [a.size, b.size].max 
    same = a.each_char.zip(b.each_char).select { |a,b| a == b }.size 
    (longer - same)/a.size.to_f 
end 

我仍然不知道有多少意義這個百分比差值你要找的品牌,但是這應該讓你至少開始。

這有點像Levensthein距離,因爲它比較字符串的字符。所以,如果兩個名字只是中間名的不同,他們實際上會有很大的不同。

+0

有人可以解釋'相同'位?所以它循環遍歷每個字符,而zip爲字符串A中的每個字符創建一個數組,並且我期望的是 - 字符串B中的每個字符。第二個each_char如何知道連接到數組的哪個索引? – 2017-03-14 20:26:56

+0

此外,如果在開始時更改了一個字符,則此計算效果不佳。 – 2017-03-14 20:27:23

+1

請謹防Select中的** a **,因爲它會清除通過參數傳遞的變量。最好使用其他字母。 'same = a.each_char。zip(b.each_char).select {| c,d | c == d} .size' – sesperanto 2017-04-26 12:03:11

12

現在有一個ruby gem用於similar_text。 https://rubygems.org/gems/similar_text 它提供了一個similar方法,該方法比較兩個字符串並返回一個代表這兩個字符串之間百分比相似度的數字。

+2

similar_text gem在大字符串上凍結,嘗試143kb html頁面 – 2016-07-03 06:38:09

9

我可以推薦fuzzy-string-match寶石。

您可以使用它像這樣(從the docs拍攝):

require "fuzzystringmatch" 
jarow = FuzzyStringMatch::JaroWinkler.create(:native) 
p jarow.getDistance("jones", "johnson") 

它會返回一個分值~0.832怎樣完成好這些字符串匹配。