我想使用 word2vec 训练词嵌入。我的语料库被分成几个文件(这是一大组病人笔记)。我应该在运行 word2vec 之前将所有文档连接成一个,还是有更好的方法?
在 word2vec 中使用多个文档
数据挖掘
nlp
词嵌入
word2vec
2021-09-17 04:21:21
3个回答
Word2Vec 有许多实现,但大多数都假设基本单元是“句子”——尽管他们并不关心这些句子的样子。如果您使用类似的东西,gensim您将需要每个句子在其自己的列表中,并且每个句子将是一个标记列表。如果您正在使用另一个包,您可能正在从磁盘读取,在这种情况下,您可能需要将所有文档与代表一个新句子的每个换行符连接起来。
决定“句子”大小(无论是整个笔记、所有患者的笔记还是单个句子)的基本考虑是应该使用哪些周围的词来训练模型。W2V 模型在调整其向量表示时会考虑目标单词一定距离内的所有单词(无论它是cbow还是skipgram),但不会超出“句子”边界。因此,如果您的基本单位是文档而不是句子,则关联会在句子之间渗透(这可能是您想要的,也可能不是您想要的)。
顺便说一句,首先考虑文档的性质。患者笔记可能很杂乱,并且充满了自动生成的文本,因此删除或替换某些字符串可能很重要。同样,他们经常使用空格和换行符而不是标点符号。您可能需要考虑将现有空格视为句子的结尾,并且您可能希望使用解析器将日期、名称等替换为默认标记以增加通用性。
不需要串联。可以相应地更改迭代器类,以便模型可以迭代单个文件夹中的所有文档。
import os
class WordTrainer(object):
def __init__(self, dir_name):
self.dir_name = dir_name
def __iter__(self):
for idx,file_name in enumerate(os.listdir(self.dir_name)):
for idxx,line in enumerate(open(os.path.join(self.dir_name, file_name),'r'):
words = [word.lower() for word in line.split()]
yield words
patient_details = WordTrainer('/path/for/records/folder')
word_vector_model = gensim.models.Word2Vec(patient_details, size=100, window=8, min_count=5)
迭代器逐行提供文件中的每个数据,而不是将整个文档加载到模型中。当您只有很少的文档可以放入您的内存时,这不是一种内存效率高的方法。
我建议尝试doc2vec而不是 word2vec。doc2vec不仅为您提供 by 给出的词嵌入,word2vec而且还为您提供文档嵌入。使用文档嵌入,您还可以执行诸如“哪些患者有相似笔记”之类的操作。
不用说,doc2vec您可以一次输入一份文件。
其它你可能感兴趣的问题