2017-07-20 18 views
-5

どのようには、2つの文字列を比較し、のパーセンテージを出力します。文字列間の類似点を見つけるのは簡単ですが、をパーセンテージで表示するのは難しいです。 達成方法Ruby2つの文字列を比較して類似度を求める方法は?

+4

これは実際にはほとんど問題ではありません。 **何を試しましたか?**例を挙げてください。いくつかのコードを表示します。 – tadman

+0

Levenshtein Distanceのような音がして、その結果をソース文字列の文字のパーセンテージと比較します。 – Unixmonkey

+1

あなたが何を求めているのかは不明です。パーセンテージとして測定された文字列を比較するアルゴリズムまたは方法をお探しですか? Rubyで特定のアルゴリズム(あなたが言及していない)を書くのを探していますか? *文字列間の類似性を簡単に見つけることができます。... ...「類似性」はどのように定義されていますか? – lurker

答えて

2

これを解決する方法の1つは、文字列を別の文字列に変換するために必要な操作がいくつあるかを示すLevenshtein距離から外すことです。

Rubyには、Levenshteinという名前の宝石があります。

必要な操作数をパーセンテージに変換するには、100%から外に出て、最初からすべての文字列を書き込む必要があり、類似性がありません。これは最長の文字列の長さになります。もう1つの選択肢は、文字列の平均長さを使用することですが、この例では、最も長い文字列を使用します。ここで

levenshtein gemを使用して、彼らがどれだけ近いかの割合を取得する方法である:

require 'levenshtein' 
def distance_percent(first,second) 
    max_distance = [first,second].max_by(&:length).length 
    distance = Levenshtein.distance(first,second) 
    (100.0/max_distance * distance).round.to_s + "%" 
end 

ここではその方法が異なる文字列を返すもののいくつかの例があります。

string_one = "1234567890" 
string_two = "1234567890" 
puts distance_percent(string_one, string_two) 

# => 0% 

それらの間の距離が同じ文字のいずれも存在しないので、これは100%が返される0

string_one = "1234512345" 
string_two = "6789067890" 
puts distance_percent(string_one, string_two) 

# => 100% 

であるので、これは0%を返します。

string_one = "This is a string" 
string_two = "This is another string" 
puts distance_percent(string_one, string_two) 

# => 27% 

ストリングの27%が互いに異なっているので、これは27%を返します。

関連する問題