文字列から使用可能な番地、市、州、郵便番号を解析します[終了]


131

問題:Sql Server 2005に変換されたAccessデータベースのアドレスフィールドがあります。このフィールドはすべて1つのフィールドにすべて含まれています。住所の個々のセクションを解析して、正規化されたテーブルの適切なフィールドに変換する必要があります。私はこれを約4,000レコードに対して実行する必要があり、繰り返し可能である必要があります。

仮定:

  1. 米国の住所を想定します(現時点では)

  2. 入力文字列に宛先(宛先の人)や2番目の住所(スイートBなど)が含まれる場合があると仮定します。

  3. 状態は省略される場合があります

  4. 郵便番号は、標準の5桁またはzip + 4です。

  5. 場合によってはタイプミスがあります

更新:提起された質問に答えて、標準は普遍的に順守されていませんでした。ジオコードとエラーだけでなく、個々の値を保存する必要があります。タイプミス(上記で修正)

サンプルデータ:

  • AP Croll&Son 2299 Lewes-Georgetown Hwy、Georgetown、DE 19947

  • 11522 Shawnee Road、Greenwood DE 19950

  • 144 Kings Highway、SW Dover、DE 19901

  • 統合された定数。サービス2 Penns Way Suite 405 New Castle、DE 19720

  • Humes Realty 33 Bridle Ridge Court、ルイス、DE 19958

  • Nichols Excavation 2742 Pulaski Hwy Newark、DE 19711

  • 2284 Bryn Zion Road、Smyrna、DE 19904

  • VEI Dover Crossroads、LLC 1500 Serpentine Road、Suite 100 Baltimore MD 21

  • 580 North Dupont Highway Dover、DE 19901

  • PO Box 778 Dover、DE 19903


いくつかの質問:1.区切り文字はありますか?2.文字列のフィールドの順序は何ですか?3.データエラーが発生した場合の動作(EGがアドレスをSQLテーブルの単一のフィールドに移動し、他は空白のままにする)
Jay Mooney

良い質問と非常に興味深い答え。zipから逆方向に作業することは一般的なテーマのようですが、顧客から生データを取得している場合、zipは正確ではない可能性があります。たとえば、ほとんどのサイトでは90210のアドレスの数が極端に多いと思います。
ケビンウィリアムズ

4
@Kevin:はい、アメリカ人は「郵便番号」を要求し、郵便番号を受け入れずにカナダ人をロックアウトしたいので、システムをバイパスするためにジブラッシュを入力する必要があります...残念ながら、唯一の郵便番号知っている90210です:-)編集:気にしないでください...あなたはどうやら紀元前に私から数キロ離れたところに住んでいるようです。あなたもおそらく同じことをします:-P
mpen '28

2
詳細については、このSOの質問を参照してください。
Matt

回答:


118

私はこの種の構文解析について多くの仕事をしてきました。エラーがあるため、100%の精度は得られませんが、ほとんどの方法でそこに到達するために実行できることがいくつかあり、その後、視覚的なBSテストを実行します。これを行う一般的な方法を次に示します。それはコードではありません。それを書くのはかなり学術的であり、奇妙なことはなく、文字列の処理がたくさんあるだけです。

