使用卷积神经网络进行文档分类


11

我正在尝试使用CNN(卷积神经网络)对文档进行分类。短文本/句子的CNN已在许多论文中进行了研究。但是,似乎没有论文将CNN用于长文本或文档。
我的问题是文档中的功能太多。在我的数据集中,每个文档都有1000多个标记/单词。为了将每个示例提供给CNN,我使用word2vec手套将每个文档转换成矩阵,从而得到一个大矩阵。对于每个矩阵,高度是文档的长度,宽度是单词嵌入矢量的大小。我的数据集有9000多个示例,并且训练网络需要花费大量时间(整整一周),这使得难以微调参数。
另一种特征提取方法是对每个单词使用一个热向量,但这会创建非常稀疏的矩阵。当然,这种方法比以前的方法花费更多的时间进行训练。
那么,有没有一种在不创建大型输入矩阵的情况下提取特征的更好方法?
以及如何处理可变长度的文件?当前,我添加了特殊字符串以使文档具有相同的长度,但是我认为这不是一个很好的解决方案。


2
使用TfIdf向量器似乎合适吗?也许与word2vec结合使用,每个文档只保留前x个单词?
迭戈

好吧,我不知道Tfldf是什么。我将检查它是否有效。谢谢
lenhhoxung 16'Apr


我只是检查一下,但我认为这无济于事。基本上,该帮助程序类为一组文档创建一个矩阵。矩阵中的每个行向量(二进制或单词计数)都对应一个文档,但是对于CNN,我们需要每个文档都具有一个矩阵。
lenhhoxung 2016年

关键是每个文档按其TfIdf排序仅保留x个重要单词。然后,使用原始编码来构建文档矩阵。不知道这两个步骤的想法是否会出现。
迭戈

Answers:


8

您可以通过将文档表示为句子向量系列而不是更长的词向量系列来减少输入数据的长度。Doc2vec是执行此操作的一种方法(每个句子都是一个“文档”)。

如果您不想使用Doc2vec,创建句子向量的一种方法是平均每个句子的词向量,从而为每个句子提供一个宽度相同的向量。这可能不如Doc2Vec中提供的某些方法那么精确,但我已经成功地将其用于主题建模。

无论哪种方式,一旦有了句子向量,就象为单词向量所做的那样,依次为每个文档排列它们,然后遍历模型。由于每个文档的序列长度都较短,因此与使用单词向量相比,您的模型应训练得更快。

顺便说一句,当放大或缩小以满足您的准确性和速度需求时,此方法可以工作。(例如,如果您的CNN使用句子向量仍然训练得太慢,则可以创建段落向量)。

处理不同长度的文档的一种方法是通过填充。您的文档序列的长度都应等于最长的文档。因此,如果最长的文档为400个句子,则所有文档序列的长度均为400个向量。小于最大长度的文档将填充以零填充的向量。


有趣的主意。我会尝试的:)
lenhhoxung

我可以问个问题吗?即使我用句子向量表示它们,我该如何处理长度明显不同的文档(5个句子/文档,500个句子/文档)?在这里填充似乎很奇怪...
stackunderflow

1
在语音处理中,有些人根据其长度对序列进行排序,以使长度相似的序列位于同一批中。这可能适用于文本序列。
suthee

4

您可以使用区域嵌入。可以将策略将文本区域转换为矢量,而不是将单个“标记”转换为矢量。在此使用此方法:https : //arxiv.org/abs/1504.01255

如果您不限于CNN,则可以使用诸如以下这样的分层注意模型:https : //www.cs.cmu.edu/~diyiy/docs/naacl16.pdf,其中您有这种管道: word vectors (combined into) sentence vectors (combined into) final document vector

请注意,使用这种方法,您仍然必须将所有单词向量都转换为嵌入,但不是一次全部转换。

要处理不同长度的文档,填充/剪切是迄今为止唯一的解决方案。

最后,为了提高速度,您可以尝试通过仅包含重要部分来减小文本的尺寸(也许仅文档的开头足以具有良好的分类精度)


1
感谢您的参考链接。区域嵌入很有趣。关于可变大小的文档,如本文arxiv.org/abs/1412.1058(同一作者)所述,我们可以使用多个合并单元来代替填充/剪切。
lenhhoxung
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.