使用LSTM自动编码器+ DBSCAN将文本文档聚类,性能问题

问题描述

我有很多文档(〜100k),需要将它们分类为不同的类别(收据,发票,欢迎信等),并一直在尝试不同的方法

我首先进行提取(最终使用OCR),然后一切顺利。然后,我清理文本并删除特殊字符,数字等,这很容易做到。我通常只在每个文档中保留40个开头的单词,因为通常最相关的信息在标题中。

我尝试的第一种方法是执行CountVectorizer并计算单词的TF(我最频繁地保存300个),然后将这些结果发送到DBSCAN。它的效果不佳,我在-1类中有许多离群值,如果我大量增加epsilon,群集将开始合并并充满噪音。通过这种方法,我可以实现30%的文档聚类,其余的则是离群值。 DBSCAN是为我提供干净集群的最佳算法,诸如KMeans之类的其他算法可能会集群100%的文档,但是大多数集群都是随机垃圾,根本没有类似的文档。

一个方法应该更好。这是一个LSTM自动编码器。当然,我不能为此使用CountVectorizer,所以我用gensim训练了Word2Vec模型:

model = gensim.models.Word2Vec(sentences,min_count=1,size = 200,window = 5,workers=10)

然后我对所有文本进行编码:

word_vectors = model.wv
embedded_data = []
for doc in tqdm(data):
    vectors = []
    for word in doc:
        vectors.append(word_vectors[word])
    embedded_data.append(vectors)

后贴它们:

X = pad_sequences(embedded_data,maxlen=40,padding="post",dtype='float32')

并将它们发送到如下定义的LSTM自动编码器:

model = Sequential()
model.add(Masking(mask_value=0.,input_shape=(40,100)))
model.add(LSTM(64,100),return_sequences=True))
model.add(LSTM(64,activity_regularizer=l1(10e-5)))
model.add(RepeatVector(timesteps))
model.add(LSTM(64,return_sequences=True))
model.add(Timedistributed(Dense(100)))
model.compile(optimizer='adam',loss='mse',metrics=['mae'])
model.summary()

在类似批处理大小为64的40个纪元之后,损耗停止减小并达到0.38(通常从〜1.7开始)。我仍然认为这种损失还不够低。

然后,我使用编码器获取所有文档的编码表示形式(第二层之后为64个值),并在其上使用DBSCAN。我设法将近50%的文档归为一组,这比之前的30%更好,但是我对此仍然不满意,希望获得一些帮助。

看到我的模型,您是否对提高性能有任何建议?我找不到网上使用LSTM自动编码器的人的任何示例。我想增加模型参数的数量,但不知道该怎么做。

在LSTM中增加单元数是没有用的,因为只有40个单词,而64个就足够了。我该怎么做才能使模型更复杂?

欢迎任何提示

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)