2

オーストラリアの住所をその部分に解析するための迅速で汚れた方法を探しています。
3A/45 Jindabyne Rd, Oakleigh, VIC 3166

次のように分割する必要があります:
"3A"45"Jindabyne Rd" "Oakleigh""VIC"3166

郊外の名前には、通りの名前と同様に複数の単語を含めることができます。


参照:コンポーネントへのスティート アドレスの解析

Java でなければならず、http 要求を行うことはできません (例: Web API に対して)。


編集: 指定された形式が常に続くと仮定します。形式が正しくない文字列をユーザーに送り返して、形式に従うように指示するメッセージを表示しても問題はありません (これについては上記で説明しました)。

4

7 に答える 7

8

正直なところ、あなたはここでかなりシシフィアンな挑戦を自分自身に課しています。それが価値があるかどうかはわかりません. データが既知のソースから取得され、非常に適切に指定された形式でない限り、まったく役に立たないデータを取得することになります。フリーテキストを扱っている場合、人々は信じられない方法でアドレスを台無しにします。

Richmond, Victoria, 3121Richmond 3121 VICとなどのすべての可能な組み合わせを (自分で) 解析しようとしますRichmond VIC, 3121か? そして、それは単なる郊外の粒度です!

アドレスはさらに悪いです。確かに、ほとんどの人は7/21 Smith St1 つのユニット、または29-33 Jones St複数の番地にまたがる場所を希望しますが、一貫性はありません。ユニット 1 は 5 番地ですか1-5 Brown St、それともその通りの 1 番から 5 番にまたがる場所ですか? 別の細分化された番地ですか7A、それとも 7 番地のユニット A ですか?

住所の照合は単純な問題ではありません。データ セットがエンド ユーザーが入力した自由なテキストである場合、データの量がわずかであるか、正確さをそれほど気にしない限り (または、代わりに、手動のクリーンアップに多くの時間がかかります)。そうでない場合は、この作業を行うソフトウェアに引き渡してください。

Australia Post には、オーストラリアのすべての有効な配達場所を含むPostal Address File (PAF)と呼ばれるものがあります。解析と照合を行うソフトウェア ライブラリが多数あり、最終的な回答 (個々の住所コンポーネントをすべて含む) を提供するか、選択可能な一致候補のリストを提供します。アドレスが存在しないかあいまいな場合。私が知っている 1 つの例はQAS Batchです(彼らとはまったく提携しておらず、過去に彼らのソフトウェアを評価しましたが、最終的には使用しませんでした) が、これはほんの一例です。PAF Web サイトからアクセスできるその他のリストがあります。

些細な規模でない限り、これに時間を無駄にしないよう強くお勧めすることはできません。

もしそうなら、ねえ、ええ、正規表現。

于 2010-03-01T23:10:47.847 に答える
3

私の他の回答への返信を考えると、これは、指定した厳密にフォーマットされたケースに対して行う必要があります。

    String sample = "3A/45 Jindabyne Rd, Oakleigh, VIC 3166";
    Pattern pattern = Pattern.compile("(([^/ ]+)/)?([^ ]+) ([^,]+), ([^,]+), ([^ ]+) (\\d+)");
    Matcher m = pattern.matcher(sample);
    if (m.find()) {
        System.out.println("Unit: " + m.group(2));
        System.out.println("Number: " + m.group(3));
        System.out.println("Street: " + m.group(4));
        System.out.println("Suburb: " + m.group(5));
        System.out.println("State: " + m.group(6));
        System.out.println("Postcode: " + m.group(7));
    } else {
        throw new IllegalArgumentException("WTF");
    }

これは、'3A/' を削除した場合 (この場合m.group(2)は null になります)、番地が '45A' または '45-47' の場合、道路にスペースを追加した場合 ('Jindabyne East Rd')、または郊外へ(「オークリー・サウス」)。

正規表現に慣れていない場合は、その正規表現をさらに説明するために:

(([^/ ]+)/)?は just と同等です([^/ ]+/)?-- つまり、「スラッシュまたはスペースを含まず、その後にスラッシュが続くもの」です。疑問符はそれをオプションにし (節全体が欠落している可能性があります)、最終バージョンの余分な括弧は、後で抽出するために、スラッシュなしで小さな内部グループを作成するためのものです。

([^ ]+)は「スペースではないものをキャプチャする (スペースが続く)」です。これは通りの番号です。

([^,]+),は「カンマ以外のすべてをキャプチャ (カンマとスペースが続く)」です。これは通りの名前です。通りの名前はコンマでなければ何でも有効です。

([^,]+),再び同じです。この場合は郊外をキャプチャします。

([^ ]+)次の非スペース文字列 (州の省略形) をキャプチャし、その後のスペースをスキップします。

(\\d+)任意の桁数 (郵便番号) を取得して丸めます

お役に立てば幸いです。

于 2010-03-02T11:04:25.063 に答える
2

うーん、フォーマットが明確に定義されていないため、おそらくかなり難しいでしょう。

正規表現は確かに迅速で汚い解決策として機能します。問題は、特殊な場合におそらく失敗する (誤った結果を生成する) ことです。

最善の策は、おそらく小さな正規表現をハックして、それを現実的なデータセット (理想的には本番環境にあるすべてのもの) に対して実行し、良い結果が得られるかどうかを確認することです。手作業が多いかもしれませんが、おそらくあなたができる最善のことです...

編集:ところで、Javaで正規表現を使用するには、 package のメソッドを使用しますjava.util.regex。私はそれについて言及すると思いました...

于 2010-03-01T12:10:46.630 に答える
0

商用ソリューションの場合は、address-parser.comを試すことができます。

于 2010-06-09T08:58:46.477 に答える
0

最初にString.split,を使用し、次に.またはを使用できます/

于 2010-03-01T12:09:44.993 に答える