通过数据压缩进行文本分类

2021-06-09 08:35:46

昨晚我觉得像阅读人工智能:一种现代方法。我偶然发现了自然语言处理章节中的一些乐趣。我正在阅读分类文本的部分。我正在阅读的特定小节的想法是通过使用压缩算法对文档进行分类。这是一个如此左上的领域的想法,但是当你想到它时它确实有道理。引用这本书:

实际上,压缩算法正在创建语言模型。 LZW算法特别直接模拟最大熵概率分布。

换句话说,压缩算法在语料库中有一些了解单词的分布。因此,它可以用于对文档进行分类。学习算法非常简单:

通过连接属于该标签的文本来构建每个标签的单个文档。

这个想法是,如果文档类似于与特定标签关联的培训文本类似,则它们将共享将被压缩算法利用的模式。理想情况下,使用新文本压缩训练文本的大小增加应与文本和培训文本之间的相似性相关。增加越小,应将标签越可能。

我认为这是一个优雅的想法。它不是复杂的,我不希望它比平原和简单的逻辑回归更好。此外,它很昂贵,因为必须为每个测试文件重新压下每个标签的训练文本。尽管如此,我发现了这个想法有趣并决定在Python中实现它。

在这里,我将使用scikit-rement的新闻组20个数据集。我正在使用与他们在其用户指南中使用的相同的四个类别来进行比较。

第一步是连接属于四个类别中的每一个的文本。我在每个文本之前添加一个空格,以便最后一个单词与下一个文本的第一个单词粘合。

从集合导入defaultdict label_texts = defaultdict(str),枚举中的文本(火车[' data']):label =火车[' target_names' ] [训练['目标' ] [i]] label_texts [标签] + =' ' +文本。降低 ()

下一步是压缩这些大文本中的每一个并测量压缩结果的大小。在Python中这样做是很容易的。实际上,Python提供了将一系列字节序列压缩成较小的字节序列。 LEN方法为我们提供序列中的字节数。我从这里列出的压缩方法随机挑选GZIP。这些中的每一个都提供了一种易于使用的压缩方法。

这就是培训阶段的全部。培训文本必须保持在记忆中,因为它们必须用于预测阶段。让我们说我们有一个未标记的文本列表。每个文本的想法是使用每个训练文本连接它,压缩结果,然后测量压缩结果的大小。

完成后,我们只需要使用原件比较所获得的大小并返回最少尺寸的标签。请注意,没有概率的概念。烹饪一些概率可能会有一些奇怪的方法,但它们不会被校准。

test = fetch_20newsgroups(子集='测试',类别=类别)预测= []用于测试中的文本['数据' ]:sizes = {label:len(方法。压缩(f' {label_text} {text.lower()'。编码())标签,label_text中的label_text。项目()} predicted_label = min(大小,key = lambda标签:大小[标签] - Oricalind_size [标签])预测。附加(预测_Label)

这展会有多好?好吧,只需要5分钟的时间才能在我的笔记本电脑上运行只有1,353个测试用例。每份文件是0.2秒,这相当慢!以下是分类报告:

精密召回F1-Score支持Alt.atheism 0.678 0.680 0.679 319 Comp.Graphics 0.784 0.897 0.837 389 SCI.Space 0.878 0.746 0.807 394Talk.religion.misc 0.609 0.614 0.611 251精度0.74910733 1353加权平均值0.754 0.749 0.749 1353

那是好吗?不,不是真的。多项式朴素贝叶斯分类器达到0.88的宏F1分,具有相同的类别和火车/测试分裂。它也很快更快。我们可以做些什么吗?我们可以尝试其他压缩算法。以下是ZLIB的结果,这有点速度迅速,只需4分钟即可运行:

精密召回F1 - 分数支持Alt.atheism 0.656 0.687 0.671 319 Comp.Graphics 0.782 0.902 0.838 389 SCI.Space 0.880 0.744 0.806 394Talk.religion.misc 0.612 0.578 0.594 251精度0.745 1353宏AVG 0.732 0.728 0.727 1353加权公平0.744 0.744 1353

精密召回F1-Score支持Alt.atheism 0.648 0.111139 Comp.Graphics 0.732 0.584 0.649 389 SCI.Space 0.923 0.305 0.458 394Talk.religion.misc 0.271 0.928 0.420 251精度0.455 1353宏AVG 0.644 0.482 0.429 1353加权AVG 0.682 0.455 0.455 0.455 0.455 0.442 1353

相比之下,表现很糟糕。此外,跑步超过7分钟。现在LZMA怎么样?

精密召回F1-Score支持Alt.atheism 0.851 0.875 0.862 319 Comp.Graphics 0.923 0.959 0.941 389 SCI.Space 0.927 0.934 0.930 394Talk.religion.misc 0.866 0.773 0.817 251精度0.897 1353宏观501353宏观50.892 0.885 0.8881353加权AVG 0.897 0.896 1353

表现令人惊讶的是好!但这是成本的:完成32分钟才能完成,每份文件〜1.4秒。尽管如此,可以看到这种结果不符合所有旨在对文档进行分类的算法非常有趣。嗯,Lzma实际上实现了人工智能中提到的LZW算法:一种现代化的书籍,所以它不太令人惊讶地做得很好!

可能会有一些微调可以改善这种方法。 但是,由于禁止的计算成本,它可能是最值得的使用这种方法。 这应该只是被视为盒子外面思考的一个有趣的例子。 它还表明统计建模和信息理论非常交织。