基于wiki中文语料库的gensim模型使用方法以及R语言的调用方式
近期想要整理下硬盘里的东西,看到本科毕设做情感倾向分析相关的数据,想起当时使用gensim训练词向量模型训练了超级久,决定将训练好的模型上传到云空间,记录下怎么使用的,以防以后需要用到。
具体训练方式貌似应该不怎么需要用到就不细细理顺了,主要记录下使用方式。训练好的词向量模型已上传,有需要用的朋友可以自行下载:
链接:https://pan.baidu.com/s/1HWY_DtrKLebry3_LyFQKPA
提取码:4u1n
其实训练得到的gensim词向量模型有两种加载方式,这里就上传其中一个.vector
文件的形式吧。顺便上传一个停用词表,用的是当时哈工大的一个停用词表,不知道现在有没有更新。
当时训练词向量模型还是2019年四月,因此训练的语料库是当时最新的wiki中文语料库,语料更新至2019年3月2日,包含语料334,014条。接下来介绍怎么使用gensim训练的word2vec词向量模型。当时训练模型是基于python进行训练的,所以用到的都是python代码。最近使用r开发算法愈发频繁,发现了一个可交互使用到r与python的方法,最后将会介绍怎么从r中加载并应用已训练好的词向量模型。
需要安装与加载的库
import numpy as np
import jieba
import gensim
加载模型
加载gensim训练的词向量模型有两种方法,一个是加载.model
文件,一个是加载.vector
文件。加载.model
会要求要有几个.npy
的文件。
# 加载wikizh.model
model = gensim.models.word2vec.Word2Vec.load('./model/wikizh.model')
# 或者wikizh.vector:
model = gensim.models.KeyedVectors.load_word2vec_format('wikizh.vector')
model.init_sims(replace=True)
加载后就可以用这个模型对文本进行词向量转化啦~当时训练的词向量是个300维的向量,比如我们可以查询你好
的词向量
hi = model['你好']
会得到一个300维的词向量:
其他操作可以看下gensim的相关资料。
文本语句的词向量转化
对于文本语句,首先需要对它进行分词操作,这里直接使用jieba
进行分词即可。同时,需要进行停用词的处理,为了方便之后使用,将这些都写成了函数的形式。
首先是加载停用词表:
def getStopwords():
"""
获取停用词表
这里使用哈工大停用词表
"""
stopwords = []
with open('./dictionary/Hstopwords.txt', 'r', encoding = 'utf-8') as fp:
stopwords_List = fp.readlines()
for l in stopwords_List:
stopwords.append(l.strip('\n'))
return stopwords
stopwords = getStopwords()
对于文本通常是语句的形式,常用的处理方式是通过jieba
进行分词操作。
# 文本分割
def sent2word(sentence):
"""
通过jieba进行文本分割,去除停用词
input :
sentence - 原文
output :
newSent - 进行文本分割并去除停用词的文本
"""
seg_List = jieba.cut(sentence)
seg_Result = []
for w in seg_List:
seg_Result.append(w)
new_Sent = list(filter(lambda x:x not in stopwords, seg_Result))
return new_Sent
sentence = '疫情快结束吧!'
words = sent2word(sentence)
print('sentence: ', sentence, 'to words: ', words)
输出结果
sentence: 疫情快结束吧! to words: ['疫情', '快', '结束']
对于一个由词组成的列表,通过model
获取它的词向量:
def getWordVecs(word_List):
"""
获取词向量
input:
word_List - 输入语句
output:
vecs - 语句对应的词向量
"""
vecs = []
for word in word_List:
word = word.replace('\n', '')
try:
vecs.append(model[word])
except KeyError:
continue
return np.array(vecs, dtype = 'float')
senVec = getWordVecs(words)
当时为了方便直接将文件转为词向量,写了一个函数:
def buildVecs(filename):
"""
构建文档词向量
input:
filename - 输入文档名
output:
file_Input - 文档对应的词向量
"""
file_Input = []
with open(filename, 'r', encoding ='utf-8') as f:
lines = f.readlines()
for l in lines:
l = l.strip('\n')
l = sent2word(l)
# print(l)
result_List = getWordVecs(l)
# print(result_List)
# for each sentence, the mean vector of all its vectors is used to represent this sentence
if len(result_List) != 0:
result_Array = sum(np.array(result_List)) / len(result_List)
file_Input.append(result_Array)
return file_Input
这个对.txt
之类的可能会方便写,.csv
的话就更方便了,直接读取成DataFrame
,对每一行进行转换即可。
R与python的交互
最后,由于最近经常需要用R开发,发现了一个R调用python超级好用的包,顺手写下怎么在R中调用Python。
首先需要安装reticulate
以及写好的python代码,只需要将上面的函数放到一个代码里就好。在R中输入:
path <- 'yourFilePath'
setwd(path)
library(reticulate)
source_python('./yourfile.py')
调用后,在python中写的函数与生成的变量都可以直接用。
使用方式与python中的一致,比如输出你好
的词向量:
model['你好']
唯一的缺陷就是不能存储为.Rdata
进行使用,存储后貌似都是空的东西。
以上就是关于wiki中文语料库的gensim模型使用方法以及R语言的调用方式的记录啦~