如何使用 SpaCy 解决西班牙语词形还原问题?

How to solve Spanish lemmatization problems with SpaCy?

当尝试 lemmatize in Spanish 超过 60,000 个单词的 csv 时,SpaCy 没有正确写入某些单词,据我所知模型不是 100% 准确。但是,我还没有找到任何其他解决方案,因为 NLTK 没有带来西班牙语核心。

一个朋友试图在西班牙的 Whosebug 上问这个问题,但是,与这个社区相比,这个社区很小,我们没有得到任何答案。

代码:

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

一种选择是制作您自己的词形还原器。

这听起来很可怕,但不要害怕!做一个其实很简单

我最近做了一个关于如何制作词形还原器的教程,link 在这里:

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

总而言之,您必须:

  • 有一个 POS Tagger(你可以使用 spaCy tagger)来标记输入的单词。
  • 获取单词及其词条的语料库 - 在这里,我建议您下载西班牙语的 Universal Dependencies Corpus - 只需按照上述教程中的步骤操作即可。
  • 从语料库中提取的单词创建词条字典。
  • 保存 dict 并制作一个包装函数来接收单词及其 PoS。

在代码中,它看起来像这样:

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

简单吧?

事实上,简单的词形还原并不像人们想象的那样需要大量处理。困难的部分在于 PoS 标记,但你可以免费获得它。无论哪种方式,如果你想自己做标记,你可以看到我制作的另一个教程:

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

希望你能解决问题。

与英语词形还原器不同,spaCy 的西班牙语词形还原器根本不使用 PoS 信息。它依赖于变形动词和引理(例如,ideo idear、ideas idear、idea idear、ideamos idear 等)的查找列表。它只会输出列表中的第一个匹配项,而不管其 PoS。

我实际上为西班牙语开发了 spaCy 新的基于规则的词形还原器,它考虑了 PoS 和词法信息(例如时态、性别、数字)。这些细粒度的规则使其比当前的查找词形还原器准确得多。即将发布!

同时,您也许可以使用 Stanford CoreNLP 或 FreeLing。

您可以使用 spacy-stanza。它有 spaCy 的 API 和 Stanza 的模型:

import stanza
from spacy_stanza import StanzaLanguage

text = "personas, ideas, cosas"

snlp = stanza.Pipeline(lang="es")
nlp = StanzaLanguage(snlp)
doc = nlp(text)
for token in doc:
    print(token.lemma_)

也许您可以使用 FreeLing,这个库提供了西班牙语、加泰罗尼亚语、巴斯克语、意大利语和其他语言的词形还原功能。

根据我的经验,西班牙语和加泰罗尼亚语的词形还原非常准确,虽然它本身支持 C++,但它有一个 API 用于 Python 和另一个用于 Java。