在匹配器对象中加入模糊搜索

问题描述

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

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

该规则仅会在包含两个术语的情况下识别匹配项。因此,它将接受“西奈山医院”,而不是“西奈山”。我试过 spaczz 包装 spaCy 并且非常适合单个术语或短语。然而,无论是 spaCy 还是 spaCzz,都不允许出现“Moung Sinai Mospital”中包含多个拼写错误的模糊多词规则。

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

匹配器的类 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,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,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 化的努力来实现此目标。

解决方法

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

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

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

请记住,与其他 Matcher 谓词一样,它匹配标记,因此您对模糊性的定义必须处于标记级别。