(あなたはいくつかのサンプルデータを投稿したので、いくつかの小さな変更を加えました)

  1. 後方に働きます。末尾に近い郵便番号から開始し、XXXXXまたはXXXXX-XXXXの2つの既知の形式のいずれかを使用します。これが表示されない場合は、下の都市、州の部分にいると考えられます。
  2. 次は、zipの前の状態になります。これは、2文字の形式または単語になります。あなたもこれらがどうなるか知っています-それらの50だけがあります。また、スペルミスを補うのに役立つ単語をsoundexすることもできます。
  3. その前は都市で、おそらく州と同じ線にあります。郵便番号データベースを使用して、郵便番号に基づいて都市と州を確認するか、少なくともBS検出器として使用できます。
  4. 住所は通常、1行または2行です。2行目は通常、スイート番号がある場合はスイート番号ですが、私書箱の場合もあります。
  5. 1行目または2行目で名前を検出することはほぼ不可能ですが、番号が前に付いていない場合(または「attn:」または「注意:」が前に付いている場合は、次のようなヒントが得られます。名前か住所行か

これがある程度役に立てば幸いです。


14
50の州があることは事実ですが、USPSは米国郵政公社のドメイン内に59の2文字の略語があるとし、アメリカ軍を数えると65です。usps.com/send/official-abbreviations.htm
Mike Sherrill 'Cat Recall'

17
「50だけ」は、かなり少ない数があることを示すためのものでした。それは「65だけ」かもしれませんが、目前の問題を解決することは重要ではありません。
Tim Sullivan、

4
このアルゴリズムの詳細は、USPS Publication 28
Matt

92

問題をアウトソーシングするのが最善の策だと思います。それをGoogle(またはYahoo)ジオコーダーに送信します。ジオコーダーは、緯度/経度(ここでは重要ではありません)だけでなく、送信したものではないフィールド(ZIP + 4および郡を含む)が入力された、住所の豊富な解析も返します。

たとえば、「1600 Amphitheatre Parkway、Mountain View、CA」を解析すると、

{
  "name": "1600 Amphitheatre Parkway, Mountain View, CA, USA",
  "Status": {
    "code": 200,
    "request": "geocode"
  },
  "Placemark": [
    {
      "address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
      "AddressDetails": {
        "Country": {
          "CountryNameCode": "US",
          "AdministrativeArea": {
            "AdministrativeAreaName": "CA",
            "SubAdministrativeArea": {
              "SubAdministrativeAreaName": "Santa Clara",
              "Locality": {
                "LocalityName": "Mountain View",
                "Thoroughfare": {
                  "ThoroughfareName": "1600 Amphitheatre Pkwy"
                },
                "PostalCode": {
                  "PostalCodeNumber": "94043"
                }
              }
            }
          }
        },
        "Accuracy": 8
      },
      "Point": {
        "coordinates": [-122.083739, 37.423021, 0]
      }
    }
  ]
}

これ解析可能になりました!


4
これは、バッチプロセスがあるので、私は一度使用すると、複数のアドレスを提出することができるようにジオコーディングを行うには、スレッドプールを使用することをお勧めもしたい(あらゆる種類のバッチ・インターフェースをサポートしてグーグルのでしょうか?)
デヴィッド・

これは実際には住所行2(質問のピント5)には役立ちません
Christopher Mahan

71
利用規約は、多くの場合、商用および/または非公開の使用のための制限要因です。
Jay

これは良い解決策ですが、Google / Yahooが結果を返さないエッジケースがあります。たとえば、新しいアドレスや、データベースに単に欠けているアドレスなどです。
Peter DeWeese

これは良い解決策になります "IF"グーグルはバッチ呼び出しをMAPS APIに制限しませんでした
Hector

25

オリジナルポスターは、おそらく長い間に移動したが、私はPerlの移植で刺しを取ったジオを:: StreetAddress:米国で使用されるモジュールgeocoder.us C#には、CodePlexの上でそれをダンプし、人々が将来的にこの質問を越えつまずくと思うかもしれそれが便利だと思う:

米国の住所パーサー

プロジェクトのホームページで、私はその(非常に現実的な)制限について話そうとしています。有効な番地のUSPSデータベースによってサポートされていないため、解析はあいまいになる可能性があり、指定された住所の有効性を確認または拒否することはできません。文字列からデータを引き出そうとするだけです。

これは、主に正しいフィールドでデータのセットを取得する必要がある場合、またはデータ入力へのショートカットを提供したい場合(ユーザーが複数のフィールド間でタブ移動するのではなく、テキストボックスにアドレスを貼り付けられるようにする場合)を意味します。アドレスの配信可能性を検証するためのものではありません

それは通りの線より上にあるものを解析しようとはしませんが、おそらく正規表現を使ってかなり近いものを取得することができます-私はおそらく家の番号でそれを壊すだけでしょう。


17

SmartyStreetsには、任意の入力文字列から住所を抽出する新機能があります。(注:私はSmartyStreetsで働いていません。)

上記の質問で示されたサンプル入力からすべてのアドレスを正常に抽出しました。(ちなみに、これらの10アドレスのうち9つだけが有効です。)

次に出力の一部を示します。ここに画像の説明を入力してください

そして、同じリクエストのCSV形式の出力を次に示します。

ID,Start,End,Segment,Verified,Candidate,Firm,FirstLine,SecondLine,LastLine,City,State,ZIPCode,County,DpvFootnotes,DeliveryPointBarcode,Active,Vacant,CMRA,MatchCode,Latitude,Longitude,Precision,RDI,RecordType,BuildingDefaultIndicator,CongressionalDistrict,Footnotes
1,32,79,"2299 Lewes-Georgetown Hwy, Georgetown, DE 19947",N,,,,,,,,,,,,,,,,,,,,,,
2,81,119,"11522 Shawnee Road, Greenwood DE 19950",Y,0,,11522 Shawnee Rd,,Greenwood DE 19950-5209,Greenwood,DE,19950,Sussex,AABB,199505209226,Y,N,N,Y,38.82865,-75.54907,Zip9,Residential,S,,AL,N#
3,121,160,"144 Kings Highway, S.W. Dover, DE 19901",Y,0,,144 Kings Hwy,,Dover DE 19901-7308,Dover,DE,19901,Kent,AABB,199017308444,Y,N,N,Y,39.16081,-75.52377,Zip9,Commercial,S,,AL,L#
4,190,232,"2 Penns Way Suite 405 New Castle, DE 19720",Y,0,,2 Penns Way Ste 405,,New Castle DE 19720-2407,New Castle,DE,19720,New Castle,AABB,197202407053,Y,N,N,Y,39.68332,-75.61043,Zip9,Commercial,H,,AL,N#
5,247,285,"33 Bridle Ridge Court, Lewes, DE 19958",Y,0,,33 Bridle Ridge Cir,,Lewes DE 19958-8961,Lewes,DE,19958,Sussex,AABB,199588961338,Y,N,N,Y,38.72749,-75.17055,Zip7,Residential,S,,AL,L#
6,306,339,"2742 Pulaski Hwy Newark, DE 19711",Y,0,,2742 Pulaski Hwy,,Newark DE 19702-3911,Newark,DE,19702,New Castle,AABB,197023911421,Y,N,N,Y,39.60328,-75.75869,Zip9,Commercial,S,,AL,A#
7,341,378,"2284 Bryn Zion Road, Smyrna, DE 19904",Y,0,,2284 Bryn Zion Rd,,Smyrna DE 19977-3895,Smyrna,DE,19977,Kent,AABB,199773895840,Y,N,N,Y,39.23937,-75.64065,Zip7,Residential,S,,AL,A#N#
8,406,450,"1500 Serpentine Road, Suite 100 Baltimore MD",Y,0,,1500 Serpentine Rd Ste 100,,Baltimore MD 21209-2034,Baltimore,MD,21209,Baltimore,AABB,212092034250,Y,N,N,Y,39.38194,-76.65856,Zip9,Commercial,H,,03,N#
9,455,495,"580 North Dupont Highway Dover, DE 19901",Y,0,,580 N DuPont Hwy,,Dover DE 19901-3961,Dover,DE,19901,Kent,AABB,199013961803,Y,N,N,Y,39.17576,-75.5241,Zip9,Commercial,S,,AL,N#
10,497,525,"P.O. Box 778 Dover, DE 19903",Y,0,,PO Box 778,,Dover DE 19903-0778,Dover,DE,19903,Kent,AABB,199030778781,Y,N,N,Y,39.20946,-75.57012,Zip5,Residential,P,,AL,

私は最初にサービスを書いた開発者でした。私たちが実装したアルゴリズムは、ここでの特定の回答とは少し異なりますが、抽出された各住所は住所検索APIに対して検証されるため、それが有効かどうかを確認できます。検証された各結果は保証されていますが、他の結果は完全ではないことがわかっています。これは、このスレッドで十分に明らかにされているように、人間であってもアドレスは予測できないためです。


2
Smartystreetsは、彼らが何をするかに非常に優れています。これは彼らがサポートするAPIであると聞いてとても嬉しいです。
ftrotter 2017年

16

私は過去にこれをやったことがあります。

手動で実行するか(ユーザーがすばやく実行できる優れたGUIを作成)、自動化して最近のアドレスデータベースと照合し(購入する必要があります)、エラーを手動で処理します。

手動での処理にはそれぞれ約10秒かかります。つまり、1時間あたり3600/10 = 360を実行できるため、4000では約11〜12時間かかります。これにより、高い精度が得られます。

自動化するに、最近の米国の住所データベースが必要であり、それに対してルールを微調整します。私は正規表現を空想しないことをお勧めします(長期間維持するのは難しいため、多くの例外があります)。データベースに対して90%の一致を求め、残りを手動で行います。

http://pe.usps.gov/cpim/ftp/pubs/Pub28/pub28.pdfにあるPostal Addressing Standards(USPS)のコピーを入手してください。130ページ以上あることに注意してください。それを実装するための正規表現は、ナットになります。

国際住所の場合、すべての賭けはオフです。米国を拠点とする労働者は検証できません。

または、データサービスを使用します。ただし、推奨事項はありません。

さらに、メールの内容を送信する場合は(それが正しいのですが)、封筒に(正しい場所に)「アドレス修正要求」を入れて、データベースを更新してください。(フロントデスクの担当者が実際にメールを仕分けする担当者に簡単なGUIを作成しました)

最後に、データをスクラブした後、重複を探します。


14

ここでのアドバイスの後、私はVBで次の関数を考案しました。自分のルールを破ったなどの理由で、コメント/リファクタリング/怒鳴ってください:

Public Function parseAddress(ByVal input As String) As Collection
    input = input.Replace(",", "")
    input = input.Replace("  ", " ")
    Dim splitString() As String = Split(input)
    Dim streetMarker() As String = New String() {"street", "st", "st.", "avenue", "ave", "ave.", "blvd", "blvd.", "highway", "hwy", "hwy.", "box", "road", "rd", "rd.", "lane", "ln", "ln.", "circle", "circ", "circ.", "court", "ct", "ct."}
    Dim address1 As String
    Dim address2 As String = ""
    Dim city As String
    Dim state As String
    Dim zip As String
    Dim streetMarkerIndex As Integer

    zip = splitString(splitString.Length - 1).ToString()
    state = splitString(splitString.Length - 2).ToString()
    streetMarkerIndex = getLastIndexOf(splitString, streetMarker) + 1
    Dim sb As New StringBuilder

    For counter As Integer = streetMarkerIndex To splitString.Length - 3
        sb.Append(splitString(counter) + " ")
    Next counter
    city = RTrim(sb.ToString())
    Dim addressIndex As Integer = 0

    For counter As Integer = 0 To streetMarkerIndex
        If IsNumeric(splitString(counter)) _
            Or splitString(counter).ToString.ToLower = "po" _
            Or splitString(counter).ToString().ToLower().Replace(".", "") = "po" Then
                addressIndex = counter
            Exit For
        End If
    Next counter

    sb = New StringBuilder
    For counter As Integer = addressIndex To streetMarkerIndex - 1
        sb.Append(splitString(counter) + " ")
    Next counter

    address1 = RTrim(sb.ToString())

    sb = New StringBuilder

    If addressIndex = 0 Then
        If splitString(splitString.Length - 2).ToString() <> splitString(streetMarkerIndex + 1) Then
            For counter As Integer = streetMarkerIndex To splitString.Length - 2
                sb.Append(splitString(counter) + " ")
            Next counter
        End If
    Else
        For counter As Integer = 0 To addressIndex - 1
            sb.Append(splitString(counter) + " ")
        Next counter
    End If
    address2 = RTrim(sb.ToString())

    Dim output As New Collection
    output.Add(address1, "Address1")
    output.Add(address2, "Address2")
    output.Add(city, "City")
    output.Add(state, "State")
    output.Add(zip, "Zip")
    Return output
End Function

Private Function getLastIndexOf(ByVal sArray As String(), ByVal checkArray As String()) As Integer
    Dim sourceIndex As Integer = 0
    Dim outputIndex As Integer = 0
    For Each item As String In checkArray
        For Each source As String In sArray
            If source.ToLower = item.ToLower Then
                outputIndex = sourceIndex
                If item.ToLower = "box" Then
                    outputIndex = outputIndex + 1
                End If
            End If
            sourceIndex = sourceIndex + 1
        Next
        sourceIndex = 0
    Next
    Return outputIndex
End Function

渡すparseAddress機能を「AP Croll&ソン2299ルイス・ジョージタウンハイウェイ、ジョージタウン、DE 19947」を返します:

2299 Lewes-Georgetown Hwy
A. P. Croll & Son  
Georgetown
DE
19947

13

私はアドレス処理ドメインで約5年働いていますが、特効薬はありません。正しい解決策は、データの値に依存します。それがあまり価値がない場合は、他の回答が示唆しているように、パーサーを通してそれを投げます。それがいくらか価値がある場合でも、パーサーのすべての結果を人間に評価/修正してもらう必要があります。完全に自動化された再現可能なソリューションを探している場合は、Group1やTrilliumなどの住所修正ベンダーに相談することをお勧めします。


8

これで問題は解決しませんが、これらの住所の緯度/経度データのみが必要な場合、Google Maps APIはフォーマットされていない住所を適切に解析します。

良い提案ですが、代わりに、GoogleマップへのアドレスごとにCURLリクエストを実行すると、適切にフォーマットされたアドレスが返されます。それから、あなたはあなたの心の内容に正規表現をすることができます。


7

James A. Rosenの+1の解決策は私には問題なく機能したので推奨されますが、このサイトは完全な人にとっては魅力的な読み物であり、世界中の住所を文書化する上で私が見た中で最高の試みです。http//www.columbia.edu/kermit /postal.html


6

住所の記録方法に基準はありますか?例えば:

  1. 常に、ストリート1とストリート2を都市と州、郵便番号と州を区切るコンマまたは改行がありますか
  2. 住所の種類(道路、通り、大通りなど)は常につづられていますか?常に省略?それぞれのいくつか?
  3. 「エラー」を定義します。

私の一般的な答えは一連の正規表現ですが、これの複雑さは答えによって異なります。そして、一貫性がない場合は、正規表現で部分的な成功しか達成できない可能性があります(つまり:郵便番号と州を除外する)。残りは手動で行う必要があります(または少なくとも残りの部分を非常に通過する必要があります)エラーを見つけられるように注意してください)。


