孤立地提取西班牙语单词以验证它们是 SpaCy或任何词典中的“单词”

问题描述

我有一个包含 20,000 个单词的列表。我想知道这 20k 个单词中哪一个在某种程度上是“奇怪的”。这是文本清理任务的一部分。

Albóndiga 很好,huticotai 不是我知道的西班牙语单词... 56%$3estapa

这意味着我必须孤立地将拒绝/共轭词与某些事实来源进行比较。每个人都推荐SpaCy。很好。

不知何故,使用下面的代码一个包含几十个单词的测试文件,spaCy 认为它们都是“ROOT”单词。 Si hablas castellano,sabrás que así no es。 从技术上讲,我不想对任何东西进行词形还原!我想阻止这些话。 我只想将 20k 长的词表与我作为讲西班牙语的语言学家可以查看的内容配对,以确定正在发生的疯狂的 desmadre (BS) 类型。

这是我得到的输出示例:

  • trocito NOUN ROOT trocito
  • ayuntamiento NOUN ROOT ayuntamiento
  • eyre NOUN ROOT eyre
  • suscribíos NOUN ROOT suscribío
  • mezcal ADJ ROOT mezcal
  • marivent 动词根 mariventir
  • 逆数名词根逆数
  • stenger 动词根 stenger

很明显,“stenger”不是西班牙语单词,尽管 spaCy 天真地认为它是。 Mezcal 是一个名词(也是一个很好的时间)。你得到了图片

这是我的代码

import spacy
nlp = spacy.load("es_core_news_sm")

new_lst = []
with open("vocabu_suse.txt",'r') as lst:
    for i in lst:
        # print(i)
        new_lst.append(i.strip())

for i in new_lst:
    j = nlp(i)
    for token in j:
        print(token.text,token.pos_,token.dep_,token.lemma_)

解决方法

我对您在此处尝试执行的操作感到非常困惑。明确地说,我的理解是,您的主要目标是找出列表中的哪些词不是垃圾,并且您尝试使用词形还原来检查它们,但词形还原的结果似乎是错误的。

这意味着我必须孤立地将拒绝/共轭词与某些事实来源进行比较。每个人都推荐SpaCy。很好。

spaCy 非常适合许多 NLP 任务,但处理没有上下文的单词列表确实不是它的本意,我认为它在这里不会有太大帮助。

寻找真词

要解决您的主要问题...

首先,要找出哪些词不是垃圾词,您可以使用您信任的词表或相对正常的大型语料库。

如果您没有信任的词表,您可以查看这些词是否在 spaCy 模型的词汇中。 spaCy 的词汇可以包含垃圾词,但由于它们是按频率构建的,因此应该只包含常见错误。此 wordfreq repo 也可能有帮助。

要检查一个词在 spaCy 中是否有词向量,在中型或大型模型中您可以使用 tok.is_oov

如果你想从语料库中去,使用你拥有的语料库或维基百科之类的,并丢弃低于特定字数阈值的单词。 (我知道屈折使这变得更加困难,但是如果语料库足够大,您仍然应该以某种频率找到真实的单词。)

关于ROOT

ROOT 标签是一个依赖标签,不是文字形式的标签。在句子的依存分析中,ROOT 通常是主要动词。在一个词的句子中,该词始终是词根。

我认为您需要 tag_ 属性,这是一个详细的特定于语言的 POS 标签。 pos_ 属性是为多语言应用程序设计的粗粒度标签。

关于词形还原

我不明白这个说法。

从技术上讲,我不想对任何东西进行词形还原!我想把这些词干掉。

词形还原几乎总是比词干更好。 “词干”通常是指基于标记模式工作的基于规则的过程,因此对于您的特定问题,它根本不会帮助您 - 它只会告诉您单词是否具有共同的词尾或其他东西。你可以有一个像“asdfores”这样的词,词干分析器会很高兴地告诉你它是“asdfor”的复数形式。词形还原通常基于已检查过的单词数据库,因此更接近您的需要。

无论哪种情况,spaCy 都不会进行词干提取。