2

次の文字列は等しいと見なされます。このようなものをどのように一致させることができますか?

"Hazard Const. Company"
"hazard construction company"

"PETERSON-CHASE GENERAL ENGINEERING CONSTRUCTION INC"
"peterson-chase general  engineering construction inc"

"TRAFFIC DEVELOPMENT SERVICES "
"traffic development services"

私の環境はルビーですが、文字列を一致させるための一般的な原則が疑問に思っています。上記の例は、空白の問題と省略形のため、初歩的な "a"=="b" では機能しません。正規表現の大文字と小文字を無視するか、文字列を小文字にすることで、大文字と小文字の問題を軽減できます...

4

3 に答える 3

3

次のサンプルでは、​​すべての文字列を比較し、levensthtein 差 (1 つの文字列を別の文字列に適合させるために必要なキーストロークの量) を計算します。

定義された最大差に基づいて、文字列の長さを補正して、文字列を出現回数の値を持つキーとしてハッシュに入れます。

require 'levenshtein'

MAX_DISTANCE, COMPENSATION = 3, 5

strings = [
    "Hazard Const. Company",
    "hazard construction company",
    "PETERSON-CHASE GENERAL ENGINEERING CONSTRUCTION INC",
    "peterson-chase general  engineering construction inc",
    "TRAFFIC DEVELOPMENT SERVICES ",
    "traffic development services"
]

result = {}
strings.each do |s|
    s.downcase!
  similar = result.keys.select { |key| Levenshtein.distance(key, s) < MAX_DISTANCE+(s.length/COMPENSATION) }
  if similar.any?
    result[similar.first] += 1
  else
    result.merge!({s => 1})
  end
end

puts result.inspect
# {"hazard const. company"=>2, "peterson-chase general engineering construction inc"=>2, "traffic development services "=>2}
于 2013-08-14T09:46:25.627 に答える
2

String#squeeze
String#downcase

最初のものについては、レーベンシュタイン距離などを計算する必要があります。

于 2013-08-14T03:36:27.280 に答える
2

テキストマイニングと情報検索の主題に属する興味深い質問です。通常、ステミング (レンマタイゼーション) アルゴリズムを使用するか、より単純なヒューリスティックを使用して、記述されたマッチングを実現できます。

1.) 後者の場合は、両方の文字列を処理してそれぞれの正規化されたバージョンを取得し、比較を行います。大きな空白を 1 つのスペースに置き換え、両方の文字列のすべての文字を小文字にすることができます。文字列の正規化の例:

string.gsub(/\s+/, ' ').downcase

これは、タフな略語では機能しません。

2.) ステマーを使用して各単語トークンを共通の基本形に正規化すると、より良い結果が得られます。ステミングのいくつかの例: words=>word、feet=>foot、construction=>construct、... 語基 (lemas とも呼ばれる) を取得したら、それらを結合して文字列にすることができます。そして、比較を行います。通常、ステマーはダウンケースを実行するので、そのステップをスキップできます。

したがって、これら2つの文字列の両方:

"Hazard Const. Company"
"hazard construction company"

に変換する:

"hazard construct company"

コードは、使用される実際のステマーによって異なります。たとえば、これを見ることができます: https://github.com/aurelian/ruby-stemmer

ステミングされた単語の実際の出力は、使用するステマーによっても異なります。ステマー (レンマタイザー) が機能する方法は、ある種のトリミング ルールだけでなく、単語ベース (lemas) の内部ライブラリに単語を一致させようとします。したがって、優れたレンマタイザーは Const を認識します。省略形を作成し、それをコンストラクト lema と照合します。

すべての略語を認識できるわけではないため (ただし、たとえば 90% だけ)、正確な文字列と一致させない方がよいでしょう。ただし、距離計算 (@7stud が提案したように) によって類似性を計算し、テスト データの結果に基づいて許容可能な類似性のしきい値を微調整してみてください。これは、情報検索の通常のアプローチです。テキスト処理をカスタマイズして専門化できるほど、より良い結果が得られます。逆に言えば、一般的な処理を構築しようとすればするほど、それは難しくなり、結果は悪化します。

于 2013-08-14T09:55:54.760 に答える