目录

  • 一、准备语料库
  • 二、代码
    • 1.词向量的训练及词语相似度
    • 2.段落向量的训练及文档相似度
    • 3.word2vec计算网页相似度
    • 4.doc2vec计算网页相似度

一、准备语料库

首先下载wiki中文语料(大约1.7G)
https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2
下载的文件名为“zhwiki-latest-pages-articles.xml.bz2”

开源语料库
https://github.com/brightmart/nlp_chinese_corpus
https://github.com/crownpku/Awesome-Chinese-NLP

维基中文语料库地址
https://dumps.wikimedia.org/zhwiki/latest/

wike百科语料
https://dumps.wikimedia.org/zhwiki/

二、代码

1.词向量的训练及词语相似度

本文训练词向量的步骤是:

  1. 运行data_pre_process.py脚本对原始中文语料库进行预处理,该脚本执行完毕后会产生reduce_zhiwiki.txt这个文档。
  2. 运行training.py脚本,执行完该脚本后会得到zhiwiki_news系列的四个文件,训练好的词向量就存在这几个文件里。

data_pre_process.py
文本预处理,jieba分词,繁转简

# -*- coding: utf-8 -*-
from gensim.corpora import WikiCorpus
import jieba
from langconv import *def my_function():space = ' 'i = 0l = []zhwiki_name = './data/zhwiki-latest-pages-articles.xml.bz2'f = open('./data/reduce_zhiwiki.txt', 'w')wiki = WikiCorpus(zhwiki_name, lemmatize=False, dictionary={})for text in wiki.get_texts():for temp_sentence in text:temp_sentence = Converter('zh-hans').convert(temp_sentence)seg_list = list(jieba.cut(temp_sentence))for temp_term in seg_list:l.append(temp_term)f.write(space.join(l) + '\n')l = []i = i + 1if(i % 200 == 0):print('Saved ' + str(i) + ' articles')f.close()if __name__ == '__main__':my_function()

training.py
word2vec文本转向量

# -*- coding: utf-8 -*-
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
import logginglogging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)def my_function():wiki_news = open('D:\\yangyang\\wiki\\wikipre\\reduce_zhiwiki.txt', 'r', encoding='utf8')# sg = 0 表示用CBOW模型训练 1表示用SKIP-GRAM模型训练# size表示词向量的维度# window 表示当前词与预测词最大距离# min_count表示最小出现次数# workers 表示训练词向量时所使用的线程数model = Word2Vec(LineSentence(wiki_news), sg=0, size=192, window=5, min_count=5, workers=9)model.save('zhiwiki_news.word2vec')if __name__ == '__main__':my_function()# 2019/6/17 19:51
# 2019-06-18 11:15:10,509 : INFO : EPOCH 1 - PROGRESS: at 0.70% examples, 65 words/s, in_qsize 18, out_qsize 0
# 训练速度太慢,要用服务器才行 24小时还不到1% 单机训练完要100天

test
根据向量计算余弦相似度

# coding=utf-8
import gensimdef my_function():model = gensim.models.Word2Vec.load('./data/zhiwiki_news.word2vec')print(model.similarity('西红柿', '番茄'))  # 相似度为0.63print(model.similarity('西红柿', '香蕉'))  # 相似度为0.44word = '中国'if word in model.wv.index2word:print(model.most_similar(word))if __name__ == '__main__':my_function()

2.段落向量的训练及文档相似度

