Python NLTK POS-тегер не работает должным образом
Я запустил функцию pos_tag для текста ниже, он показывает вывод с батареей как "RB". Поскольку батарея является существительным, она должна отображаться как "NN".
nltk.pos_tag(nltk.word_tokenize('Camera picture quality was fair but speed was an issue and also battery life was not that good'))
Выход:
[('Camera', 'NNP'), ('picture', 'NN'), ('quality', 'NN'), ('was', 'VBD'), ('fair', 'JJ'), ("но", "CC"), ("скорость", "NN"), ("был", "VBD"), ("an", "DT"), ("проблема", "NN"), ('и', 'CC'), ('также', 'RB'), ('батарея', 'RB'), ('life', 'NN'), ('was', 'VBD'), ('not', 'RB'), ('that', 'IN'), ('good', 'JJ')]
Хотя, если я POS пометил то же утверждение этим тегером http://cst.dk/online/pos_tagger/uk/, он показывает батарею как "NN" и дает следующий вывод:
Камера / изображение NNP / качество NN / NN было / удовлетворительное /VBD / JJ, но / скорость CC / NN было /VBD / проблема DT / NN и / CC также / батарея RB / срок службы NN / NN был /VBD нет /RB, что / В хорошем / JJ
Редактировать:
С заявлением как:
"Качество изображения с камеры было приемлемым, но скорость была проблемой, но время автономной работы было не таким хорошим"
тегер NLTK дает следующий вывод:
[('Camera', 'NNP'), ('picture', 'NN'), ('quality', 'NN'), ('was', 'VBD'), ('fair', 'JJ'), ("но", "CC"), ("скорость", "NN"), ("был", "VBD"), ("an", "DT"), ("проблема", "NN"), ("но", "CC"), ("батарея", "NN"), ("жизнь", "NN"), ("был", "VBD"), ("не", "RB"), ('that', 'IN'), ('good', 'JJ')]
Пожалуйста, объясни!
1 ответ
Кажется, единственное отличие состоит в том, что cst.dk помечен battery
как NN
и NLTK помечены батареи как RB
(наречие).
>>> cstdk_output = "Camera/NNP picture/NN quality/NN was/VBD fair/JJ but/CC speed/NN was/VBD an/DT issue/NN and/CC also/RB battery/NN life/NN was/VBD not/RB that/IN good/JJ"
>>> cstdk_postags = [tuple(j for j in i.split('/')) for i in cstdk_output.split()]
>>> from nltk import pos_tag
>>> sent = [i for i,j in cstdk_postags]
>>> nltk_postags = pos_tag(sent)
>>> diff = [(i[0],i[1],j[1]) for i,j in zip(cstdk_postags, nltk_postags) if i[1] != j[1]]
>>> diff
[('battery', 'NN', 'RB')]
Там не так много, чтобы объяснить. Это статистически обученная система, использующая максимальную энтропию, см. _POS_TAGGER
в http://www.nltk.org/_modules/nltk/tag.html, поэтому он обязательно допустит ошибку. Смотрите другие ошибки, которые он допускает, POS-теги - NLTK считает существительное прилагательным