テキストマイニングと情報検索の主題に属する興味深い質問です。通常、ステミング (レンマタイゼーション) アルゴリズムを使用するか、より単純なヒューリスティックを使用して、記述されたマッチングを実現できます。
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 が提案したように) によって類似性を計算し、テスト データの結果に基づいて許容可能な類似性のしきい値を微調整してみてください。これは、情報検索の通常のアプローチです。テキスト処理をカスタマイズして専門化できるほど、より良い結果が得られます。逆に言えば、一般的な処理を構築しようとすればするほど、それは難しくなり、結果は悪化します。