这个答案可能有点长,也许我抽象了一些东西,但这只是给你一个想法和一些建议。
监督与非监督
正如其他人已经提到的,在机器学习领域有两条主要道路:监督和无监督学习。正如您现在可能已经知道的那样,如果您的语料库(文档)被标记,那么您正在谈论监督学习。标签是类别,在这种情况下是布尔值。
例如,如果文本与衣服和鞋子相关,那么这些类别的标签应该是正确的。
由于文本可以与多个类别(多个标签)相关,我们正在研究多分类器。
使用什么?
我认为数据集尚未标记,因为 twitter 不会为您进行此分类。所以这是你的一个重大决定。
- 您手动标记数据,这意味着您尝试在数据集中查看尽可能多的推文/fb 消息,并为每个消息考虑 5 个类别并通过 True/False 回答它们。
- 您决定使用无监督学习算法并希望发现这 5 个类别。由于像聚类这样的方法只会尝试自行查找类别,而这些方法不必默认匹配您的 5 个预定义类别。
我过去使用过不少监督学习,并且在这类学习方面有很好的经验,因此我将继续解释这条路径。
特征工程
你必须想出你想使用的功能。对于文本分类,一个好的方法是使用文档中每个可能的单词作为特征。 True 表示该单词是否存在于文档中,false 表示不存在。
在执行此操作之前,您需要进行一些预处理。这可以通过使用 NLTK 库提供的各种功能来完成。
-
标记化这会将您的文本分解为单词列表。您可以使用this 模块。
-
停用词删除这将从标记中删除常用词。单词喜欢'a',the',...你可以看看this。
-
Stemming 词干会将单词转换成它们的stem 形式。例如:单词“working”、“worked”、“works”将转换为“work”。看看this。
现在,如果您已经对数据进行了预处理,则为文档中存在的每个单词生成一个特征集。对此存在自动方法和过滤器,但我不确定如何在 Python 中执行此操作。
分类
有多个分类器可用于此目的。我建议深入了解现有的分类器及其好处。您可以使用支持多分类的 nltk 分类器,但老实说,我以前从未尝试过。过去我使用过 Logistic 回归 和 SVM。
培训和测试
您将使用一部分数据进行训练,一部分用于验证训练后的模型是否表现良好。我建议你使用cross-validation,因为你会有一个小的数据集(你必须手动标记数据,这很麻烦)。交叉验证的好处是您不必将数据集拆分为训练集和测试集。相反,它将运行多轮并遍历数据以获取部分训练数据和部分测试数据。导致所有数据在您的训练数据中至少使用一次。
预测
一旦您的模型建立并且“测试数据”的预测结果是合理的。您可以在野外使用您的模型来预测新 Facebook 消息/推文的类别。
工具
NLTK 库非常适合预处理和自然语言处理,但我以前从未将它用于分类。我听说过很多关于 scikit python library 的好消息。但老实说,我更喜欢使用Weka,这是一个用java编写的数据挖掘工具,提供了一个很棒的用户界面,它可以大大加快你的任务!
换个角度:主题建模
在您的问题中,您声明要将数据集分为五类。我想向您展示主题建模的想法。如果您真的只针对这些类别,它可能在您的场景中没有用(这就是为什么我将这部分留在我的答案末尾)。但是,如果您的目标是将推文/fb 消息分类为非预定义类别,则主题建模是可行的方法。
主题建模是一种无监督学习方法,您可以提前决定要“发现”的主题(类别)的数量。这个数字可能很高(例如 40) 现在很酷的是该算法将找到 40 个包含相关单词的主题。它还将为每个文档输出一个分布,指示该文档与哪些主题相关。通过这种方式,您可以发现比您预定义的 5 个类别更多的类别。
现在我不会对此进行更深入的讨论,如果您想了解更多信息,只需在 Google 上搜索即可。另外你可以考虑使用MALLET,它是一个很好的主题建模工具。