TypeError: "<" не поддерживается между экземплярами "NoneType" и "str" с использованием Pyner для распознавания сущности имени

Я пытаюсь передать строку электронной почты Pyner, чтобы вытащить все объекты в словарь. Я могу проверить, что моя установка работает с этим возвращением двух лиц ЧЕЛОВЕКА

import ner
tagger = ner.SocketNER(port=9191, output_format='slashTags')
t = "My daughter Sophia goes to the university of California. James also goes there"
print(type(t))
test = tagger.get_entities(t)
person_ents = test['PERSON']
for i in person_ents:
    print(i)

Это выводит как ожидалось

Sophia
James

Единственное отличие состоит в том, что здесь у меня есть текст электронной почты, и я могу убедиться, что это строка

print(type(firstEmail))

test = tagger.get_entities(firstEmail)
person_ents = test['PERSON']
print (type(person_ents))
for i in person_ents:
    print(i)

Это возвращает следующую ошибку

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-79-ff847452c8df> in <module>()
      3 
      4 
----> 5 test = tagger.get_entities(firstEmail)
      6 person_ents = test['PERSON']
      7 print (type(person_ents))

~/anaconda3/envs/nlp/lib/python3.6/site-packages/ner-0.1-py3.6.egg/ner/client.py in get_entities(self, text)
     90         else: #inlineXML
     91             entities = self.__inlineXML_parse_entities(tagged_text)
---> 92         return self.__collapse_to_dict(entities)
     93 
     94     def json_entities(self, text):

~/anaconda3/envs/nlp/lib/python3.6/site-packages/ner-0.1-py3.6.egg/ner/client.py in __collapse_to_dict(self, pairs)
     71         """
     72         return dict((first, list(map(itemgetter(1), second))) for (first, second)
---> 73             in groupby(sorted(pairs, key=itemgetter(0)), key=itemgetter(0)))
     74 
     75     def get_entities(self, text):

TypeError: '<' not supported between instances of 'NoneType' and 'str'

Любая идея, что случилось

1 ответ

Решение

Проблема здесь заключается в том, что NER настроен так, что когда для вывода задано значение SlashTags, он выводит формат словаря. Однако текст анализируется с помощью символов косой черты, где встречается именованная сущность, и этот символ затем используется для отделения сущности словаря перед его созданием. В результате, если в ваших текстовых данных возникнет косая черта, вам нужно разобраться в этом.

Что-то вроде

#text is your string
text = text.replace('/', '-')

Это не должно быть проблемой в терминах НЛП, так как даты все еще должны быть выбраны в этом формате. Но если какая-то ключевая часть вашего анализа требует наличия этого тега, это решение может не подойти. Я не могу проверить, существует ли эта проблема в реализации Java, но это возможно

Другие вопросы по тегам