Как проверить различия между двумя объектами spaCy Doc? - PullRequest
0 голосов
/ 08 марта 2019

У меня есть два списка одинаковых строк в каждом, за исключением незначительных вариаций в строках второго списка, то есть без прописных букв, орфографических ошибок и т. Д.

Я хочу проверить, делает ли spaCy что-то по-разному между двумя строками. Это означает, что даже если строки не эквивалентны, я хочу знать, есть ли различия в тегировании и разборе.

Я попробовал следующее:

import spacy
import en_core_web_sm
nlp = en_core_web_sm.load()

doc = nlp("foo")
doc2 = nlp("foo")

print(doc == doc2)

Это печатает False, поэтому == - не тот путь.

В идеале, я бы хотел, чтобы мой код обнаружил потенциальные различия, но проверка, если что-то отличается, была бы очень полезным первым шагом.

EDIT:

== был изменен для работы в новых версиях SpaCy. Тем не менее, он сравнивает только уровень текста. Что касается зависимости, то это совершенно другая история, и пока она не получила ответа для spaCy, за исключением этой темы, конечно.

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Сравнение на уровне токенов

Если вы хотите узнать, отличается ли аннотация, вам придется просмотреть токены документов по токену, чтобы сравнить POS-теги, метки зависимостей и т. Д. Предполагается, что токенизациято же самое для обеих версий текста, вы можете сравнить:

import spacy
nlp = spacy.load('en')
doc1 = nlp("What's wrong with my NLP?")
doc2 = nlp("What's wring wit my nlp?")
for token1, token2 in zip(doc1, doc2):
    print(token1.pos_, token2.pos_, token1.pos1 == token2.pos1)

Вывод:

NOUN NOUN True
VERB VERB True
ADJ VERB False
ADP NOUN False
ADJ ADJ True
NOUN NOUN True
PUNCT PUNCT True

Визуализация для сравнения Parse

Если вы хотитевизуально осмотрите различия, возможно, вы ищете что-то вроде Что не так с моим НЛП? .Если токенизация одинакова для обеих версий документа, то я думаю, что вы можете сделать что-то вроде этого для сравнения парсетов:

Во-первых, вам нужно будет экспортировать аннотацию в поддерживаемый формат (некоторая версияCoNLL для анализа зависимостей), что может сделать textacy.(См .: https://www.pydoc.io/pypi/textacy-0.4.0/autoapi/export/index.html#export.export.doc_to_conll)

from textacy import export
export.doc_to_conll(nlp('What's wrong with my NLP?'))

Вывод:

# sent_id 1
1       What    what    NOUN    WP      _       2       nsubj   _       SpaceAfter=No
2       's      be      VERB    VBZ     _       0       root    _       _
3       wrong   wrong   ADJ     JJ      _       2       acomp   _       _
4       with    with    ADP     IN      _       3       prep    _       _
5       my      -PRON-  ADJ     PRP$    _       6       poss    _       _
6       NLP     nlp     NOUN    NN      _       4       pobj    _       SpaceAfter=No
7       ?       ?       PUNCT   .       _       2       punct   _       SpaceAfter=No

Затем необходимо решить, как что-то изменить, чтобы вы могли видеть обе версии токена в анализе. I 'd предлагаем объединить токены, где есть вариации, скажем:

1       What         what    NOUN    WP      _       2       nsubj   _       SpaceAfter=No
2       's           be      VERB    VBZ     _       0       root    _       _
3       wrong_wring  wrong   ADJ     JJ      _       2       acomp   _       _
4       with_wit     with    ADP     IN      _       3       prep    _       _
5       my           -PRON-  ADJ     PRP$    _       6       poss    _       _
6       NLP_nlp      nlp     NOUN    NN      _       4       pobj    _       SpaceAfter=No
7       ?            ?       PUNCT   .       _       2       punct   _       SpaceAfter=No

против аннотации для What's wring wit my nlp?:

1       What         what    NOUN    WP      _       3       nsubj   _       SpaceAfter=No
2       's           be      VERB    VBZ     _       3       aux     _       _
3       wrong_wring  wr      VERB    VBG     _       4       csubj   _       _
4       with_wit     wit     NOUN    NN      _       0       root    _       _
5       my           -PRON-  ADJ     PRP$    _       6       poss    _       _
6       NLP_nlp      nlp     NOUN    NN      _       4       dobj    _       SpaceAfter=No
7       ?            ?       PUNCT   .       _       4       punct   _       SpaceAfter=No

Затем необходимо преобразовать оба файла в более старую версиюCoNLL поддерживается whatswrong. (Основная проблема заключается в удалении закомментированных строк, начинающихся с #.) Один из существующих вариантов - это преобразование CoNLL-U в CoNLL-X инструментов UD: https://github.com/UniversalDependencies/tools/blob/master/conllu_to_conllx.pl,, и тогда у вас есть:

1       What         what    NOUN    NOUN_WP _       2       nsubj   _       _
2       's           be      VERB    VERB_VBZ        _       0       root    _       _
3       wrong_wring  wrong   ADJ     ADJ_JJ  _       2       acomp   _       _
4       with_wit     with    ADP     ADP_IN  _       3       prep    _       _
5       my           -PRON-  ADJ     ADJ_PRP$        _       6       poss    _       _
6       NLP_nlp      nlp     NOUN    NOUN_NN _       4       pobj    _       _
7       ?            ?       PUNCT   PUNCT_. _       2       punct   _       _

Вы можете загрузить эти файлы (один как золотой, а другой как угадать) и сравнить их, используя whatswrong. Выберите формат CoNLL 2006 (CoNLL 2006 такой же, как CoNLL-X).

What's Wrong With My NLP? screenshot

Этот python-порт whatswrong немного нестабилен, но в целом, похоже, работает: https://github.com/ppke-nlpg/whats-wrong-python

What's Wrong With My NLP? python port screenshot

Кажется, что они оба предполагают, что у нас есть золотые POS-теги, так что сравнениеison не отображается автоматически.Вы также можете объединить POS-столбцы, чтобы иметь возможность видеть оба (точно так же, как с токенами), поскольку вам действительно нужны POS-теги, чтобы понять, почему разборы различаются.

Как для пар токенов, так и для пар POSЯ думаю, что было бы легко изменить либо исходную реализацию, либо порт python, чтобы показывать обе альтернативы отдельно в дополнительных строках, чтобы вам не пришлось выполнять хакерскую конкатенацию.

0 голосов
/ 08 марта 2019

Попробуйте использовать doc.similarity() функцию spaCy.

Например:

import spacy

nlp = spacy.load('en_core_web_md')  # make sure to use larger model!
tokens = nlp(u'dog cat banana')

for token1 in tokens:
    for token2 in tokens:
        print(token1.text, token2.text, token1.similarity(token2))

Результат будет: similarity calculation

См .: https://spacy.io

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...