我有以下两套。我们的想法是能够根据我提供的一些元标记对新闻文章进行分类。例如,当我得到一篇文章“法官”“5年”时,它应被归类为犯罪故事
train = [
('Honda', 'cars'),
('Ford', 'cars'),
('Volkswagen', 'cars'),
('Courthouse', 'crime'),
('Police', 'crime'),
('Taurus', 'cars'),
('Chevrolet', 'cars'),
('Sonic', 'cars'),
('Judge', 'crime'),
('Jail', 'crime')
]
test = [
('Porsche', 'cars'),
('Toyota', 'cars'),
('Arrest', 'crime'),
('Prison', 'crime')
]
cl = NaiveBayesClassifier(train)
问题在于,当我运行时:
for a, b in test:
print a, cl.classify(a)
它将所有内容归类为“汽车”
我确信我在这里缺少语义相似性比较。我尝试通过文本blob使用WordNet。
我跑了
word = Word("Volkswagen")
for each in word.definitions:
print each
但它没有给我任何结果。
现在的问题是:
如何让WordNet说大众汽车是一辆汽车,将其整合到分类器中,以便它能够意识到Hyndai也是一辆汽车并对其进行正确分类?
答案 0 :(得分:1)
WordNet®是一个庞大的英文词汇数据库,汽车品牌名称不属于WordNet,所以你不可能知道大众汽车是一款来自WordNet的汽车。为了将单词分类为类别,您必须为每个火车和测试示例构建一个特征向量。
答案 1 :(得分:1)
您的问题有几个方面,您应该逐一采用它们:
“我确信我错过了这里的语义相似性比较。”
“语义相似度”只是您可能考虑的众多可能改进之一。请注意,即使对于“语义相似性”,您可以将许多不同的方法包含在模型中,并且并非所有方法都可以直接对您当前基于NaiveBayes的解决方案进行小修改。但最重要的是,你在这里犯了“过早优化”的错误。在您开始使用WordNet匹配和诸如此类的东西建立复杂模型之前,请确保您当前的解决方案确实不足。
您发现如果您在数据集上训练NaiveBayes分类器,其中不存在“逮捕”一词,则生成的模型将来会对此词进行分类。然而,有可能的是,通过一个相当现实的训练集,您将不会发现自己处于一个测试文章过于频繁没有熟悉标签的情况。
一旦你开始使用真实的数据集,你会很快发现有很多简单实用的东西,你可以尝试改进你的分类器(首先修复标签的拼写),然后再深入研究“语义相似性“业务,这将在很多方面使您的模型复杂化,而不必过多地改善性能。
但它没有给我任何结果。
正如另一个答案所述,WordNet根本没有关于“大众汽车”这个词的信息。即使它会这样,你也不应该期望输入中的所有单词都是“熟悉的”,“无拼写”,“格式良好”等。在您正在做的事情的背景下,您应该只希望新闻文章有足够的“熟悉”标签来识别其整体主题。
我如何让WordNet说大众汽车是一辆汽车,将其整合到分类器中,以便它意识到Hyndai也是一辆汽车并正确分类
这个特定问题的一个可能的答案是:制作你自己的单词关联图,添加关联“Hyunday” - “Volkswagen”,以及其他一些东西,并使用类似“k-最近邻居”模型为你的分类器。
然而,通过这样做,您将远离原先声称的“按标签对新闻文章进行分类”的任务,并且您的分类器仍将在“Hynday”一词中失败;)