6

サンプルデータの別のリクエスト。

言及したように、私はzipから逆方向に作業します。

zipを取得したら、zipデータベースにクエリを実行して結果を保存し、それらと文字列からzipを削除します。

それはアドレスの混乱を残します。MOST(すべて?)アドレスは数字で始まるため、残りの文字列で最初に出現する数字を見つけ、それから文字列の(新しい)終わりまですべてを取得します。それがあなたの住所になります。その番号の左側にあるものはおそらく宛先です。

これで、City、State、およびZipがテーブルに格納され、場合によっては、addresseeとaddressの2つの文字列が格納されます。住所は「スイート」「アパート」の有無をご確認ください。など、2つの値に分割します(住所行1および2)。

宛先の場合は、その文字列の最後の単語をパントして姓として取得し、残りを名フィールドに入力します。それをしたくない場合は、冒頭であいさつ文(Mr.、Ms.、Dr。など)を確認し、名前のスペースの数に基づいていくつかの仮定を行う必要があります。作り物。

100%の精度で解析できる方法はないと思います。


6

www.address-parser.comをお試しください。私たちはあなたがオンラインでテストできる彼らのウェブサービスを使います


1
これは、大きなhtmlドキュメントで住所を検索する場合などに適しています。SOAPではなくRESTインターフェースが必要です。このリンクを共有するためのThx。
jspooner

