【问题标题】:Incorporating fuzzy search in a matcher object在匹配器对象中加入模糊搜索
【发布时间】:2020-12-26 06:41:04
【问题描述】:

我的任务是使用以下规则在医学文本中查询机构名称:

[{'ENT_TYPE': 'institute_name'}, {'TEXT': 'Hospital'}]

仅当两个词都包含在其中时,该规则才会识别匹配。因此,它将接受“西奈山医院”,而不是“西奈山”。我试过 spaczz 包裹 spaCy 并且适用于单个术语或短语。然而,spaCy 和 spaczz 都不允许像“Moung Sinai Mospital”中那样包含多个错字的模糊多词规则。

因此,我试图通过结合模糊相似性算法(例如 RapidFuzz)来重写 Matcher object,但我在使用它的 Cython 组件时遇到了一些困难。

Matcher's Class call method 查找与 doclike 上提供的模式匹配的所有标记序列,要匹配的文档或 Span(类型:Doc/Span),返回 (match_id, start, end) 元组列表,描述匹配项:

matches = find_matches (&self.patterns[0], self.patterns.size(), doclike, length,
                            extensions=self._extensions, predicates=self._extra_predicates)
    for i, (key, start, end) in enumerate(matches):
        on_match = self._callbacks.get(key, None)
        if on_match is not None:
            on_ma
    return matches

find_matches 是一个 cython 类,它返回文档中的匹配项,将已编译的模式数组作为 (id, start, end) 元组的列表,并具有似乎将文档与预定义模式匹配的主循环:

# Main loop
cdef int nr_predicate = len(predicates)
for i in range(length):
        for j in range(n):
                  states.push_back(PatternStateC(patterns[j], i, 0))
            transition_states(states, matches, predicate_cache,
                   doclike[i], extra_attr_values, predicates)
        extra_attr_values += nr_extra_attr
        predicate_cache += len(predicates)

你能帮我在 python/C 级对象中将实际匹配操作(针对字符串的模式)定位为属性吗?我希望能够用模糊匹配算法扩展这个操作。您可以找到 Matcher 类、call 方法和 find_matches 类here 的代码。

您可以通过 spaczz here 遵循更加 Python 的努力来实现此目标。

【问题讨论】:

  • 您是对 Cython 解决方案还是 Python 解决方案特别感兴趣?如果后者是一个选项,请发布一个可复制的示例,可以对其进行测试。同时,显示应该找到而不是应该找到的阈值(正面和负面示例)。

标签: c cython spacy matcher


【解决方案1】:

我认为最简单的方法是添加一个额外的谓词类型,称为FUZZY。查看正则表达式、集合和比较谓词是如何定义的,并使用您的自定义代码为 FUZZY 执行类似的操作,以匹配编辑差异较小的字符串:

https://github.com/explosion/spaCy/blob/master/spacy/matcher/matcher.pyx#L687-L781

谓词类是标准的 python 类,不需要 cython。您还需要将谓词添加到 spacy/matcher/_schemas.py 中的架构中。

请记住,与 Matcher 的其余谓词一样,它匹配令牌,因此您对模糊性的定义必须在令牌级别。

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多