#!/usr/bin/env python
# -*- coding: utf-8 -*-import gensim.models as g
from gensim.corpora import WikiCorpus
import logging
from langconv import *# enable logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)docvec_size = 192class TaggedWikiDocument(object):def __init__(self, wiki):self.wiki = wikiself.wiki.metadata = Truedef __iter__(self):import jiebafor content, (page_id, title) in self.wiki.get_texts():yield g.doc2vec.LabeledSentence(words=[w for c in contentfor w in jieba.cut(Converter('zh-hans').convert(c))], tags=[title])def my_function():zhwiki_name = './data/zhwiki-latest-pages-articles.xml.bz2'wiki = WikiCorpus(zhwiki_name, lemmatize=False, dictionary={})documents = TaggedWikiDocument(wiki)# docs表示用于训练的语料文章。# size代表段落向量的维度。# window表示当前词和预测词可能的最大距离。# min_count表示最小出现的次数。# workers表示训练词向量时使用的线程数。# dm表示训练时使用的模型种类,一般dm默认等于1,这时默认使用DM模型;当dm等于其他值时,使用DBOW模型训练词向量。model = g.Doc2Vec(documents, dm=0, dbow_words=1, size=docvec_size, window=8, min_count=19, iter=5, workers=8)model.save('data/zhiwiki_news.doc2vec')if __name__ == '__main__':my_function()

3.word2vec计算网页相似度

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

  1. 关键词提取
  2. 关键词向量化
  3. 相似度计算

基本方法:抽取文本中的关键词(结巴工具包里面的tfidf关键字提取),将关键词向量化,然后将得到的各个词向量相加,最后得到一个词向量总和代表文本的向量化表示,利用总的向量计算文本相似度。

# -*- coding: utf-8 -*-
import jieba.posseg as pseg
from jieba import analysedef keyword_extract(data, file_name):tfidf = analyse.extract_tagskeywords = tfidf(data)return keywordsdef getKeywords(docpath, savepath):with open(docpath, 'r') as docf, open(savepath, 'w') as outf:for data in docf:data = data[:len(data)-1]keywords = keyword_extract(data, savepath)for word in keywords:outf.write(word + ' ')outf.write('\n')
def word2vec(file_name,model):with codecs.open(file_name, 'r') as f:word_vec_all = numpy.zeros(wordvec_size)for data in f: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_alldef 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=0return simlarityif __name__ == '__main__':model = gensim.models.Word2Vec.load('data/zhiwiki_news.word2vec')p1 = './data/P1.txt'p2 = './data/P2.txt'p1_keywords = './data/P1_keywords.txt'p2_keywords = './data/P2_keywords.txt'getKeywords(p1, p1_keywords)getKeywords(p2, p2_keywords)p1_vec=word2vec(p1_keywords,model)p2_vec=word2vec(p2_keywords,model)print(simlarityCalu(p1_vec,p2_vec))

4.doc2vec计算网页相似度

跟word2vec计算网页相似度类似,doc2vec计算网页相似度也主要包括如下三个步骤:①预处理;②文档向量化;③计算文本相似。

import gensim.models as g
import codecs
import numpy
import numpy as npmodel_path = './data/zhiwiki_news.doc2vec'
start_alpha = 0.01
infer_epoch = 1000
docvec_size = 192def 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 = 0return simlaritydef doc2vec(file_name, model):import jiebadoc = [w for x in codecs.open(file_name, 'r', 'utf-8').readlines() for w in jieba.cut(x.strip())]doc_vec_all = model.infer_vector(doc, alpha=start_alpha, steps=infer_epoch)return doc_vec_allif __name__ == '__main__':model = g.Doc2Vec.load(model_path)p1 = './data/P1.txt'p2 = './data/P2.txt'P1_doc2vec = doc2vec(p1, model)P2_doc2vec = doc2vec(p2, model)print(simlarityCalu(P1_doc2vec, P2_doc2vec))

