文本分类问题,正确的方法是什么?

数据挖掘 机器学习
2021-09-18 18:03:18

我正计划编写一个分类程序,该程序能够将未知文本分类为大约 10 个不同的类别,如果它们都不适合,那么很高兴知道这一点。也有可能不止一个类别是正确的。

我的预定义类别是:

c1 = "politics"
c2 = "biology"
c3 = "food"
...

我正在考虑如何表示我的训练数据的正确方法,或者哪种分类是正确的。第一个挑战是找到正确的特征。如果我只有文本(每个 250 字),你会推荐什么方法来找到正确的特征?我的第一种方法是删除所有停用词并使用 POS-Tagger ( Stanford NLP POS-Tagger ) 来查找名词、形容词等。我将它们视为使用所有经常出现的单词作为特征。

例如政治,我有大约 2.000 个文本实体。使用提到的 POS-Tagger 我发现:

law:           841
capitalism:    412
president:     397
democracy:     1007
executive:     112
...

仅将其用作功能是否正确?训练集将如下所示:

Training set for politics:
feature law         numeric
feature capitalism  numeric
feature president   numeric
feature democracy   numeric
feature executive   numeric
class politics,all_others

sample data:
politics,5,7,1,9,3
politics,14,4,6,7,9
politics,9,9,9,4,2,1
politics,5,8,0,7,6
...
all_others,0,2,4,1,0
all_others,0,0,1,1,1
all_others,7,4,0,0,0
...

这会是二元分类的正确方法吗?或者我将如何定义我的集合?还是多类分类是正确的方法?然后它看起来像:

Training set for politics:
feature law         numeric
feature capitalism  numeric
feature president   numeric
feature democracy   numeric
feature executive   numeric
feature genetics    numeric
feature muscle      numeric
feature blood       numeric
feature burger      numeric
feature salad       numeric
feature cooking     numeric 
class politics,biology,food

sample data:
politics,5,7,1,9,3,0,0,2,1,0,1
politics,14,4,6,7,9,0,0,0,0,0,1
politics,9,9,9,4,2,1,1,1,1,0,3
politics,5,8,0,7,6,2,2,0,1,0,1
...
biology,0,2,4,1,0,4,19,5,0,2,2
biology,0,0,1,1,1,12,9,9,2,1,1
biology,7,4,0,0,0,10,10,3,0,0,7
...

你打算说什么?

3个回答

我认为,可能有助于澄清您的其他一些问题的第一件事是您是否要执行二元分类或多类分类。如果您有兴趣将数据集中的每个实例分类为多个类,那么这会带来一系列关于设置数据集、要运行的实验以及计划如何评估分类器的新问题( s)。我的直觉是,您可以将您的任务制定为二进制任务,您可以在其中为要预测的每个类训练和测试一个分类器,然后简单地设置数据矩阵,以便有两个类可以预测 - (1) '对分类和(2)其他一切感兴趣。

在这种情况下,而不是您的训练集看起来像这样(其中每一行是一个文档,第 1-3 列包含该文档的特征,而类列是要预测的类):

1           2           3           class
feature1    feature2    feature3    politics
feature1    feature2    feature3    law
feature1    feature2    feature3    president
feature1    feature2    feature3    politics

如果您有兴趣针对其他所有内容检测政治类,它看起来如下所示:

1           2           3           class
feature1    feature2    feature3    politics
feature1    feature2    feature3    non-politics
feature1    feature2    feature3    non-politics
feature1    feature2    feature3    politics

您需要对您有兴趣预测的每个类执行此过程,然后为每个类训练和测试一个分类器,并根据您选择的指标(通常是准确度、精确度或召回率或其某些变体)评估每个分类器。

至于选择功能,这需要相当多的思考。特征可能高度依赖于您尝试分类的文本类型,因此请务必探索您的数据集并了解人们在每个领域的写作方式。定性调查不足以一劳永逸地决定什么是好的功能,但它是获得想法的好方法。此外,查看术语的TF-IDF权重,而不是仅在数据集的每个实例中使用它们的频率。这将帮助您了解 (a) 文档(可能还有目标类)中流行的术语和 (b) 将给定文档与其他文档区分开来的术语。希望这会有帮助。

您可能应该从一个非常基本的方法开始:词袋表示(向量与您的词汇量一样长,如果在文本中找到该词,则为 1,如果不是,则为 0),以及像朴素贝叶斯这样的简单分类器。这对于查找主题非常有效(对于情感分类来说要少一些)。对于预处理,您可能希望进行停用词删除和词干提取(以减少词汇量)而不是 POS 标记。

基本方法的问题在于您将拥有一个 n 类分类器,并且没有“这适合多个类别”或“这适合 0 个类别”的答案。如果你想包括那个方面,那么最好设计 n 个 2 类分类器,每个类一个,每个分类器决定文本是否适合该类。

但我会先尝试开箱即用的朴素贝叶斯,看看它是如何工作的。您可以使用 Weka,它是免费的、开源的,并且可以与 java 集成。您还可以使用 Python NLTK 进行预处理(词干提取)。

Sebastian Raschka 以下关于贝叶斯文本分类方法的精彩文章应该对您的任务非常有帮助。我还强烈推荐他关于数据科学主题的优秀博客,作为额外的一般参考。

您也可以查看这份关于文本分类的教育报告。它可能会为您提供一些额外的想法。