主题的自然语言处理

Natural Language Processing of Topics

我是从事大数据课程项目的小组的一员,我们已经 运行 研究了我们认为是 NLP 的问题。目前,我们的数据组格式为 JSON,如下所示:

    "wine": {
        "category": "socializing",
        "category_id": 31,
        "score": 0.0,
        "topic_id": 611
    }
    "dragons": {
        "category": "lifestyle",
        "category_id": 17,
        "score": 0.279108277990115,
        "topic_id": 2137
    },
    "furry-fandom": {
        "category": "lifestyle",
        "category_id": 17,
        "score": 0.279108277990115,
        "topic_id": 48595
    },
    "legendarycreatures": {
        "category": "lifestyle",
        "category_id": 17,
        "score": 0.279108277990115,
        "topic_id": 10523
    }

标签是与相关信息相关联的主题(类别、流行度得分和 category/topic ID #)。自从我们从中提取的 API 处理它以来,我们已经为每个主题关联了类别。但我们的问题是类别太宽泛,只有 33 个,无法识别任何有意义的趋势,而且主题太具体 w/overlap(例如 dragons/legendarycreatures),而且类别太多,大约有 22,000 个。

这就是 NLP 的用武之地;我们想创建一些不像 "category" 广泛但不像当前主题那样具体的超级主题集。再次使用 "dragons" 和 "legandarycreatures" 的示例将与其他示例一起适合 "fantasy".

的超级主题

更多背景知识,我们正在使用 Python 到 grab/process 我们的数据,我们希望继续为此使用它,并且我们 none 有任何NLP的实践经验。

考虑到这一切,我们很乐意为这方面的斗争提供一些建议和帮助。如果有更好的方法或者 NLP 不可行,我们对它们持开放态度。我们试图避免的是对某种 table 进行硬编码以进行分类。

TL;DR:我们正在尝试对一组 22,000 个主题进行分类,以便 "super-topics" 比当前主题更具体但不如当前类别广泛。我们正在尝试在使用 Python 的同时使用 NLP 来做到这一点,但不知道如何去做,也愿意接受建议。

这是一个典型的分类问题。如果你想使用 Python,我建议你使用 Natural Language ToolKit (NLTK),尤其是 nltk.classify 包。可以在此处找到有关使用 NLTK 进行分类的很好的介绍和概述:http://www.nltk.org/book/ch06.html。要获取有关 nltk.classify 的更多信息:

>>> import nltk
>>> help(nltk.classify)

我会建议 TextBlob, since it simplify the process to train the classifier. See the tutorial here 如何构建文本分类器。当然在你的具体问题中,你需要弄清楚你要分类多少个不同的类别;然后你必须训练提交一个重要的训练集(不要太多以避免过度拟合数据集);届时您的分类器将准备好获取类型为

的新数据
"dragons": {
 "category": "lifestyle",
 "category_id": 17,
 "score": 0.279108277990115,
 "topic_id": 2137
 }

并分类。那时你必须根据测试数据集评估你的分类。 这并不像看起来那么明显,顺便看看这个迷你数据集(你能提供一个更大的数据集吗),看起来你有一些数据集群,比如:

第一个集群标记为 lifestyle

"dragons": {
    "category": "lifestyle",
    "category_id": 17,
    "score": 0.279108277990115,
    "topic_id": 2137
},
"furry-fandom": {
    "category": "lifestyle",
    "category_id": 17,
    "score": 0.279108277990115,
    "topic_id": 48595
},
"legendarycreatures": {
    "category": "lifestyle",
    "category_id": 17,
    "score": 0.279108277990115,
  }

标记的第二个集群 socializing

"wine": {
        "category": "socializing",
        "category_id": 31,
        "score": 0.0,
        "topic_id": 611
    }

要定义超级类别,您必须告诉分类器 dragonslegendarycreatures 等术语属于同一数据集,我们称其为 fantasy。所以这不仅是一个问题或分类,也是文本分析和语义的问题:legendarycreatures => legendary + creatures(词袋)与术语 dragons 比其他词更接近,因此 word2vec 可以帮助评估这些名称的向量并定义它们背后的度量以及它们之间的距离。 gensim.

提供了一个很好的实现

我提到的是 word2vec,因为无论您是否拥有每个条目的文本/描述,它都可以使用。在最后一种情况下,您可以只为项目的标题定义一个指标,例如 dragonslegendarycreatures.

[更新] 所以,我试图弄清楚如何使用一种名为 Tpot made by @rhiever

的全新技术 "that automatically creates and optimizes machine learning pipelines using genetic programming" 找到正确的分类算法

在这种情况下,该工具需要特征向量(来自 word2vec)作为输入,必须以监督数据集格式提供。这里是discussion,这是一个很好的起点。