簡體   English   中英

如何在 python 中使用 NLTK 從原始文本中提取地址?

[英]How can I extract address from raw text using NLTK in python?

我有這個文字

'''嗨,Sam D. Richards 先生住在這里, 44 West 22nd Street, New York, NY 12345 你現在可以聯系他嗎? 如果您需要任何幫助,請致電 12345678'''

. 如何使用 NLTK 從上述文本中提取地址部分? 我試過Stanford NER Tagger ,它只給我New York作為位置。 如何解決這個問題?

絕對是正則表達式:)

就像是

import re

txt = ...
regexp = "[0-9]{1,3} .+, .+, [A-Z]{2} [0-9]{5}"
address = re.findall(regexp, txt)

# address = ['44 West 22nd Street, New York, NY 12345']

解釋:

[0-9]{1,3} :1到3位數字,地址號

(space) : 數字和街道名稱之間的空格

.+ :街道名稱,任意出現次數的任意字符

, : 城市前的逗號和空格

.+ : 城市,任意出現次數的任意字符

, : 狀態前的逗號和空格

[AZ]{2} :從 A 到 Z 正好 2 個大寫字符

[0-9]{5} : 5 位數字

re.findall(expr, string)將返回一個包含所有發現的數組。

Pyap 不僅適用於這個特定示例,而且適用於文本中包含的其他地址。

text = ...
addresses = pyap.parse(text, country='US')

Checkout libpostal ,一個專門用於地址提取的庫

它不能從原始文本中提取地址,但可能有助於相關任務

對於從批量文本中提取美國地址:

對於大量文本中的美國地址,我運氣不錯,盡管下面的正則表達式並不完美。 它不適用於許多奇怪類型的地址,並且僅捕獲 zip 的前 5 個。

解釋:

  • ([0-9]{1,6}) - 開始的 1-5 位數字字符串
  • (.{5,75}) - 任何字符 5-75 次。 我查看了我感興趣的地址,絕大多數地址行 1、地址 2 和城市的字符數超過 5 個且低於 60 個字符。
  • (BIG LIST OF AMERICAN STATS AND ABBERVIATIONS) - 這是為了匹配各州。 假設州名將是 Title Case。
  • .{1,2} - 旨在適應狀態和 zip 之間的 ,/s 或僅 /s 的許多排列
  • ([0-9]{5}) - 捕獲 zip 的前 5 個。

text = "is an individual maintaining a residence at 175 Fox Meadow, Orchard Park, NY 14127. 2. other,"

address_regex = r"([0-9]{1,5})(.{5,75})((?:Ala(?:(?:bam|sk)a)|American Samoa|Arizona|Arkansas|(?:^(?!Baja )California)|Colorado|Connecticut|Delaware|District of Columbia|Florida|Georgia|Guam|Hawaii|Idaho|Illinois|Indiana|Iowa|Kansas|Kentucky|Louisiana|Maine|Maryland|Massachusetts|Michigan|Minnesota|Miss(?:(?:issipp|our)i)|Montana|Nebraska|Nevada|New (?:Hampshire|Jersey|Mexico|York)|North (?:(?:Carolin|Dakot)a)|Ohio|Oklahoma|Oregon|Pennsylvania|Puerto Rico|Rhode Island|South (?:(?:Carolin|Dakot)a)|Tennessee|Texas|Utah|Vermont|Virgin(?:ia| Island(s?))|Washington|West Virginia|Wisconsin|Wyoming|A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])).{1,2}([0-9]{5})"

addresses = re.findall(address_regex, text)

然后地址是: [('175', ' Fox Meadow, Orchard Park, ', 'NY', '', '14127')]

您可以組合這些並刪除空格,如下所示:

for address in addresses:
    out_address = " ".join(address)
    out_address = " ".join(out_address.split())

然后將其分解為正確的第 1 行、第 2 行等。我建議使用像GoogleLob這樣的地址驗證 API。 這些可以把一根繩子分成幾部分。 還有一些類似usaddress的 python 解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM