【发布时间】:2021-10-14 05:00:17
【问题描述】:
我有一个公司名称列表,我想将其与句子列表进行匹配,并在任何句子中存在关键字时获取索引开始和结束位置。
我编写了用于完全匹配关键字的代码,但意识到句子中的名称并不总是完全匹配。例如,我的关键字列表可以包含Company One Two Ltd,但句子可以是-
Company OneTwo Ltd won the auctionCompany One Two Limited won the auction-
The auction was won by Co. One Two Ltd和其他变体
给定一个公司名称,即使句子中的公司名称不是完全匹配而是变体,我也想找出索引的开始和结束位置。下面是我为精确匹配编写的代码。
def find_index(texts, target):
idxs = []
for i, each_sent in enumerate(texts):
add = [(m.start(0), m.end(0)) for m in re.finditer(target, each_sent)]
if len(add):
idxs.append([(i, m.start(0), m.end(0)) for m in re.finditer(target, each_sent)])
return idxs
【问题讨论】:
-
您可能需要修改目标以使其更加通用,例如
(Company|Co\.?)\s?One\s?Two\s?(Limited|Ltd) -
@depperm,我有大约 10k 个这样的公司名称,它们彼此之间并不常见,我正在尝试获取索引。这可能适用于少数情况,但不可能手动完成所有可能性。
-
虽然不干净,但您可以遍历公司列表并创建模糊搜索
Company->(Company|Co\.?)、' '->\s?、Limited->(Limited|Ltd)等。在不了解所有数据的情况下很难提出可能的解决方案 -
另一种选择是创建一个 levenshtein 距离计算器,尽管它有自己的缺点 example
-
@depperm,Levenshtein 距离也是我发现的。调查它.. 感谢您的链接
标签: python regex string nlp fuzzy-search