Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
简单的问答已经实现了,那么问题也跟着出现了,我不能确定问题一定是"你叫什么名字",也有可能是"你是谁","你叫啥"之类的,这就引出了人工智能中的另一项技术:
自然语言处理(NLP):大概意思就是让计算机明白一句话要表达的意思,NLP就相当于计算机在思考你说的话,让计算机知道"你是谁","你叫啥","你叫什么名字"是一个意思
这就要做:语义相似度
接下来我们用Python大法来实现一个简单的自然语言处理
现在又要用到Python强大的三方库了
第一个是将中文字符串进行分词的库叫jieba
pipinstalljieba
我们通常把这个库叫做结巴分词确实是结巴分词,而且这个词库是madeinchina,基本用一下这个结巴分词:
importjieba key_word="你叫什么名字"#定义一句话,基于这句话进行分词 cut_word=jieba.cut(key_word)#使用结巴分词中的cut方法对"你叫什么名字"进行分词 print(cut_word)#不懂生成器的话,就忽略这里 cut_word_list=list(cut_word)#如果不明白生成器的话,这里要记得把生成器对象做成列表 print(cut_word_list)#['你','叫','什么','名字']
测试代码就很明显了,它很清晰的把咱们的中文字符串转为列表存储起来了
第二个是一个语言训练库叫gensim
pipinstallgensim
这个训练库很厉害,里面封装很多机器学习的算法,是目前人工智能的主流应用库,这个不是很好理解,需要一定的Python数据处理的功底
importjieba
importgensim
fromgensimimportcorpora
fromgensimimportmodels
fromgensimimportsimilarities
l1=["你的名字是什么","你今年几岁了","你有多高你胸多大","你胸多大"]
a="你今年多大了"
all_doc_list=[]
fordocinl1:
doc_list=[wordforwordinjieba.cut(doc)]
all_doc_list.append(doc_list)
print(all_doc_list)
doc_test_list=[wordforwordinjieba.cut(a)]
#制作语料库
dictionary=corpora.Dictionary(all_doc_list)#制作词袋
#词袋的理解
#词袋就是将很多很多的词,进行排列形成一个词(key)与一个标志位(value)的字典
#例如:{'什么':0,'你':1,'名字':2,'是':3,'的':4,'了':5,'今年':6,'几岁':7,'多':8,'有':9,'胸多大':10,'高':11}
#至于它是做什么用的,带着问题往下看
print("token2id",dictionary.token2id)
print("dictionary",dictionary,type(dictionary))
corpus=[dictionary.doc2bow(doc)fordocinall_doc_list]
#语料库:
#这里是将all_doc_list中的每一个列表中的词语与dictionary中的Key进行匹配
#得到一个匹配后的结果,例如['你','今年','几岁','了']
#就可以得到[(1,1),(5,1),(6,1),(7,1)]
#1代表的的是你1代表出现一次,5代表的是了1代表出现了一次,以此类推6=今年,7=几岁
print("corpus",corpus,type(corpus))
#将需要寻找相似度的分词列表做成语料库doc_test_vec
doc_test_vec=dictionary.doc2bow(doc_test_list)
print("doc_test_vec",doc_test_vec,type(doc_test_vec))
#将corpus语料库(初识语料库)使用Lsi模型进行训练
lsi=models.LsiModel(corpus)
#这里的只是需要学习Lsi模型来了解的,这里不做阐述
print("lsi",lsi,type(lsi))
#语料库corpus的训练结果
print("lsi[corpus]",lsi[corpus])
#获得语料库doc_test_vec在语料库corpus的训练结果中的向量表示
print("lsi[doc_test_vec]",lsi[doc_test_vec])
#文本相似度
#稀疏矩阵相似度将主语料库corpus的训练结果作为初始值
index=similarities.SparseMatrixSimilarity(lsi[corpus],num_features=len(dictionary.keys()))
print("index",index,type(index))
#将语料库doc_test_vec在语料库corpus的训练结果中的向量表示与语料库corpus的向量表示做矩阵相似度计算
sim=index[lsi[doc_test_vec]]
print("sim",sim,type(sim))
#对下标和相似度结果进行一个排序,拿出相似度最高的结果
#cc=sorted(enumerate(sim),key=lambdaitem:item[1],reverse=True)
cc=sorted(enumerate(sim),key=lambdaitem:-item[1])
print(cc)
text=l1[cc[0][0]]
print(a,text)
总结
以上所述是小编给大家介绍的Python人工智能之路jiebagensim最好别分家之最简单的相似度实现,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!