我想使用nltk.pos_tag返回的词性(POS)来训练scikit-learn分类器,我该如何将它们转换为向量并使用呢?例如:
sent = “This is POS example”
tok=nltk.tokenize.word_tokenize(sent)pos=nltk.pos_tag(tok)print (pos)
这会返回以下结果[(‘This’, ‘DT’), (‘is’, ‘VBZ’), (‘POS’, ‘NNP’), (‘example’, ‘NN’)]
现在我无法应用任何向量化器(如DictVectorizer、FeatureHasher、CountVectorizer)来用于分类器
请建议
回答:
如果我理解正确的话,这有点棘手。一旦你标记了它,你的句子(或文档,或其他任何东西)就不再是由单词组成,而是由一对对(单词 + 标签)组成,并且不清楚如何从中生成最有用的标量向量。
大多数文本向量化器会做类似于统计每个词汇项出现的次数,然后为每个词汇项创建一个特征的事情:
the: 4, player: 1, bats: 1, well: 2, today: 3,...
下一个文档可能有:
the: 0, quick:5, flying:3, bats:1, caught:1, bugs:2
只要你始终将相同的键放在相同的数组元素中,这两者都可以存储为整数数组(大多数文档会有很多零)——或者作为字典。因此,向量化器会对许多“文档”执行此操作,然后在此基础上工作。
所以你的问题归结为如何将一对对的列表转换为向量化器可以计数的平面列表项。
最简单的方法是将你的数据展平为
('This', 'POS_DT', 'is', 'POS_VBZ', 'POS', 'POS_NNP', 'example', 'POS_NN')
然后通常的计数会得到一个包含8个词汇项的向量,每个词汇项出现一次。我重命名了标签以确保它们不会与单词混淆。
这可以让你开始运行,但可能不会有太大帮助。因为仅仅知道样本中每种词性的出现次数可能并不能告诉你所需的信息——请注意,在向量化器进行计数后,哪些词性与哪些单词相关联的概念就消失了。
如果你是试图区分像风格这样的东西,在此基础上运行分类器可能有一定的价值——例如,小说可能有更多的形容词,实验室报告可能有更少的专有名词(也许),等等。
相反,你可以将数据更改为
('This_DT', 'is_VBZ', 'POS_NNP', 'example_NN')
这样每个标签都“绑定”到它所属的单词上,现在向量将能够区分“bat”作为动词使用的样本和仅作为名词使用的样本。这会告诉你一些不同的东西——例如,作为动词的“bat”在关于棒球的文本中比在关于动物园的文本中更常见。
还有许多其他你可以做的安排。
要在自然语言文本上使用向量方法获得好的结果,你可能需要投入大量的思考(和测试),以确定你希望向量化器生成和使用的特征。这在很大程度上取决于你最终想要实现什么。
希望这对你有帮助。