NLTK分类和带文本Blob的WordNet

时间:2014-02-06 19:59:45

标签: python nlp nltk wordnet categorization

我有以下两套。我们的想法是能够根据我提供的一些元标记对新闻文章进行分类。例如,当我得到一篇文章“法官”“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也是一辆汽车并对其进行正确分类?

2 个答案:

答案 0 :(得分:1)

WordNet®是一个庞大的英文词汇数据库,汽车品牌名称不属于WordNet,所以你不可能知道大众汽车是一款来自WordNet的汽车。为了将单词分类为类别,您必须为每个火车和测试示例构建一个特征向量。

答案 1 :(得分:1)

您的问题有几个方面,您应该逐一采用它们:

  

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

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

您发现如果您在数据集上训练NaiveBayes分类器,其中不存在“逮捕”一词,则生成的模型将来会对此词进行分类。然而,有可能的是,通过一个相当现实的训练集,您将不会发现自己处于一个测试文章过于频繁没有熟悉标签的情况。

一旦你开始使用真实的数据集,你会很快发现有很多简单实用的东西,你可以尝试改进你的分类器(首先修复标签的拼写),然后再深入研究“语义相似性“业务,这将在很多方面使您的模型复杂化,而不必过多地改善性能。

  

但它没有给我任何结果。

正如另一个答案所述,WordNet根本没有关于“大众汽车”这个词的信息。即使它会这样,你也不应该期望输入中的所有单词都是“熟悉的”,“无拼写”,“格式良好”等。在您正在做的事情的背景下,您应该只希望新闻文章有足够的“熟悉”标签来识别其整体主题。

  

我如何让WordNet说大众汽车是一辆汽车,将其整合到分类器中,以便它意识到Hyndai也是一辆汽车并正确分类

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

然而,通过这样做,您将远离原先声称的“按标签对新闻文章进行分类”的任务,并且您的分类器仍将在“Hynday”一词中失败;)