Python NLTK分类和带文本块的WordNet

Python NLTK分类和带文本块的WordNet,python,nlp,nltk,wordnet,categorization,Python,Nlp,Nltk,Wordnet,Categorization,我有以下两套。这个想法是能够根据我提供的一些元标记对新闻文章进行分类。例如,当我收到一篇有“法官”“5年”的文章时,它应该被归类为犯罪故事 train = [ ('Honda', 'cars'), ('Ford', 'cars'), ('Volkswagen', 'cars'), ('Courthouse', 'crime'), ('Police', 'crime')

我有以下两套。这个想法是能够根据我提供的一些元标记对新闻文章进行分类。例如,当我收到一篇有“法官”“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)
它把一切都归类为“汽车”

我肯定我错过了这里的语义相似性比较。我试着通过文本块使用WordNet

我跑

但它没有给我任何结果

现在的问题是:


如何让WordNet说大众汽车是一辆汽车,将其集成到分类器中,使其认识到Hyndai也是一辆汽车并正确分类?

WordNet®是一个大型英语词汇数据库,汽车品牌名称不属于WordNet,因此您无法从WordNet知道大众汽车是一辆汽车。为了将一个单词分类,您必须为每个序列和测试示例构建一个特征向量。

您的问题有几个方面,您可能应该逐一考虑:

“我肯定我错过了这里的语义相似性比较。”

“语义相似性”只是你可以考虑的许多可能的改进之一。请注意,即使对于“语义相似性”,也有许多不同的方法可以将其包含在模型中,并且并非所有这些方法都足够简单,可以对当前基于NaiveBayes的解决方案进行小的修改。不过,最重要的是,您在这里犯了一个“过早优化”的错误。在您开始使用WordNet匹配和诸如此类的东西构建复杂模型之前,请确保您当前的解决方案确实不足

您发现,如果您在一个数据集上训练NaiveBayes分类器,而该数据集不存在单词“逮捕”,那么生成的模型将在将来对该单词进行分类时遇到复杂问题。然而,有可能的是,有了一个相当真实的培训集,你不会发现自己经常遇到测试文章中完全没有熟悉标签的情况

一旦您开始使用真实的数据集,您将很快发现,在深入研究“语义相似性”业务之前,您可以尝试改进您的分类器(首先修复标记的拼写),这将在许多方面使模型复杂化,而不一定会使性能提高太多

但它没有给我任何结果

正如在另一个答案中提到的,WordNet根本没有关于“大众”一词的信息。即使是这样,你也不应该期望你输入的所有单词都是“熟悉的”、“没有拼写错误的”、“格式良好的”等等。在你所做的上下文中,你应该希望新闻文章有足够的“熟悉”标签来识别它的整体主题

我如何让WordNet说大众是一辆汽车,将其集成到分类器中,使其认识到Hyndai也是一辆汽车,并正确地对其进行分类

这个问题的一个可能答案是:制作您自己的单词关联图,添加关联“现代”-“大众”,以及其他一些东西,并为您的分类器使用类似“k-最近邻”的模型

然而,通过这样做,您将从最初声称的“按标签对新闻文章进行分类”的任务中解脱出来,并且您的分类器仍然无法识别“Hynday”一词。)

word = Word("Volkswagen")
for each in word.definitions:
    print each