【问题标题】:Fuzzy match and get index of a pattern from a string模糊匹配并从字符串中获取模式的索引
【发布时间】:2021-10-14 05:00:17
【问题描述】:

我有一个公司名称列表,我想将其与句子列表进行匹配,并在任何句子中存在关键字时获取索引开始和结束位置。

我编写了用于完全匹配关键字的代码,但意识到句子中的名称并不总是完全匹配。例如,我的关键字列表可以包含Company One Two Ltd,但句子可以是-

  • Company OneTwo Ltd won the auction
  • Company 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


【解决方案1】:

我能想到 2-3 种可能性,各有优缺点:

  1. 创建更多功能的正则表达式

(Company|Co\.?)\s?One\s?Two\s?(Limited|Ltd)

  1. 在之前的建议的基础上,遍历公司列表并创建模糊搜索

Company->(Company|Co\.?)、' '->\s?、imited->(Limited|Ltd) 等

  1. Levenshtein 距离计算器

    example

它引用了外部库fuzzywuzzy,还有替代品fuzzy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-14
    • 2014-11-02
    • 2015-06-22
    • 2021-11-23
    • 2011-01-07
    • 2018-05-31
    • 2021-04-19
    • 1970-01-01
    相关资源
    最近更新 更多