まえがき
当社には独自のCRMがあり、正確な住所を持つ特定の組織に関する情報が定期的にこのシステムに追加されます。主なことは、これらの住所は本質的に一意であるということです。ただしchelfakomによって制御されます*)。 最近、KLADRはシステムにねじ込まれましたが、万能薬でもありませんでした。 KLADRには多くの不正確さがあります。 ポイントは家番号などなしで残されました。 など。ただし、これらの住所は現実のものです(データは会社の従業員によって提供され、信頼性があります)。 一般に、住所の入力は、KLADRからのヒントとともに自由な形式で残されました。 フィールドの組み合わせを拒否したことをすぐに言いたいのは、 略語のさまざまな略語は前兆ではなく、似顔絵の住所も非常に容認されていました(「Ololoshskoe sh。5km」、「TC Veselchak U」、さらには「Central Market」)。 そして最後に、プログラマーの主な敵はchelfuckで、これは非識字とタイプミスからスティッキーなキーボードとタイプミスまでを暗示しています。 残りはカットの下にあり......
何がありますか
一方では、あるフィールドに特定のアドレスで満たされたデータベースがあり、他方では、すべての結果を従業員システムに報告するために急いでいます。 可能な限り重複からデータを保護したかったため、レコードの重複の可能性に関する警告をユーザーに表示することにしました。
問題解決
アルゴリズムについてできる限り正確にコメントしようとしたので、簡単な説明で説明します。
- ソーステキストを取得し、「余分な」部分を削除します
- アドレス内の単語をいわゆる音節に分割します
- 入力についても同じことを行います。
- パーセントで音節の一致を確認する
- 私たちはそれを落とすためにアドレスの数字をさらにチェックします。 誤って印刷された別の家や建物番号のある通りでさえ、重複とは見なされないはずです
- 比較後に評決を下します
- 見つかった場合、同様の一致を与えます
- 棚からパイを取る
仕組み
以下はコードです。
function clearAddr($addr) { $associate = array( " " => "", // "." => "", "." => "", "." => "", "." => "", "." => "", "." => "", "." => "", "." => "", "-." => "", "-" => "", "-." => "", "-" => "", "-." => "", "-" => "", "." => "", "" => "", ".-" => "", "." => "", "" => "", "." => "", "." => "", "." => "", "." => "", "." => "", "-." => "", "-" => "", "-" => "", "-." => "", "1-" => "", "2-" => "", "3-" => "", "4-" => "", "5-" => "", "6-" => "", "7-" => "", "8-" => "", "9-" => "", "1-" => "", "2-" => "", "3-" => "", "4-" => "", "5-" => "", "6-" => "", "7-" => "", "8-" => "", "9-" => "" ); $clrd_addr = strtolower(strtr($addr, $associate)); return $clrd_addr; } function getNums($search) { preg_match_all("/[0-9]*/", $search, $matches); $matches = array_diff($matches[0], array("")); // $matches return $matches; } function getMatchAdress($addr_string, &$Addr_array) { if(!isset($addr_string) || strlen($addr_string) < 1) return false; $list = array(); $nums = getNums($addr_string); // $addr_string = clearAddr(preg_replace("/[0-9]*/", "", $addr_string)); // $word_parts = explode("\n", chunk_split(trim($addr_string), 2)); // 2 array_pop($word_parts); // foreach($Addr_array as $row) { $word_match = 0; $last_pos = 0; // $clr_row = clearAddr($row); $row_nums = getNums($row); // .. foreach($word_parts as $syllable) { $match_in = strpos($clr_row, strtolower(trim($syllable)), $last_pos); // - // if($match_in > -1 && $match_in < $last_pos + 4) { $last_pos = $match_in + strlen(trim($syllable)); $word_match++; } } $all_percents = count($word_parts); // $found_percents = $word_match; // $match_perc = round($found_percents * 100 / $all_percents); // $max_point = 70; // // if($match_perc >= $max_point) { if(!empty($nums)) { // foreach($nums as $num) { if(in_array($num, $row_nums)) $list[] = $row; } } else { // $list[] = $row; } } } return $list; }
それはどのように見えますか
データベースに含まれるもの:
. , .40
. , .14
4- ., .1
. , .15
., .6
. ., .48
...
...
...
. , .31/22
. , .23, . 41
. -, .11
- , .39, .1
4- ., .4
, .2
私たちは入り口で与える:Doryninsiy
出口には次のものがあります。
Array ( [0] => 4- ., .1 [1] => 4- ., .4 )
検索クエリがドリニンスキーd.1のように見える場合、ゼロキーのみが表示されます。
利益!、生き延びてくれてありがとう。