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最好别分家之最简单的相似度实现,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!