1
それらと提携している場合は、それを開示する必要があります。
マット

1
彼らが価格を与える前に彼らのサービスがいかに価値があるかを私に彼らに言うことを要求するよりも彼らが価格見積もりを与えた方がいいでしょう。
トースター

5

サンプルデータに基づく:

  1. 文字列の最後から始めます。郵便番号を解析します(いずれかの形式)。最初のスペースまで読み終わります。郵便番号が見つからなかった場合はエラー。

  2. スペースと特殊文字(カンマ)の場合は、最後を切り取ります

  3. 次に、Stateに移動し、スペースを区切り文字として使用します。ルックアップリストを使用して、2文字の州コードと完全な州名を検証することもできます。有効な状態が見つからない場合、エラー。

  4. スペースとカンマを最後からもう一度削除します。

  5. 市はトリッキーになります。実際にここではコンマを使用しますが、市で大量のデータを取得するリスクがあります。コンマまたは行の先頭を探します。

  6. 文字列にまだ文字が残っている場合は、そのすべてをアドレスフィールドに移動します。

これは完璧ではありませんが、かなり良い出発点になるはずです。


4

人間が入力したデータの場合、例外を回避するためにコーディングに多くの時間を費やすことになります。

試してください:

  1. 郵便番号を抽出する正規表現

  2. 正しい住所を取得するための郵便番号の検索(適切な政府のDBを使用)

  3. インターンを取得して、新しいデータが古いデータと一致することを手動で確認します


