0

csvファイルの文字列をmysqlテーブル(照合:ut8_general_ci)で一致する可能性のある文字列と一致させようとする非常に単純なスクリプトを実行しています。csvファイルの各行について、必要な文字列(haystack)を引き出します。これは次のようになります。

「FullCmte。MemberCityof RutlandRutlandVT」

文字列ごとに、データベースから一致のリストを取得し、stristrが一致を見つけるまでそれらを循環します。(正規表現の代わりにstristrを使用しているのは、それがより単純で(私は思う?)より速いからです。)一致する文字列の一部は、このデータセットに固有のエイリアスとして構築されているため、文法的/構文的に意味がありません。そのうちの1つは、「City of Rutland Rutland VT」(「City of Rutland(VT)」の別名)です。これは、上記の文字列と一致する必要がありますが、一致しません。これらの試合の90%以上については、問題はありません。ただし、特定のテキストマッチングが機能していないようです。

一致を生成できないもののリストは次のとおりです。

干し草の山=>針

  • "FullCmte。MemberCityof Ocala Ocala FL" => "City of Ocala Ocala FL"
  • "フルボードメンバー水と衛生地区アンソニーNM"=>"水と衛生地区アンソニー"
  • 「EnergyCleanAir&Climate Change SubcmteMemberConsolInc。」=>「ConsolInc。」
  • "フルカウンシルメンバー;シニアVP統合サービスBurkeInc.Cincinnati OH" => "Burke Inc."
  • "テキサス州サンアントニオ市"=>"テキサス州サンアントニオ市"
  • "フルCmteメンバーUnitedNationalIndian Tribal Youth Inc.(UNITY)" => "United National Indian Tribal Youth Inc."
  • 「ECA&CCサブメンバーCyprusAmaxMineralsInc。」=>「CyprusAmaxMineralsInc。」
  • 「シリコンバレー製造グループ」=>「シリコンバレー製造グループ」
  • 「大統領地球環境資源株式会社ワシントンDC」=>「地球環境資源株式会社」
  • 「ランカスターラボラトリーズ株式会社」=>「ランカスターラボラトリーズ株式会社」

私が完全に見逃した非常に基本的なものでない限り、これをどうすればよいかわかりません。ほとんどのエラーには「inc」があるようです。試合中ですが、それが原因かどうかはわかりません。

コードは次のとおりです(ただし、以下の答えは法案に適合します)。

$patterns = array();
$patterns[0] = '/\s+/';
$patterns[1] = '/&/';

$replacement = array();
$replacement[0] = ' ';
$replacement[1] = 'and';

$name = trim(preg_replace($patterns,$replacement,$name));

if(stristr($name,trim(preg_replace($patterns,$replacement,$org->org_name)))) {
// code here
}

今のところそれほど優雅ではありません。文字列を正規化して照合する方法について、追加の洞察をいただければ幸いです。

4

1 に答える 1

4

私の推測では、これをブラウザでhtmlとして表示すると、(複数の)空白がすべて1つのスペースに凝縮されます。このように、一致するはずのように見えますが、一致しません。

これを防ぐための便利な方法は、副作用がほとんどなく、針と干し草の山の両方を前処理することです。

$needle = trim(preg_replace('/\s+/',' ',$needle));
$haystack = trim(preg_replace('/\s+/',' ',$haystack));

これtrim()は、先頭または末尾の空白によって引き起こされる問題を解決するためのものです。

于 2011-04-04T22:07:11.723 に答える