POS标注是确定性的吗?

8

我一直在努力理解为什么会发生这种情况,但希望有人能够解释一下。我正在尝试标记以下文本:

ae0.475      X  mod 
ae0.842      X  mod
ae0.842      X  mod 
ae0.775      X  mod 

使用以下代码:
import nltk

file = open("test", "r")

for line in file:
        words = line.strip().split(' ')
        words = [word.strip() for word in words if word != '']
        tags = nltk.pos_tag(words)
        pos = [tags[x][1] for x in range(len(tags))]
        key = ' '.join(pos)
        print words, " : ", key

我正在得到以下结果:
['ae0.475', 'X', 'mod']  :  NN NNP NN
['ae0.842', 'X', 'mod']  :  -NONE- NNP NN
['ae0.842', 'X', 'mod']  :  -NONE- NNP NN
['ae0.775', 'X', 'mod']  :  NN NNP NN

我不明白这是为什么。有人知道这种不一致的原因吗?我对词性标注的准确性并不是非常在意,因为我试图提取一些模板,但它似乎在不同的情况下使用不同的标签来表示一个看起来“几乎”相同的单词。

作为解决方案,我用1替换了所有数字,问题得到了解决:

['ae1.111', 'X', 'mod']  :  NN NNP NN
['ae1.111', 'X', 'mod']  :  NN NNP NN
['ae1.111', 'X', 'mod']  :  NN NNP NN
['ae1.111', 'X', 'mod']  :  NN NNP NN

但我很好奇为什么在我的第一种情况下,它会给实例打上不同的标签。有什么建议吗?
2个回答

8

我尽力理解了一下,这是来自没有使用整个布朗语料库的人所发现的:此处

请注意,标注器从未见过的单词(例如decried)将接收到标记None。

因此,我猜测类似于ae1.111的东西必须出现在语料库文件中,但是像ae0.842这样的东西则没有。这有点奇怪,但这是给出-NONE-标记的原因。

编辑:我非常好奇,下载了布朗语料库,并在其中进行了纯文本搜索。数字111在其中出现了34次,而数字842仅出现了4次。 842仅出现在金额中间或作为年份的最后3位数字,并且111许多次作为页码单独出现。775也出现了一次作为页码。

因此,我要做一个猜想,由于本福德定律,您最终会更频繁地匹配以1、2和3开头的数字,而不是以8或9开头的数字,因为这些数字更常出现在书中引用的随机页面的页码上。我非常想知道这是否正确(当然我并不足够感兴趣去自己做这件事!)。


1
加一分给本福德定律。顺便说一句,你是对的。它们确实是页码。在我的实验中,任何大于790的数字都被标记为"无",而其他数字则被标记为“NN”。:) 太棒了! - Legend

3
它是“确定性”的,这意味着使用相同的算法每次都会对相同的句子进行相同的标记化。但由于您的单词不在nltk的数据中(实际上,甚至不是真正句子中的实际单词),它会使用一些算法来尝试推断标记应该是什么。这意味着当单词改变时(即使更改是不同的数字),您可以有不同的标记,而且这些标记无论如何也不会太有意义。

这让我想知道为什么您要尝试使用NLP处理非自然语言结构。


我喜欢这个回答。使用NLTK的原因确实让人质疑。但是,如果真的需要使用,一个可能的解决方法是定义一个包含所有可能“单词”和自定义分块器的语料库。但是,这似乎是为了做一件本应该可以更简单地完成的事情而花费过多的工作量。 - inspectorG4dget
+1 个好的解释。我正在尝试一些探索性技术,以找出将我的数据转换为某些中间格式的最佳方法,以帮助模板提取。对于我的情况来说,这似乎运作得相当不错(也许并非适用于每种情况)。 - Legend
严格来说,NLTK的pos_tag根本不需要是确定性的。一些机器学习算法在内部会翻转硬币。 - Fred Foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接