如何使用 doc2vec 为 enron 数据集分配标签



我正在使用安然电子邮件数据集。我必须为这些类分配 5 个标签,即:欣赏、升级、sending_document、request_for_document、meeting_invites。现在,我使用 doc2vec 使用以下方法为其分配标签:

emails_df['tokenized_sents'] = emails_df.iloc[0:1000].apply(lambda row: nltk.word_tokenize(row['content']), axis=1)
common_texts = [
['We' ,'were', 'impressed', 'with' ,'the' ,'work', 'produced' ,'by' ,'you' ,'and' ,'you' ,'showed' ,'leadership', 'qualities' ,'that' 'the' ,'rest' ,'of' ,'the', 'team' ,'could' ,'look', 'up' ,'to'],
['Finish' ,'the' ,'financial' ,'analysis', 'report', 'that' ,'was' ,'started' ,'last' ,'week'],
['Please', 'find', 'attached'],
['Looking', 'forward', 'to' ,'hearing' ,'from', 'you'],
['The' , 'meeting', 'will', 'take', 'place', 'on', 'Wednesday'],
['forwarded', 'to', 'xx']

]
documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(common_texts)]
labels = []
#print (documents)
model = Doc2Vec(documents, size=5, window=3, min_count=1, workers=4)
#Persist a model to disk:
from gensim.test.utils import get_tmpfile
fname = get_tmpfile("my_doc2vec_model")
#print (fname)
#output: C:UsersuserABCAppDataLocalTempmy_doc2vec_model
#load model from saved file
model.save(fname)
model = Doc2Vec.load(fname)  
# you can continue training with the loaded model!
#If you’re finished training a model (=no more updates, only querying, reduce memory usage), you can do:
model.delete_temporary_training_data(keep_doctags_vectors=True, keep_inference=True)
#Infer vector for a new document:
#Here our text paragraph just 2 words
c=0
for i in emails_df['tokenized_sents']: 
vector = model.infer_vector(i)
c=c+1
import operator
index, value = max(enumerate(vector), key=operator.itemgetter(1))
labels.append(index)

在这里,emails_df只是我.csv阅读电子邮件的数据帧。我不需要一个完美的贴标机,但我需要一些有价值的东西。从现在开始,我应该朝哪个方向改进一下?(考虑到这是我第一次知道doc2vec(

编辑 : 说明: 我创建了common_texts作为特征向量,其中包含属于每个类的句子。然后我应用 doc2vec,然后使用它的 infer_vector 函数来生成相似性

Doc2Vec需要大量数据来训练有用的文本"密集嵌入"向量。仅使用少量训练文本不太可能产生良好的结果,就像您的 6 个短common_texts一样——即使您将 vector0size 减少到 5 维。

(已发表的Doc2Vec工作通常使用数万到数百万个训练文档来训练具有 100-1000 个维度的文档向量。

但更进一步,这些向量没有每个单独的维度作为可解释的类别。相反,它们是"密集"向量,其中没有先验地将意义分配给各个轴。相反,所有训练文档都被"打包"到一个共享空间中,其中它们的相对距离或相对方向可能表示关系强度。

因此,根据文档向量的最大正值维度为每个文档选择标签的代码是对Doc2Vec式向量的荒谬误用。

这将有助于更清楚地说明您的实际目标:您要分配什么样的标签,为什么?

特别是,更合适的做法是:

  • 针对所有电子邮件文本训练Doc2Vec模型

  • 如果您具有某些电子邮件的已知标签,但随后想要找出其他电子邮件的标签,请使用文档向量作为单独"分类"步骤的输入。

  • 如果您没有已知标签,但想发现电子邮件中可能存在哪种自然分组,如Doc2Vec建模的那样,那么您可以使用文档向量作为单独的"聚类"步骤的输入 - 然后进一步检查/分析生成的聚类,看看它们是否适合您的需求或揭示您的项目感兴趣的模式。

(有许多在线教程示例使用 Python 机器学习工具对来自 Enron 数据集的电子邮件进行分类。我建议成功地完成其中的一个或多个 - 即使他们不使用Doc2Vec- 了解一般的分类器训练,然后分类器测试,最后是分类器应用程序过程。只有这样,才考虑Doc2Vec作为额外的"特征"来源,以添加到分类工作中。

最新更新