Как решить проблемы лемматизации Spani sh с SpaCy? - PullRequest
2 голосов
/ 05 марта 2020

При попытке лемматизировать по-испански sh в формате csv, содержащем более 60 000 слов, SpaCy неправильно пишет некоторые слова, я понимаю, что модель не на 100% точна. Однако я не нашел другого решения, так как NLTK не приносит ядро ​​Spani sh.

Друг пытался задать этот вопрос в Spani sh Stackoverflow, однако, сообщество довольно мало по сравнению с этим сообществом, и мы не получили ответов об этом.

код:

nlp = spacy.load('es_core_news_sm')

def lemmatizer(text):  
  doc = nlp(text)
  return ' '.join([word.lemma_ for word in doc])

df['column'] = df['column'].apply(lambda x: lemmatizer(x))

Я пытался лемматизировать некоторые слова, которые нашел неверно доказывать, что SpaCy делает это неправильно:

text = 'personas, ideas, cosas' 
# translation: persons, ideas, things

print(lemmatizer(text))
# Current output:
personar , ideo , coser 
# translation:
personify, ideo, sew

# The expected output should be:
persona, idea, cosa

# translation: 
person, idea, thing

Ответы [ 2 ]

6 голосов
/ 05 марта 2020

В отличие от лемматизатора Engli sh, лемматизатор spaCy's Spani sh вообще не использует информацию о PoS. Он основан на поисковом списке согнутых глаголов и лемм (например, идео идеар, идеал идеи, идеал идеи, идеам идеар и т. Д. c.). Он просто выведет первое совпадение в списке, независимо от его PoS.

Я действительно разработал новый основанный на правилах лемматизатор spaCy для Spani sh, который принимает PoS и морфологическую информацию (такую ​​как время, пол, номер) во внимание. Эти детализированные правила делают его намного более точным, чем текущий лемматизатор поиска. Он будет выпущен в ближайшее время!

Между тем, вы можете использовать Stanford CoreNLP или FreeLing.

2 голосов
/ 05 марта 2020

Один из вариантов - создать свой собственный лемматизатор.

Это может показаться пугающим, но не бойтесь! На самом деле это очень просто сделать.

Я недавно сделал урок о том, как сделать лемматизатор, ссылка здесь:

https://medium.com/analytics-vidhya/how-to-build-a-lemmatizer-7aeff7a1208c

В качестве резюме вы должны:

  • иметь POS Tagger (вы можете использовать spaCy tagger) для тегирования входных слов.
  • Получить корпус из слова и их леммы - здесь я предлагаю вам скачать универсальный корпус зависимостей для испанского языка sh - просто следуйте инструкциям, приведенным в руководстве, упомянутом выше.
  • Создайте лемму из слов извлечено из корпуса.
  • Сохраните dict и создайте функцию-обертку, которая получает как слово, так и его PoS.

В коде это будет выглядеть так:

def lemmatize(word, pos):
   if word in dict:
      if pos in dict[word]:
          return dict[word][pos]
   return word

Простой, верно?

На самом деле, простая лемматизация не требует большой обработки, как можно подумать. Сложная часть заключается в PoS Tagging, но у вас есть это бесплатно. В любом случае, если вы хотите сделать Tagging самостоятельно, вы можете увидеть этот другой учебник, который я сделал:

https://medium.com/analytics-vidhya/part-of-speech-tagging-what-when-why-and-how-9d250e634df6

Надеюсь, вы решите его.

...