当前位置:   article > 正文

文本深度学习向量化——Word2Vec、Doc2Vec_大文件 向量化

大文件 向量化

1 数据预处理

首先,需要引入jieba库,并定义get_stopwords和preprocess两个函数。get_stopwords函数用于读取停用词表,preprocess函数用于分词并去除停用词。其中jieba库是中文分词的工具库,stopwords是指需要过滤掉的无意义词汇,如“的”、“了”等。分词后,只有长度大于1的单词才会被保留,其余都被过滤掉。

import jieba
# 读取停用词
def get_stopwords(path='./stopwords.txt'):
    with open(path, encoding='utf-8') as f:
        stopwords = f.read().split('\n')
    return stopwords
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
# 分词并去除停用词
def preprocess(text, stopwords):
    words = jieba.lcut(text)
    words = [word for word in words if word not in stopwords and len(word) > 1]
    return ' '.join(words)
  • 1
  • 2
  • 3
  • 4
  • 5

接下来,从home_work.txt文件中读取文本,并对每个文本进行预处理。使用for循环读取文件中的每一行,然后使用preprocess函数将每行文本进行分词和去除停用词等预处理操作,并添加到preprodocs列表中。

# 停用词
stopwords = get_stopwords()

with open('home_work.txt','r',encoding="utf-8") as f:
    docs = f.readlines()
preprodocs = []
for text in docs:
    doc = preprocess(text, stopwords)
    preprodocs.append(doc)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2 生成词库并用序号标记

构建词汇表时,通过jieba.cut_for_search分词后,统计每个单词在vocab字典中出现的次数,如果不在vocab中,就将其添加进去。vocab字典中的每个单词作为词汇表中的一项。

# 构建词汇表
vocab = {}
for doc in preprodocs:
    words = jieba.cut_for_search(doc)
    for word in words:
        if word not in vocab:
            vocab[word] = len(vocab)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3 word2Vec 算法

使用gensim库的Word2Vec类对预处理后的文本进行词向量训练。Word2Vec是一种基于神经网络的词嵌入模型,可以将每个单词映射到一个向量空间中。训练过程使用了sentences变量,它是一个由列表组成的列表,每个列表表示一个文本的分词结果。vector_size参数指定了词向量的维度,window参数指定了训练过程中用于预测当前单词的上下文单词的范围,min_count参数指定了在语料库中出现次数小于该值的单词将被忽略。训练完成后,可以将词向量保存到word_vectors.txt文件中。

from gensim.models import Word2Vec


# 训练word2vec模型
sentences = [text.split() for text in preprodocs]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=5, workers=4)
model
# 保存词向量
with open('word_vectors.txt', 'w', encoding='utf-8') as f:
    for word in model.wv.key_to_index:
        vector = ' '.join(map(str, model.wv[word]))
        f.write(f'{word} {vector}\n')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4 Doc2Vec 算法

接下来,使用gensim库的Doc2Vec类对文档进行向量化处理。Doc2Vec是一种基于Word2Vec的文档向量化模型,可以将每个文档映射到一个向量空间中。将文档向量化需要先为每个文档生成标签,标签可以是任何字符串,但最好是唯一的。在这里,我们使用的是每个文档的索引号作为标签。然后将标签和分词后的文本一起传入TaggedDocument类的构造函数,生成一个由标签和分词后的文本组成的对象,这个对象就是Doc2Vec模型中的输入。训练过程与Word2Vec类似,只需将Word2Vec类换成Doc2Vec类即可。训练完成后,可以将文档向量保存到doc_vectors.txt文件中。

from gensim.models.doc2vec import Doc2Vec, TaggedDocument
documents = []

for i, line in enumerate(preprodocs):
    # 分词并生成标签
    documents.append(TaggedDocument(words=words, tags=[i]))

model = Doc2Vec(documents, vector_size=100, window=5, min_count=5, workers=4)
with open('doc_vectors.txt', 'w', encoding='utf-8') as f:
    for i, docvec in enumerate(model.dv):
        f.write(f'{i} {" ".join(map(str, docvec))}\n')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

5 结果截图

image.png
image.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/571192
推荐阅读
相关标签
  

闽ICP备14008679号