[英]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 行等。我建議使用像Google或Lob這樣的地址驗證 API。 這些可以把一根繩子分成幾部分。 還有一些類似usaddress的 python 解決方案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.