句子相似度及R语言实现
作者:互联网
本次不讲原理,单纯用R语言计算句子相似度。
方式一:机械相似性
两个文本内容上的相关程度,比如“你好吗”和“你好”的相似性,纯粹代表着内容上字符是否完全共现。——基于Jaccard相似系数计算句子相似度
Jaccard 系数指:句子A的分词词语与句子B的分词词语交集的大小与句子A的分词词语与句子B的分词词语并集的大小的比值。有点拗口,其实就是两个句子的分词词语的交集比并集。
【图片来源:百度百科】
R语言:基于textreuse包: 由于 数据保密 性 ,所以部分内容打码了。
代码解析:tokenize_words()是一个分词的函数。
jaccard_similarity()计算两组词语的相似度。从相似度结果上看,x与y都是谈论到母亲生病住院,z也讲到住院,但并不是母亲生病住院。且x与z、y与z的相似度不应该是相等的,应该是y与z的相似度要高于x与z的相似度,因为x的重点有两个,一是母亲生病住院,二是情绪低落,y的重点仅是母亲住院,z也是与住院有关,但不是母亲住院。所以xz、yz两者的相似值间会很近,但我认为y与z的相似度应该高一点 (个人观点)。
library(textreuse)#比较文本相似度dir "C:/Users/yuan/Documents/test" #基于tm包建立语料库corpus"Civil procedure"),tokenizer=tokenize_ngrams, n=comparisons#将该矩阵转换成对的数据帧pairwise_candidates(comparisons)#比较句子相似度x "句子1"))y "句子2"))z "句子3"))jaccard_similarity(x , y) ##相似程度jaccard_similarity(x , z) jaccard_similarity(y , z)
补充:进行文本相似度计算时,保证文本里面要大于两行,否则会报错的。 (我也不清楚为什么)若想比较句子或词语差异性可采用jaccard_dissimilarity函数。若想比较文章间相似度,最好是将文件保存为同一类型, 不要一个txt文件 ,一个 word文件或其他文件。
方式二:基于词向量余弦值相似度
基于word2vec模型训练词向量,再计算句子余弦值作为句子相似度。当然,如果仅是为了学习的可以直接使用别人训练好的词向量,若用于某领域的,可以找找该方向的词向量,或者自己训练吧!word2vec有两种模型。CBOW (Continuous Bag-Of-Words,即连续的词袋模型)和Skip-Gram。通过word2vec训练词向量,可以把对文本内容的处理简化为K维向量空间中的向量运算,再基于向量空间上的相似度可以用来表示文本语义上的相似度。同时,对于word2vec训练出来的词向量也可以用来做其他的分析,比如:聚类、近似词等。由于不讲原理,所以想了解word2vec实现原理的自行去百度了解。
前面也说了数据保密性,所以就不展示数据结构了。大概讲一下我的数据!存在ecxel表中,每一行就是一个句子。
#释放内存rm(list = ls())gc()#加载所需的组件包library(readxl) #导入数据library(jiebaR) #分词library(tmcn.word2vec) #word2vec模型library(wordVectors) #word2vec模型:与tmcn.word2vec一样的,功能上比其多一点。library(dplyr) #管道操作#读取数据yq_datas #将句子转为因子形式。docs as.character(sapply(yq_datas$`YQMS(狱情描述)`, str_replace_all, #启动分词器,进行分词wk vector #worker启动器参数说明#type:默认使用混合法的返回类型:mix(混合模型),mp(最大概率),hmm(隐式马科夫模型),query(索引),tag(词性标注),simhash(距离:求相似),keywords(关键词);#dict:指定主词典的路径(使用默认,在jiebaRD包中dict文件的jieba.dict.utf8文件);#hmm:指定隐马尔科夫模式的路径(使用默认即可,也同目录下的hmm_model.utf8文件);#user:可以路径的方式自定义属于用户自己的字典(可以自己指定路径,也可以修改同目录下的user.dict.utf8文件);#idf:指定逆文档频次的路径(同目录下idf.utf8文件,一般是用于计算相似度和关键词的);#stop_word:指定停止词的路径(也可以自己指定路径,也可以修改同目录下的stop_words.utf8文件(用了很多次感觉该文件时好时坏的,建议自己指定吧!));#topn:指定提取文档关键词的个数;#encoding:指定输入文件的编码;#lines:指定最大的读取行数(文件太大了可以根据这个分段进行分词);#bylines:是否按行分词,就是按行返回结果;其他的参数可以参考worker函数。#保存分词数据:将列表转向量导入文件,再进行导入空值进行换行,再继续第二轮操作。con "C:/Users/yuan/Documents/R/win-library/3.6/tmcn.word2vec/examples/new_vector.txt",open=for(i in 1:length(vector)){ vect % unlist() write.table(vect,file = con,quote = FALSE,eol = " ",row.names = FALSE,col.names = FALSE) nul "" write.table(nul,file = con,quote = FALSE,eol = "\n",row.names = FALSE,col.names = FALSE)}close(con)#基于word2vec模型训练词向量化model = train_word2vec(system.file("examples", "new_vector.txt", package = "tmcn.word2vec"),vectors = 500,min_count = 2)model[["医院"]]#train_word2vec函数参数说明:#train_file:已经分好词的txt文件路径(词语之间由空格隔开),是一个训练数据文件。#output_file:word2vec模型训练好的词向量存储文件地址。#vectors:输出的向量维数,默认是100个,也可以设置大一点,太大了内存消耗大,处理速率低。#threads:训练模型用的线程数,默认是1,也可以通过parallel包的detectCores()函数查看当前电脑可用核数,然后选择跑几个线程。#classes:对词语聚类的个数,默认是0,采用K均值进行聚类。#window:表示当前词与预测词在一个句子中的最大距离是多少。#cbow :word2vec训练模型选择,1是CBOW加层次的网络结构(连续词袋模型),0(默认)是Skip-gram模型,具体是如何实现的可以查看相关资料。#min_count:可以对字典做截断,把词频少于min_count次数的词语丢弃, 默认值为5。#iter:迭代次数,默认为5。#force:是不是要覆盖原有的模型。其他参数查看word2vec函数#计算句子相似度vector_similarity function(x,y){ wk_vec #启动分词器 sentence_vector function(vec) #查找对应词的词向量,不存在的词设其值为0{ words #对传入的形参分词 sum_word_vec 0 for(i in 1:length(words)) #计算句子总词向量 { word if(word %in% row.names(model)) word_vecelse word_vec 0 sum_word_vec } sum_word_vec #计算句子均值词向量 return(sum_word_vec) } vecx vecy #cos cos return(cos)}vector_similarity(x,y)vector_similarity(x,z)vector_similarity(y,z)
其结果和我设想是一致的,y与z的相似度要大于x与z的相似度。步骤:1、导入数据;2、使用jiebaR包分词(采用默认参数),需要注意设置参数:bylines = T,否则它不会按行返回结果;3、将分词保存后传给word2vec模型训练词向量;4、基于词向量计算句子的总词向量;5、计算两组句子总词向量的余弦值作为句子的相似度。
注:
1、关于分词后的list结构数据保存到txt文件的方法:1:打开txt文件;2、将列表的第一个元素转为向量形式;3、将向量形式的分词写入文件中,再写入换行符;4、再将列表的第二个元素转为向量写入文件,以此类推;5、关闭文件。如果你们有什么好的方法或者函数可以告诉一下我。
2、train_word2vec函数训练词向量,输入文件必须是放在tmcn.word2vec包中的examples文件夹,放在其他位置都无法读取到,不清楚是电脑拦截了,还是其他的原因。若知道原因的,可以告诉我,非常感谢!
3、全部函数基本都是使用默认参数,后期优化可以从参数入手了,词语权重等等,最后本人不擅长自然语言处理方向的分析,若在分析过程中有错误的欢迎指正!
————————————————
版权声明:本文为CSDN博主「weixin_39860919」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39860919/article/details/112413273
标签:文件,word2vec,分词,相似,度及,句子,向量 来源: https://www.cnblogs.com/purple5252/p/15723871.html