如何使用 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。
当尝试 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。