У меня есть текст: «Алфавит - это компания. Также она стоит за Google. Но это не одно и то же».
На основе примененного совпадения пространств возвращает метку, начало и конец совпадений.
Теперь, основываясь на начале и конце, есть ли способ расширить диапазон до целого предложения (слово, которое заканчивается точкой)?
{
matches = self.matcher(doc)
spans = []
for label, start, end in matches:
span = Span(doc, start, end, label=label)
}
Итак, ожидаемый результат приведен ниже ....
Фактический
Entities[('Alphabet','myORG'),('Google','myORG')]
Ожидая
Entities[('Alphabet is a company','myORG'),('Also it is behind Google','myORG')]
Код, который я использовал:
{
from __future__ import unicode_literals, print_function
import plac
from spacy.lang.en import English
from spacy.matcher import PhraseMatcher
from spacy.tokens import Doc, Span, Token
def main(text="Alphabet is a company. Also it is behind Google. But these are not the same", *companies):
nlp = English()
if not companies:
companies = ['Alphabet', 'Google', 'Netflix', 'Apple']
component = myFindingsMatcher(nlp, companies)
nlp.add_pipe(component, last=True)
doc = nlp(text)
print('Entities', [(e.text, e.label_) for e in doc.ents]) # all orgs are entities
class myFindingsMatcher(object):
name = 'myFindings_matcher'
def __init__(self, nlp, companies=tuple(), label='myORG'):
patterns = [nlp(finding_type) for finding_type in companies]
self.matcher = PhraseMatcher(nlp.vocab)
self.matcher.add(label, None, *patterns)
def __call__(self, doc):
matches = self.matcher(doc)
spans = []
for label, start, end in matches:
span = Span(doc, start, end, label=label)
spans.append(span)
doc.ents = spans
return doc
if __name__ == '__main__':
plac.call(main)
}
Спасибо.