Python自然语言处理实战:两篇文章相似度清晰透明

电子说

1.3w人已加入

描述

此书专注于中文的自然语言处理,以Python及其相关框架为工具,以实战为导向,详细讲解了自然语言处理的各种核心技术、方法论和经典算法。三位作者在人工智能、大数据和算法领域有丰富的积累和经验,是阿里巴巴、前明略数据和七牛云的资深专家。同时,本书也得到了阿里巴巴达摩院高级算法专家、七牛云AI实验室Leader等专家的高度评价和鼎力推荐。

本节将利用训练好的词向量和段落向量对两篇关于天津全运会的新闻进行向量化,并计算两篇新闻的相似度。如下是两篇新闻:

新闻1:6日,第十三届全运会女子篮球成年组决赛在天津财经大学体育馆打响,中国篮协主席姚明到场观战。姚明在接受媒体采访时表示,天津全运会是全社会的体育盛会,他称赞了赛事保障与服务工作,并表示中国篮协将在未来的工作中挖掘天津篮球文化的价值。

本届天津全运会增加了包括攀岩、马拉松、象棋在内的19个大项的群众体育比赛项目,普通群众成为赛场“主角”。对此,姚明表示:“引入群众性的体育项目,真正做到了全运会的‘全’字,这不仅仅是专业运动员的盛会,更是全社会的体育盛会。”谈及本届全运会赛事筹备与保障服务时,姚明说:“全运会得到了天津市委市政府和各区、各学校的大力帮助,篮球项目比赛(顺利举办)要感谢天津方方面面的支持。”此外,姚明还对全运村内的保障服务和志愿者工作表示赞赏。“很多熟悉的教练员和运动员都表示服务保障很不错,志愿者态度很积极。”“毋庸置疑,天津是中国篮球发源地,1895年,在篮球运动诞生4年的时候就漂洋过海从天津上岸,这是中国篮球具有历史意义的地方。”姚明在谈及天津篮球文化和未来发展时说,“天津保留着迄今为止世界上最古老的室内篮球场,这都是非常重要的篮球文化遗产,希望能在未来的工作中挖掘这些历史遗产的价值。”姚明说:“天津是座美丽的城市,这次来天津能够感到浓厚的体育文化元素,希望运动员和教练员在比赛赛得好的同时,也能领略到天津的城市文化。”

新闻2:从开幕式前入住全运村到奔波于全运三座篮球场馆之间,中国篮协主席姚明抵津已有10多天了。昨天在天津财大篮球馆,姚明还饶有兴致地谈了对本次天津全运会的看法,能够让群众融入进来,是他觉得最有亮点的地方。 “全运会是一项很有传统的运动会,这次来到天津,得到市委、市政府的大力支持,天津各个区学校对于篮球比赛从人员到场馆给予很大帮助,中国篮协作为竞委会的一员,受到总局的委派承办篮球的比赛,真的非常感谢天津对我们方方面面的支持。”尽管之前多次到访津城,不过这次因为全运,还是给了姚明很多不一样的感受,“天津是座非常美丽的城市,我之前来这里很多次了,这次来感受到了非常浓烈的体育文化元素,我们希望运动员、教练员在这座美丽的城市比赛赛得好,同时能够领略到天津的城市文化。”本届全运的群众项目的比赛,引起了姚明极大的兴趣,“这次天津全运会最突出的特点是引入了群众性体育和群众性的项目,同时设立了群众性的奖牌和荣誉,是真的做到了一个‘全’字,这也符合体育融入社会的一个大趋势,全运会不该只是专业运动员的盛会,也是所有社会人的一个盛会。”对于这段时间在天津的生活,姚明也是赞不绝口,“我们作为篮协的官员都住在技术官员村,这段时间的生活工作都在里面,听到了很多熟悉的运动员、教练员对本次全运会的夸赞,生活工作非常方便,保障非常齐全,我们为天津感到非常高兴。很多场馆都很新,很多志愿者都很年轻,大家都积极奔波在各自的岗位上,这一点我们的运动员和教练员应该是最有发言权的。”作为中国最出色的篮球运动员,姚明也谈了天津作为中国篮球故乡的感受,“毋庸置疑,天津是中国篮球的发源地,是篮球传入中国的第一故乡,在篮球1891年诞生之后4年就漂洋过海来到中国,在天津上岸,这是对中国篮球具有历史意义的地方,并且我们也知道这里保留了迄今为止世界上最古老的室内篮球馆,这些都是我们非常重要的文化遗产。我希望我们在未来的工作中,可以让这样越来越多的历史故事被重新挖掘出来。

1. word2vec计算网页相似度

word2vec计算网页相似度的基本方法是:抽取网页新闻中的关键词,接着将关键词向量化,然后将得到的各个词向量相加,最后得到的一个词向量总和代表网页新闻的向量化表示,利用这个总的向量计算网页相似度。包括的步骤是:1)关键词提取,2)关键词向量化,3)相似度计算。

首先是关键词提取,这里我们采用jiebag工具包中tfidf关键词提取方法,如下图7-14所示,函数KeyWord_Extract的功能就是提取句子的关键词,并将关键词保存在txt文件中。

