#c #cython #spacy #matcher
#c #cython #пространный #сопоставитель
Вопрос:
Моя задача — запрашивать медицинские тексты для названий институтов, используя правило, как показано ниже:
[{'ENT_TYPE': 'institute_name'}, {'TEXT': 'Hospital'}]
Правило идентифицирует совпадение только в том случае, если в него включены оба термина. Таким образом, он будет принимать «Больницу горы Синай», но не «Гору Синай». Я пробовал spaczz, который обертывает spaCy и отлично работает для одного термина или фразы. Однако ни spaCy, ни spaczz не допускают нечеткого правила из нескольких слов с более чем одной опечаткой, как в «Moung Sinai Mospital».
Поэтому я пытаюсь переписать объект сопоставления, включив алгоритм нечеткого подобия, такой как RapidFuzz, но у меня возникли некоторые трудности с его компонентом Cython.
Метод вызова класса сопоставления находит все последовательности токенов, соответствующие предоставленным шаблонам в doclike, документе для сопоставления или промежутке (Тип: Doc / Span), возвращая список (match_id, start, end) кортежей с описанием совпадений:
matches = find_matches (amp;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 в качестве атрибутов? Я надеюсь, что смогу расширить эту операцию с помощью алгоритма нечеткого сопоставления. Вы можете найти код для класса сопоставления, метода вызова и класса find_matches здесь .
Вы можете следовать более питоническим усилиям для достижения этой цели с помощью spaczz здесь.
Комментарии:
1. Вас конкретно интересует решение Cython или Python, которое можно сделать? Если последнее является вариантом, пожалуйста, опубликуйте воспроизводимый пример, на котором его можно протестировать. Кроме того, покажите порог того, что должно быть найдено, а что нет (положительные и отрицательные примеры).
Ответ №1:
Я думаю, что самым простым способом было бы добавить дополнительный тип предиката, называемый чем-то вроде FUZZY
. Посмотрите, как определяются предикаты regex, set и comparison, и сделайте что-то подобное для FUZZY
вашего пользовательского кода для сопоставления строк с небольшими различиями в редактировании:
https://github.com/explosion/spaCy/blob/master/spacy/matcher/matcher.pyx#L687-L781
Классы предикатов являются стандартными классами python, cython не требуется. Вам также нужно будет добавить предикат в схему spacy/matcher/_schemas.py
.
Помните, что, как и остальные Matcher
предикаты, он совпадает с токенами, поэтому ваше определение нечеткости должно быть на уровне токена.