2017-01-28 2 views
0

GitHub NLPで利用可能な次のNLPの宝石を探しましたが、適切な解決策を見つけることができませんでした。指定された類似度に基づいて一括テキストをグループにグループ化する

類似のパーセンテージに基づいてテキストをグループ化するための宝石またはライブラリがありますか?上記のすべての宝石は、2つの文字列の間の類似性を見つけるのに役立ちますが、データの大量の配列をグループ化するのに多くの時間を要します。

答えて

1

Rubyに加えて、リストされた宝石の1つだけを使用して行うことができます。

私はここで

はあなたが宝石を使用する方法の名前を言っていたので、私は​​を選んだ:

require 'fuzzystringmatch' 

# Create the matcher 
jarow = FuzzyStringMatch::JaroWinkler.create(:native) 

# Get the distance 
jarow.getDistance( "jones",  "johnson") 
# => 0.8323809523809523 

# Round it 
jarow.getDistance( "jones",  "johnson").round(2) 
# => 0.83 

あなたはフロートを取得しているので、あなたが使用して探しているの精度を定義することができますroundメソッド。

同様の結果をグループ化するには、モジュールにあるgroup_byのメトを使用できます。

ブロックに渡し、group_byはコレクションを反復処理します。反復ごとに、グループ化しようとしている値(この場合は距離)を返します。距離とキーとしてのハッシュと、値に一致する文字列の配列を返します。

require 'fuzzystringmatch' 

jarow = FuzzyStringMatch::JaroWinkler.create(:native) 

target = "jones" 
precision = 2 
candidates = [ "Jessica Jones", "Jones", "Johnson", "thompson", "john", "thompsen" ] 

distances = candidates.group_by { |candidate| 
    jarow.getDistance(target, candidate).round(precision) 
} 

distances 
# => {0.52=>["Jessica Jones"], 
#  0.87=>["Jones"], 
#  0.68=>["Johnson"], 
#  0.55=>["thompson", "thompsen"], 
#  0.83=>["john"]} 

私は、これは

を役に立てば幸い
関連する問題