def Word_cut(sentence, file_name):  words = pseg.cut(sentence)  for word in words:      with open(file_name, "a") as f:         f.write(str(word.word.encode("utf-8")) + " ")  with open(file_name, "a") as f:      f.write("\n") def KeyWord_Extract(data, file_name):  tfidf = analyse.extract_tags  keywords = tfidf(data)  for keyword in keywords:      with open(file_name, "a") as f:         f.write(str(word.word.encode("utf-8")) + " ")  with open(file_name, "a") as f:      f.write("\n") if __name__ == "__main__":  DataFile = codes.open("P2.txt", "r")  DataSet = DataFile.readlines()  for data in DataSet:      data = data[:len(data)-1]      words = Word_cut(data, "P22.txt")     KeyWord_Extract(data, "P22_keyword.txt")

图7-14

图7-15的函数word2vec便是从txt文件中读取关键词,利用上两节训练好的词向量获取关键词的词向量。需要注意的是,由于本文训练词向量的语料不是特别大(大约1.5G的纯文本)无法包括所有的汉语词语,所以在获取一个词语的词向量时,最好使用代码25行所示的方式判断模型是否包含该词语,如果包含再获取词向量,否则会报错。

def word2vec(file_name, model):  DataFile = codes.open(file_name, "r")  DataSet = DataFile.readlines()  word_vec_all = numpy.zeros(wordvec_size)  for data in DataSet:      data = data.decode("utf-8")      space_pos = get_char_pos(data, " ")      first_word = data[0:space_pos[0]]      if model.__contains__(first_word):         word_vec_all = word_vec_all + model[first_word]          for i in range(len(space_pos) - 1):         word = data[space_pos[i]:space_pos[i+1]]         if model.__contains__(word):            word_vec_all = word_vec_all + model[word]  return word_vec_all

图7.15 关键词向量化代码

如图7.16所示的词向量相似度计算代码,通过余弦相似度计算两个向量的相似度。根据图7.16的代码,计算出新闻1和新闻2 的相似度为0.66.

def SimlarityCalu(Vector1, Vector2):  Vector1Mod = np.sqrt(Vector1.dot(Vector1))  Vector2Mod = np.sqrt(Vector2.dot(Vector2))  if Vector2Mod != 0 and Vector1Mod != 0:      simlarity = (Vector1.dot(Vector2))/(Vector1Mod*Vector2Mod)  else:      simlarity = 0  return simlarity if __name == "__main__":  model = gensim.models.Word2Vec.load("zhiwiki_news")  p1_vec = word2vec("P11_keyword.txt", model)  p2_vec = word2vec("P22_keyword.txt", model)   print(SimlarityCalu(p1_vec, p2_vec))

图7-16 word2vec词向量相似度计算

2. doc2vec计算网页相似度

跟word2vec计算网页相似度一样,doc2vec计算网页相似度主要包括如下三个步骤:1)预处理,2)句子向量化,3)计算文本相似。

预处理就是对文本进行分词,每个词用空格隔开,具体代码如图7-14的Word_cut函数所示,该函数完成文本的分词,并把分词结果按要求保存在txt文档中。在预处理文本之后便是利用doc2vec对句子向量化,句子向量的训练方法见7.3.2[计算机1] 节,这里直接利用训练好的句子向量。代码如图7-17的doc2vec函数所示。同样用余弦相似度计算文本的相似度,代码入图7-17所示的main函数。最后经计算所得利用doc2vec计算新闻1和新闻2间的相似度为0.97。

def doc2vec(file_name, model):  docs = [x.strip().split() for x in codecs.open(file_name, "r", "utf-8".readlines()]  doc_vec_all = numpy.zeros(docvec_size)  for d in docs:      doc_vec_all = doc_vec_all + model.infer_vector(d, alpha=start_alpha, steps=infer_epoch)  return doc_vec_all if __name__ == "__main__":model = g.Doc2Vec.load(model_path)      P1_doc2vec = doc2vec("toy_data/P11.txt", model)      p2_doc2vec = doc2vec("toy_data/P22.txt", model)     print(SimlarityCalu(p1_doc2vec, p2_doc2vec)

图7-17 doc2vec 文本相似度计算代码

3. 两种相似度计算方法分析

前文介绍了word2vec和doc2vec两种计算网页相似度的方法,结果显示利用doc2vec方法计算的相似度为0.97高于word2vec计算的0.66,显然通过阅读前两篇新闻,知道这两篇新闻极为相似,因此可以判断doc2vec计算文本相似度的方法更胜一筹。这是因为:1)doc2vec不仅利用了词语的语义信息而且还综合了上下文语序信息,而word2vec则丢失了语序信息;2)word2vec方法中的关键词提取算法准确率不高,丢失了很多关键信息。

(1)三位作者资历深厚,分别是阿里巴巴的数据架构师和NLP专家、百炼智能的NLP专家(前明略数据的技术合伙人和科学家)、七牛云AI实验室NLP&OCR方向负责人

(2)以实战为导向,绕开各种复杂数学公式与证明,确保读者零基础入门,详细讲解自然语言处理 的各种核心技术、方法论和经典算法

(3)阿里巴巴达摩院高级算法专家、百炼智能CEO、七牛云AI LAB负责人、天善智能创始人联袂推荐

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分