3

これで問題は解決しませんが、これらの住所の緯度/経度データのみが必要な場合、Google Maps APIはフォーマットされていない住所を適切に解析します。


3

RecogniContactは、米国およびヨーロッパの住所を解析するWindows COMオブジェクトです。あなたはhttp://www.loquisoft.com/index.php?page=8でそれを正しく試すことができ ます


RecogniContactは一般公開されていないようです。アクセスするにはお問い合わせフォームを送信する必要がありますが、返信がありません。多分他の誰かが彼らと連絡を取る方法を知っています。
ルークヴァン


3

この種の問題は、データのあいまいさが根底にあるため、解決が困難です。

これは、正規表現に基づいて再帰的降下文法ツリーを定義し、住所の多くの有効な組み合わせを解析するPerlベースのソリューションです。http//search.cpan.org/~kimryan/Lingua-EN-AddressParse-1.20/lib/Lingua /EN/AddressParse.pm。これには、次のような住所内のサブプロパティが含まれます。12 1st Avenue N Suite#2 Somewhere CA 12345 USA

上記のhttp://search.cpan.org/~timb/Geo-StreetAddress-US-1.03/US.pmに似ていますが、イギリス、オーストラリア、アメリカなど、米国以外の住所でも機能します。カナダ。

これは、サンプルアドレスの1つの出力です。名前セクションを「AP Croll&Son 2299 Lewes-Georgetown Hwy、Georgetown、DE 19947」から削除して、「2299 Lewes-Georgetown Hwy、Georgetown、DE 19947」に減らす必要があることに注意してください。これは、文字列で最初に見つかった数値までのすべてのデータを削除することで簡単に実現できます。

