Python自然语言处理实战:计算两篇文章的相似度

       此书专注于中文的自然语言处理,以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")

 

       下面的函数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.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))

 

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)

 

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

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

免责声明:信息仅供参考,不构成投资及交易建议。投资者据此操作,风险自担。
如果觉得文章对你有用,请随意赞赏收藏
相关推荐
相关下载
登录后评论
Copyright © 2019 宽客在线