介绍
\qquad 本文主要介绍如何使用Python中的spacy、jieba、gensim等库,通过使用Word2Vec和Doc2Vec模型生成中文词向量和句向量。
\qquad
其中,spacy是一个用于自然语言处理的库,支持多语言,其中包括中文。jieba是一个中文分词库,可以将中文文本分词。gensim是一个开源的Python库,用于处理文本数据,其中包括生成词向量和句向量的Word2Vec和Doc2Vec模型。原始数据展示如下:
代码实现
\qquad 首先,需要导入相关库和模型:
import os
import spacy
import jieba
from tkinter import _flatten
from gensim.models import Word2Vec
from gensim.models.doc2vec import Doc2Vec, TaggedDocument
import numpy as np
\qquad 然后,加载中文模型:
nlp = spacy.load("zh_core_web_sm")
\qquad 接着,实现中文分词和去除停用词的功能:
def stopwords(data):
words = [];lst = [];lst2 = []
for i in data:
doc = nlp(i)
lst.append(doc)
for i in range(len(data)):
lst3 = []
for j in lst[i]:
lst3.append(j.text)
lst2.append(lst3)
for i in range(len(data)):
texts = []
for w in lst2[i]:
a = nlp.vocab[w] #转换格式
if a.is_stop == False:
texts.append(a.text)
words.append(texts)
f1.write(' '.join(texts))
return words
\qquad 其中,data为要分词的文本数据,首先将其加载到spacy中,然后用jieba进行分词,去掉停用词后返回分词结果。代码实现结果如下:
\qquad 接着,实现创建词库的功能:
def lexicon(stopw):
vocab = {}
words = list(_flatten(stopw))
for word in words:
if word not in vocab:
vocab[word] = len(vocab)
return vocab
\qquad 其中,stopw为分词去除停用词后的文本数据,遍历分词结果,创建一个词库,并返回词库。
\qquad 接下来,训练Word2Vec模型:
# 训练word2vec模型
model = Word2Vec(stopw, vector_size=100, window=5, min_count=5, workers=4)
# 保存词向量
with open('word_word2vec.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')
\qquad 其中,stopw为分词去除停用词后的文本数据,设置词向量的维度为100,窗口大小为5,最小词频为5,训练workers为4。将训练好的词向量保存到名为“word_word2vec.txt”的文本文件中,每一行为一个词向量,以词汇及其对应的100维向量表示。接着,利用分词后的文本数据训练Doc2Vec模型,其中每个文档的标签用其在文本数据中的索引表示。同样地,设置向量维度为100,窗口大小为5,最小词频为5,训练workers为4。将训练好的句向量保存到名为“doc_vectors.txt”的文本文件中,每一行为一个句向量,以文档索引及其对应的100维向量表示。这样,我们便成功地使用Word2Vec和Doc2Vec模型生成了词向量和句向量。
结果展示