0

私は、多数の Web サイトからブログ投稿をスクレイピングするプログラムを作成しています。フリーテキストからオーストラリアのフォーマットの電話番号を抽出しようとしています。これはかなり難しいことが証明されています。

構成されたブログ投稿の例をいくつか示します。

例 1:

「こんにちは、私の名前はアリシアです。私は 32 歳で、過去 40 年間ブリスベンに住んでいます。身長 6 インチで、機敏なランナーです。2004 年以来、私は週に 2 ~ 3 回走っています。お気軽に +61 (04) 654 456 にお電話いただくか、別の番号 0434 43 22 34 をお試しください。」

このブログ投稿から、「04654456」と「0434432234」を抽出する必要があります

例 2:

「私はジョーです。ランニングも大好きです。身長 7 インチで、2004 年から続けています。トレーニングのアドバイスについては、043 572-6087 または (02) 1232 23 56 までお電話ください。」

このブログ投稿から、「0435726087」と「0212322356」を抽出する必要があります。

例 3:

「私の名前は Pricilla です。ランニングが大好きです。電話番号は 0 434 45 45 12 ですが、午前 12 時より前に電話しないでください (クライアントは 10 時から 11 時くらいまで起きていました)。ライセンス番号は 4335TE33 で、私は新品の 6 インチ タイヤを装着した 2004 フォード ブロンコを運転します。私は 28 km 走ることができますが、通常は 3 ~ 4 km ごとに休憩が必要です。今日電話してください (04) 3 445 4512"

このブログ投稿から、「0434454512」を抽出する必要があります。

私は、各ブログエントリに対して次のことを行う非常に精巧なシステムを考え出しました。

1) 数字以外のすべての文字を取り除き、トリムして二重スペースを削除します

2) 文字列を配列に変換します。これで、['0', '434', '45', '45, '12', '4335',​​ '33', '2004', '6', '28', '3', '4', '04', '34', '832', '234]

3) 数値の配列を繰り返し処理し、規則を適用してそれらをつなぎ合わせます。このコードは肥大化しており、あまりきれいではありません。

4) オーストラリアの携帯電話番号と固定電話番号の RegExp パターンを使用して結果を検証する

明らかに、正規表現を試してみましたが、この場合は大きな失敗です。

私のシステムはほとんどの場合動作しますが、コードは控えめに言ってもきれいではありません。

これをどのように攻撃しますか?

4

3 に答える 3

1

あなたが探しているのは、実際にはエンティティ抽出であることが知られている自然言語処理の研究分野です。問題への多くのアプローチと、そのようなタスクを解決するためのいくつかの数学的モデルがあります。幸いなことに、同様のタスクを実行するツールキットが利用可能です。OpenNLPStanford NERはその例です。名前、日付、品詞などを自動的に抽出するツールがあります。電話番号を抽出するように変更できる場合があります。知っておくべきことの 1 つは、これらが統計モデルであることです (現在のアプローチであるルール ベースとは対照的に)。トレーニングデータが必要になります。

これには、現在行っていることを大幅に変更する必要があるため、価値がある場合とそうでない場合があることに注意してください。ただし、非構造化テキストからのエンティティ抽出に関連するこのような問題に取り組む場合は、これらのツールについて知っておく価値があります。

OpenNLP/スタンフォードのドキュメントを調べて、探しているものが可能かどうかを確認することから始めます。

于 2015-08-04T03:38:02.163 に答える
0

すべての数字のみを使用すると間違った数字になることがあるので、正規表現を使用します。

+49 (0) 7121 / 1229-276

これは、ローカル 071211229276 または国際 004971211229276 として読み取られる必要があります。

于 2015-08-04T03:56:06.780 に答える
0

私はより簡単なアプローチを使用します:

  1. スペース、コンマ、括弧、およびその他の記号を可能な限り削除します。
  2. 正規表現を使用して、オーストラリアの電話番号の長さと一致する行の X 桁を一致させます。
于 2015-08-04T03:32:35.680 に答える