1

iOS のペーストボードで有効な郵送先住所を確認する方法についてのガイダンスを探しています。

誰かが貼ったら

1234 Apple Street
New York, NY 10011

文字列の各部分を解析して、住所、都市、州、および郵便番号を入力します。任意のアドレスである可能性があり、より長い文字列内にあると理想的です。

例えば

Meet me at 1234 Apple Street New York, NY 10011 See you there!

それでも、正しい住所、都市、州、および郵便番号を解析します。

どんな助けでも大歓迎です!

-ウェス

4

2 に答える 2

3

私はSmartyStreetsの開発者でした。私たちは番地に夢中だったので、番地は私を夢中にさせました(特にそれらを解析しました)。双方向の道です。(私は通りの駄洒落で終わりましたか?)

最初に、アドレスがすべてそれ自体である場合について話しましょう。それはまだ難しいですが、それは簡単だからです...

この他の質問を参照して、まったく同じことについて答えてください。また、質問と回答の両方で、関連する質問へのリンクをたどることを強くお勧めします。アドレスの解析はワームの可能性がありますが、不可能ではありません。確実にそれを行うのは本当に難しいです。

その質問への回答で、有効なアドレスがいくつの異なる形式で表示されるかに注意してください。ユーザーがそれらのいずれかに入力することをどのように保証します?そして、それはほんの数例です。他にもあります。軍隊、私書箱、地方のルート、および一般的な形式に準拠していないその他の「特別な」住所を検討してください。2語または3語の都市名を持つ住所はどうですか?100 N 500 Eのようなグリッドシステムを使用する住所、またはスイート、アパート、フロアなどのセカンダリ番号はどうですか?「1/2」、ハイフン(必須の句読点として)などを含むアドレスはどうですか?不足している郵便番号または市/州に対応しますか?

これらすべておよびそれ以上が有効である可能性があります。そして、それは米国の住所のみです。

例として、すべてのアドレス、またはそれらのほとんど(そうではない)が上記で提案したような形式で提供された場合:

[素数][ストリート名][これらのストリートサフィックスのいずれか]

[都市名の後にコンマが続く]、[州の略語][5桁の郵便番号]

そうすれば、これは非常に簡単です。それはいいことではないでしょうか?

この人あの人のような正規表現を書こうとすることもできますが、それはアドレスが正規言語である場合にのみ機能します。それらは正規表現ではなく、正規表現は答えではありません

マスターリスト(種類)があり、ソフトウェアは厳格な認証基準を満たしている必要があるため、これを実行できるサービスがいくつかあります。

明らかに、私はSmartyStreetsで働いているので、そこで答えを探し始めることを提案する傾向があります。ホームページでいくつかの自由形式のアドレスを試すことができます(「ストリート」フィールドに入力するだけです)。ただし、おそらく常に問題になるいくつかのことに注意してください。LiveAddress APIは、ほとんどの場合、番地を解析できます。買い物をしますが、これはあなたにアイデアを与えるはずです。

次に、2番目の質問です。テキストの文字列から住所を抽出します。これは、SOやインターウェブの他の場所で広く取り上げられているため、詳細については説明しません。基本的に、これを確実に行うには、最良の推測を確認または修正するために、おそらく自然言語処理と人間の相互作用が必要になります。

標準化されていないアドレスについて、次のことを想定しないでください。

  • 数字で始まります
  • 数字で終わる
  • 2つの数字の間はすべて住所です
  • 郵便番号があります
  • 1つの住所に含まれる番号は2つまでです
  • それは明白です
  • それが存在します
  • 通りの接尾辞は常に存在します
  • スペルが正しい
  • ...等。

繰り返しになりますが、この問題に関する他のリンクされた投稿を参照してください。推測することはできますが、そうする場合は常に人間に推測を確認してもらいます。(一部のMacアプリはこれを行います。アドレスを検出すると、そのアドレスが強調表示され、そのアドレスを連絡先に追加できます。残念ながら、誤検知が多く見られ、見逃してしまいます。)

