Сравнение на уровне токенов
Если вы хотите узнать, отличается ли аннотация, вам придется просмотреть токены документов по токену, чтобы сравнить 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).
Этот python-порт whatswrong немного нестабилен, но в целом, похоже, работает: https://github.com/ppke-nlpg/whats-wrong-python
Кажется, что они оба предполагают, что у нас есть золотые POS-теги, так что сравнениеison не отображается автоматически.Вы также можете объединить POS-столбцы, чтобы иметь возможность видеть оба (точно так же, как с токенами), поскольку вам действительно нужны POS-теги, чтобы понять, почему разборы различаются.
Как для пар токенов, так и для пар POSЯ думаю, что было бы легко изменить либо исходную реализацию, либо порт python, чтобы показывать обе альтернативы отдельно в дополнительных строках, чтобы вам не пришлось выполнять хакерскую конкатенацию.