Как написать код для объединения знаков препинания и фраз с помощью spaCy

#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)