#python #python-3.x #nlp #spacy
#python #python-3.x #nlp #spacy
Вопрос:
Что я хотел бы сделать
Я хотел бы проанализировать и проанализировать зависимости с помощью spaCy, одной из библиотек с открытым исходным кодом для обработки естественного языка.
И особенно я надеюсь узнать, как написать код для опции объединения знаков препинания и фраз в Python.
Проблема
В веб-приложении displaCy Dependency Vizualizer есть основания для сокращения знаков препинания и фраз.
Однако я не могу найти способ записать эти параметры, когда дело доходит до написания кода в локальной среде.
Текущий код возвращает следующую не объединенную версию.
Пример предложения взят из вашего словаря.
Текущий код
Это из примера кода на официальном сайте spaCy.
Пожалуйста, дайте мне знать, как это исправить, чтобы установить параметры слияния знаков препинания и фраз.
import spacy
from spacy import displacy
nlp = spacy.load("en_core_web_sm")
sentence = "On Christmas Eve, we sit in front of the fire and take turns reading Christmas stories."
doc = nlp(sentence)
displacy.render(doc, style="dep")
Что я пытался сделать
Был один пример реализации слияния. Однако это не сработало, когда я применил предложение.
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("On Christmas Eve, we sit in front of the fire and take turns reading Christmas stories.")
span = doc[doc[4].left_edge.i : doc[4].right_edge.i 1]
with doc.retokenize() as retokenizer:
retokenizer.merge(span)
for token in doc:
print(token.text, token.dep_, token.head.text, token.head.pos_,
[child for child in token.children])
Пример кода
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("Credit and mortgage account holders must submit their requests")
span = doc[doc[4].left_edge.i : doc[4].right_edge.i 1]
with doc.retokenize() as retokenizer:
retokenizer.merge(span)
for token in doc:
print(token.text, token.pos_, token.dep_, token.head.text)
Ответ №1:
Если вам нужно объединить фрагменты имен существительных, ознакомьтесь со встроенным компонентом конвейера merge_noun_chunks. При добавлении в ваш конвейер с помощью nlp.add_pipe он позаботится о слиянии промежутков автоматически.
Вы можете просто использовать код из визуализатора зависимостей displaCy:
import spacy
nlp = spacy.load("en_core_web_sm")
def merge_phrases(doc):
with doc.retokenize() as retokenizer:
for np in list(doc.noun_chunks):
attrs = {
"tag": np.root.tag_,
"lemma": np.root.lemma_,
"ent_type": np.root.ent_type_,
}
retokenizer.merge(np, attrs=attrs)
return doc
def merge_punct(doc):
spans = []
for word in doc[:-1]:
if word.is_punct or not word.nbor(1).is_punct:
continue
start = word.i
end = word.i 1
while end < len(doc) and doc[end].is_punct:
end = 1
span = doc[start:end]
spans.append((span, word.tag_, word.lemma_, word.ent_type_))
with doc.retokenize() as retokenizer:
for span, tag, lemma, ent_type in spans:
attrs = {"tag": tag, "lemma": lemma, "ent_type": ent_type}
retokenizer.merge(span, attrs=attrs)
return doc
text = "On Christmas Eve, we sit in front of the fire and take turns reading Christmas stories."
doc = nlp(text)
# Merge noun phrases into one token.
doc = merge_phrases(doc)
# Attach punctuation to tokens
doc = merge_punct(doc)
for token in doc:
print(token.text, token.pos_, token.dep_, token.head.text)