NLP-文本向量训练及相似度计算相关推荐

  1. 从EMD、WMD到WRD:文本向量序列的相似度计算

    ©PaperWeekly 原创 · 作者|苏剑林 单位|追一科技 研究方向|NLP.神经网络 在 NLP 中,我们经常要去比较两个句子的相似度,其标准方法是想办法将句子编码为固定大小的向量,然后用某种 ...

  2. snownlp 中文文本情感分析、相似度计算、分词等

    snownlp 官网:https://pypi.org/project/snownlp/ SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了[TextBlob](https ...

  3. 文本匹配(语义相似度)综述

    本文转载自公众号"夕小瑶的卖萌屋",专业带逛互联网算法圈的神操作 ----->我是传送门 关注后,回复以下口令: 回复[789] :领取深度学习全栈手册(含NLP.CV海量综 ...

  4. 问题对语义相似度计算-参赛总结

    时间段:2018.06.10~2018.07.20 问题对语义相似度计算(从0到0.5+) 短短一个多月的时间,我学到了很多很多东西,从一个呆头小白初长成人. 首先,必须感谢我的导师能给我这个机会从头 ...

  5. word2vec相似度计算_文档相似度助力搜索引擎

    几种简单相似度算法: 1.简单共有词判断 假设现有文本A和B,将A.B经过分词.去停用词之后形成集合A={a1,a2,...,an}和集合B={b1,b2,...,bn}.用NUM(A∩B)表示集合A ...

  6. NLP 中文形近字相似度算法开源实现

    项目简介 nlp-hanzi-similar 为汉字提供相似性的计算. 创作目的 有一个小伙伴说自己在做语言认知科学方向的课题研究,看了我以前写的 NLP 中文形近字相似度计算思路 就想问下有没有源码 ...

  7. 【相似度计算】欧式距离、汉明距离、余弦距离

    整理下最近回顾相似度计算的笔记 目录 一.欧式距离 二.汉明距离 三.*余弦相似度* 一.欧式距离 欧式距离是最常见的一种距离度量方式,衡量的是多维空间中两个点之间的绝对距离. 计算公式如下: 1.n ...

  8. word2vec词向量训练及中文文本类似度计算

    本文是讲述怎样使用word2vec的基础教程.文章比較基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python ...

  9. 基于预训练词向量的文本相似度计算-word2vec, paddle

    文章目录 0. 前言 1. 余弦相似度算子 2. 示例代码并验证 3. 基于词向量的文本相似度 3.1 读取word2vec文件 3.2 定义模型 3.3 运行模型 3.4 根据分数降序排列 3.5 ...

最新文章

  1. 高速跟踪--High-Speed Tracking-by-Detection Without Using Image Information
  2. 发布Wear OS by Google开发者预览版
  3. 2020中国年度AI评选结果揭晓!领航企业、商业人物、创新产品……AI落地最佳参考就在这里...
  4. python语言中文社区-扯个淡:用Python实现中文编程
  5. python 生成图片_python生成带有表格的图片
  6. Cannot resolve table 't_daily'
  7. ETL工具学习以及安装部署
  8. android休眠 wifi 断流,WiFi断流算什么!安卓8.0曝出重大bug,严重多了
  9. 奈奎斯特定理和香农定理之科普篇
  10. VS2010使用c++、gSOAP创建WebService 图文教程
  11. hist 在matlab中的含义,matlab中hist函数的用法_matlab中hist函数
  12. 如何解决3G模块和USB转串口冲突问题
  13. java.sql.SQLSyntaxErrorException: Unknown database ‘数据库名‘
  14. 默认网关和静态路由表
  15. 《95后的指数基金投资课》基础阶段:常见指数与如何投资指数
  16. php 加载慢,解决php加载慢的一个办法_PHP教程
  17. 2015.09.07 活着就是一种召唤——《活着》余华
  18. 传奇如何读取服务器信息,传奇服务器修改之命令服务脚本详细使用方法介绍
  19. mac修改lib文件夹权限
  20. 计算机另存找不到桌面,“文件保存到桌面但是找不到”的解决方案

热门文章

  1. linux之U盘安装
  2. 机器学习(回归八)——Softmax回归
  3. Java程序设计 基础知识
  4. jquery-svg-pan-zoom实现svg拖拽放大
  5. 考研【真题】一些名校的部分真题(侵权请通知我删除)
  6. 关于登录账号时提示系统不存在此账户,但其它电脑能够登录成功的解决方案
  7. 腾讯高工保姆级“Java成长手册”,层层递进,全是精华!Github上都没有!
  8. IDEA 如何控制编辑左侧的功能图标 ICON
  9. matlab中 rgb2gray() 函数 具体实现
  10. 【转】phpcms授课学习