在词性标注之前是否需要使用停用词过滤?

Har*_*ish 3 nlp text-mining pos-tagger

我是文本挖掘和 NLP 相关内容的新手。我正在开发一个小项目,试图从一些文档中提取信息。我基本上是做一个 pos 标记,然后使用分块器找出基于的模式标记的单词。在进行词性标记之前我需要使用停用词吗?使用停用词会影响我的词性标记器的准确性吗?

alv*_*vas 5

让我们用这个为例来训练/测试标记器:

首先获取语料库和非索引字表

>>> import nltk
>>> nltk.download('stopwords')
>>> nltk.download('cess_esp')
Run Code Online (Sandbox Code Playgroud)

在 NLTK 中加载包装器

>>> from nltk.corpus import cess_esp as cess
>>> from nltk.corpus import stopwords

# Import the function to train a tagger.
>>> from nltk import UnigramTagger, BigramTagger
# Load the Spanish stopwords
>>> stoplist = stopwords.words('spanish')
# Load the Spanish tagger
>>> cess_sents = cess.tagged_sents()
Run Code Online (Sandbox Code Playgroud)

将语料库拆分为训练/测试集

>>> len(cess_sents)
6030
>>> test_set = cess_sents[-int(6030/10):]
>>> train_set = cess_sents[:-int(6030/10)]
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(10)[-2:]
[8, 9]
>>> range(10)[:-2]
[0, 1, 2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)

创建一个不带停用词的备用 train_set。

>>> train_set_nostop = [[(word,tag) for word, tag in sent if word.lower() not in stoplist] for sent in train_set]
Run Code Online (Sandbox Code Playgroud)

看到不同:

>>> train_set[0]
[(u'El', u'da0ms0'), (u'grupo', u'ncms000'), (u'estatal', u'aq0cs0'), (u'Electricit\xe9_de_France', u'np00000'), (u'-Fpa-', u'Fpa'), (u'EDF', u'np00000'), (u'-Fpt-', u'Fpt'), (u'anunci\xf3', u'vmis3s0'), (u'hoy', u'rg'), (u',', u'Fc'), (u'jueves', u'W'), (u',', u'Fc'), (u'la', u'da0fs0'), (u'compra', u'ncfs000'), (u'del', u'spcms'), (u'51_por_ciento', u'Zp'), (u'de', u'sps00'), (u'la', u'da0fs0'), (u'empresa', u'ncfs000'), (u'mexicana', u'aq0fs0'), (u'Electricidad_\xc1guila_de_Altamira', u'np00000'), (u'-Fpa-', u'Fpa'), (u'EAA', u'np00000'), (u'-Fpt-', u'Fpt'), (u',', u'Fc'), (u'creada', u'aq0fsp'), (u'por', u'sps00'), (u'el', u'da0ms0'), (u'japon\xe9s', u'aq0ms0'), (u'Mitsubishi_Corporation', u'np00000'), (u'para', u'sps00'), (u'poner_en_marcha', u'vmn0000'), (u'una', u'di0fs0'), (u'central', u'ncfs000'), (u'de', u'sps00'), (u'gas', u'ncms000'), (u'de', u'sps00'), (u'495', u'Z'), (u'megavatios', u'ncmp000'), (u'.', u'Fp')]
>>> train_set_nostop[0]
[(u'grupo', u'ncms000'), (u'estatal', u'aq0cs0'), (u'Electricit\xe9_de_France', u'np00000'), (u'-Fpa-', u'Fpa'), (u'EDF', u'np00000'), (u'-Fpt-', u'Fpt'), (u'anunci\xf3', u'vmis3s0'), (u'hoy', u'rg'), (u',', u'Fc'), (u'jueves', u'W'), (u',', u'Fc'), (u'compra', u'ncfs000'), (u'51_por_ciento', u'Zp'), (u'empresa', u'ncfs000'), (u'mexicana', u'aq0fs0'), (u'Electricidad_\xc1guila_de_Altamira', u'np00000'), (u'-Fpa-', u'Fpa'), (u'EAA', u'np00000'), (u'-Fpt-', u'Fpt'), (u',', u'Fc'), (u'creada', u'aq0fsp'), (u'japon\xe9s', u'aq0ms0'), (u'Mitsubishi_Corporation', u'np00000'), (u'poner_en_marcha', u'vmn0000'), (u'central', u'ncfs000'), (u'gas', u'ncms000'), (u'495', u'Z'), (u'megavatios', u'ncmp000'), (u'.', u'Fp')]
>>>
Run Code Online (Sandbox Code Playgroud)

训练标记器:

>>> uni_tag = UnigramTagger(train_set)
Run Code Online (Sandbox Code Playgroud)

使用没有停用词的语料库训练标注器:

>>> uni_tag_nostop = UnigramTagger(train_set_nostop)
Run Code Online (Sandbox Code Playgroud)

将 test_set 拆分为单词和标签:

>>> test_words, test_tags = zip(*[zip(*sent) for sent in test_set])
Run Code Online (Sandbox Code Playgroud)

标记测试句子:

>>> uni_tag.tag_sents(test_words)
>>> uni_tag_nostop.tag_sents(test_words)
Run Code Online (Sandbox Code Playgroud)

评估准确性(现在我们只做真阳性):

>>> sum([ sum(1 for (word,pred_tag), (word, gold_tag) in zip(pred,gold) if pred_tag==gold_tag) for pred, gold in zip(tagged_sents, test_set)])
11266
>>> sum([ sum(1 for (word,pred_tag), (word, gold_tag) in zip(pred,gold) if pred_tag==gold_tag) for pred, gold in zip(tagged_sents_nostop, test_set)])
5963
Run Code Online (Sandbox Code Playgroud)

请注意,当您在训练标记器之前删除停用词(但不是详尽无遗)时,这里有很多不公平的事情:

  • 你的训练集自然会更小,因为没有。删除停用词后句子中的单词数量变少

  • 标注器不会学习停用词的标签,因此将为所有停用词返回 None ,从而降低标注器的准确性,因为测试集确实包含停用词

  • 当训练高阶 ngram 时,如果没有停用词,它可能根本没有任何意义。语法或敏感性并不代表准确性(尤其是在今天的 NLP 中)。例如,“猫在桌子上”->“猫桌子”,没有停用词。

但正如 @alexia 指出的,对于基于词袋的向量空间模型(又名分布式模型,又名“你可以通过它的邻居知道一个单词”模型,又名非神经预测嵌入模型),删除停用词可能会提高准确性。但对于TF-IDF来说,(统计上)神奇的是,停用词将自动具有较低的 TF-IDF 分数,因为它们在大多数文档中出现得太频繁,但这并不会使它们具有较少的歧视性属性,从而使每个文档都不同(所以它们并不那么重要,真正发挥作用的是以色列国防军的部分)。