[英]Fuzzy matching a string within a large body of text in Python (url)
我有一个公司名称列表,并且我有一个 url 提及公司名称的列表。
最终目标是查看 url,并找出 url 上的公司中有多少在我的列表中。
示例 URL: http://www.dmx.com/about/our-clients
每个 URL 的结构都会不同,所以我没有一个很好的方法来进行正则表达式搜索并为每个公司名称创建单独的字符串。
我想建立一个for循环,从URL的全部内容列表中搜索每个公司。 但似乎 Levenshtein 更适合两个较小的字符串,而不是一个短字符串和一大段文本。
这个初学者应该在哪里寻找?
在我看来,您不需要任何“模糊”匹配。 而且我假设当您说“url”时,您的意思是“url 指向的地址的网页”。 只需使用 Python 内置的 substring 搜索功能:
>>> import urllib2
>>> webpage = urllib2.urlopen('http://www.dmx.com/about/our-clients')
>>> webpage_text = webpage.read()
>>> webpage.close()
>>> for name in ['Caribou Coffee', 'Express', 'Sears']:
... if name in webpage_text:
... print name, "found!"
...
Caribou Coffee found!
Express found!
>>>
如果您担心字符串大小写不匹配,只需将其全部转换为大写即可。
>>> webpage_text = webpage_text.upper()
>>> for name in ['CARIBOU COFFEE', 'EXPRESS', 'SEARS']:
... if name in webpage_text:
... print name, 'found!'
...
CARIBOU COFFEE found!
EXPRESS found!
我会在 senderle 的回答中补充一点,以某种方式规范化您的名称可能是有意义的(例如,删除所有特殊字符,然后将其应用于 pages_text 和您的字符串列表。
def normalize_str(some_str):
some_str = some_str.lower()
for c in """-?'"/{}[]()&!,.`""":
some_str = some_str.replace(c,"")
return some_str
如果这还不够好,您可以 go 到difflib并执行以下操作:
for client in normalized_client_names:
closest_client = difflib.get_closest_match(client_name, webpage_text,1,0.8)
if len(closest_client) > 0:
print client_name, "found as", closest_client[0]
我选择的任意截止(Ratcliff/Obershelp)比率 0.8 可能过于宽松或过于严格; 玩一下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.