幸運を!

于 2013-01-21T03:15:12.313 に答える
3

私もSmartyStreetsで働いていますが、私は開発者ではないので、「できない」「確実にできる方法がない」などの制約に縛られることはありません。実際、私が思いつくアイデアは常に可能であるとは限りませんが、私は問題解決者であり、解決策を見つける人であり、この特定の問題には絶対に解決策があります.

必要なものは次のとおりです: 少しの正規表現、スクリプト言語 (python、php、お好きなもの) の知識、およびアドレス検証ツールへのアクセス (これは、いつ正しくなったかを知るために必要です)。

それでは、例文から始めましょう。

1234 Apple Street New York, NY 10011 で会いましょう。

すべてのアドレスに始まりと終わりがあることを確認できます。(銀行に持っていけます!)

そのため、文字列内のアドレスの先頭を探す正規表現を実行すると、アドレスが始まる前のすべてを削除できます。これを行う正規表現は次のとおりです。

(^(.*(?=p\.?o\.? box|h\.?c\.?r\.? |c\.?m\.?r\.?)|^[^0-9]+))

これにより、次のものが返されます。

1234 Apple Street New York, NY 10011 それではお会いしましょう!

これで途中までは終わりましたが、残りの文字列をループする必要があります。もう 1 つの前提として、アドレスは 328 文字を超えることはありません (この数字は私が作ったものですが、お分かりいただけると思います。アドレスにも終わりが必要であり、 USPS アドレスの許容最大長。)

有効なアドレスが取得されるまで、アドレス文字列をループします。これを行うには、先頭から開始し、順列が追加されるたびに 1 語ずつ右に移動します。これは、住所検証サービスが役立つ場所です。住所がどこで終わるかわからないため、それを知る必要があるからです。そのため、文字列から生成した各順列 (左側から開始していることを思い出してください) が検証のために送信されます。2 語未満の有効な住所は存在しないため、そこから始めます。以下は、住所の例と検証結果の順列です (smartystreets.com の住所検索ボックスの住所行に入力して、各住所を試しています。

1234 アップル ==> 失敗

1234 アップルストリート ==> 失敗

1234 Apple Street New ==> 失敗

1234アップルストリートニューヨーク==>失敗

1234 Apple Street New York, NY ==> ビンゴ、有効な住所一致。繰り返し続ける必要はありません。

明らかに、これは有効なアドレスではありませんが、実際のアドレスで同じことを試すと、同じ結果が得られます。明らかに、これは文字列から有効なアドレスを抽出するための最も洗練された方法ではありませんが、確かに機能します。また、SmartyStreets ではクエリごとに最大 100 個のアドレスを送信できるため、アドレス文字列を最大 99 回並べ替えて、300 ミリ秒未満で結果を返すことができます。お分かりのように、これはすべてのアドレスで機能するわけではありませんが、アドレスがテキスト文字列内でどれほど不明瞭であるかに関係なく、大多数のアドレスを非常に簡単に処理できます。

それで、私たちはこれから始めました 1234 Apple Street New York, NY 10011 で会いましょう! そして、0.5 秒もかからずに、この1234 Apple Street New York, NY 10011-1000を思いつきました。

かっこいいでしょ?プログラマーでなくても、とても簡単に聞こえます。


実際のアドレスで試してみましょう:

4219 jon young orlando fl 32839 で会いましょう。

正規表現を適用すると、次のようになります。

4219 ジョン ヤング オーランド fl 32839 ではまた!

並べ替え、反復、検証:

4219 ジョン ==> 失敗

4219 ジョン・ヤング ==> 失敗

4219 ジョン・ヤング・オーランド ==> 失敗

4219 jon young orlando fl ==> ビンゴ、有効なアドレス一致。

住所入力欄 結果の住所データ

于 2013-01-22T02:46:30.840 に答える