基于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 stopwordsstopwords = 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_Sentsentence = '疫情快结束吧!'
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:continuereturn 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 sentenceif 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语言的调用方式的记录啦~