Non matching part       ''
Error                   '0'
Error descriptions      ''
Case all                '2299 Lewes-Georgetown Hwy Georgetown DE 19947'
COMPONENTS              ''
country                 ''
po_box_type             ''
post_box                ''
post_code               '19947'
pre_cursor              ''
property_identifier     '2299'
property_name           ''
road_box                ''
street                  'Lewes-Georgetown'
street_direction        ''
street_type             'Hwy'
sub_property_identifier ''
subcountry              'DE'
suburb                  'Georgetown'

2

言葉に誤りの可能性があるので、文字列を比較するためにLCSアルゴリズムと組み合わせたSOUNDEXを使用することを考えてください。これは非常に役立ちます!


2

Google APIを使用

$d=str_replace(" ", "+", $address_url);
$completeurl ="http://maps.googleapis.com/maps/api/geocode/xml?address=".$d."&sensor=true"; 
$phpobject = simplexml_load_file($completeurl);
print_r($phpobject);

1
それはおそらくToSに違反していますが、問題なく機能するように見えます。質問を読み直しても、要件に完全には適合していません。
ジェイミーブル

2

RubyまたはRails開発者向けに、street_addressと呼ばれる便利なgemがあります。私はこれを私のプロジェクトの1つで使用しており、必要な作業を行います。

私が持っていた唯一の問題は、アドレスがこの形式であるP. O. Box 1410 Durham, NC 27702 場合は常にnilを返したため、「PO Box」を ''に置き換える必要があり、その後、それを解析できました。


上記のモジュールへのリンクが壊れています。代わりにこれを使用してください:search.cpan.org/~kimryan/Lingua-EN-AddressParse
Kim Ryan

1

郵便番号を指定すると、その郵便番号に含まれる通りの名前のリストが表示されるデータサービスがあります。

正規表現を使用してZipまたはCity Stateを抽出します-正しいものを見つけるか、エラーが両方とも発生するかどうかを確認します。データソースから通りのリストをプルする都市と州、次に通りの住所を修正します。有効な住所行1、都市、州、および郵便番号を取得したら、住所行2..3を推測できます。


1

これがどのように実現可能かはわかりませんが、これが言及されていないので、先に進んでこれを提案すると思いました。

厳密に米国にいる場合...すべての郵便番号、州、都市、通りの巨大なデータベースを入手してください。今あなたのアドレスでこれらを探してください。たとえば、見つけた都市があなたが見つけた州に存在するかどうかをテストしたり、あなたが見つけた通りがあなたが見つけた都市に存在するかどうかをチェックすることによって、あなたが見つけたものを検証できます。そうでない場合、可能性はジョンがジョンのストリートではない可能性がありますが、宛先の名前です...基本的には、できる限り多くの情報を取得し、それに対して住所をチェックします。極端な例は、Aの米国内のすべての住所のリストを取得し、各住所に最も関連性の高い住所を見つけることです...


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.