本文主要向大家介绍了机器学习入门之使用gensim 的 doc2vec 实现文本相似度检测,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。环境

Python3,

gensim,jieba,numpy ,pandas

原理:文章转成向量,然后在计算两个向量的余弦值。

Gensim

gensim是一个python的自然语言处理库,能够将文档根据TF-IDF, LDA, LSI 等模型转化成向量模式,gensim还实现了word2vec功能,以便进行进一步的处理。

具体API看官网:https://radimrehurek.com/gensim

中文分词

中文需要分词,英文就不需要了,分词用的 jieba 。

def segment(doc: str):

"""中文分词

Arguments:

doc {str} -- 输入文本

Returns:

[type] -- [description]

"""

# 停用词

stop_words = pd.read_csv("./data/stopwords_TUH.txt", index_col=False, quoting=3,

names=['stopword'],

sep="\n",

encoding='utf-8')

stop_words = list(stop_words.stopword)

# 去掉html标签数字等

reg_html = re.compile(r']+>', re.S)

doc = reg_html.sub('', doc)

doc = re.sub('[0-9]', '', doc)

doc = re.sub('\s', '', doc)

word_list = list(jieba.cut(doc))

out_str = ''

for word in word_list:

if word not in stop_words:

out_str += word

out_str += ' '

segments = out_str.split(sep=" ")

return segments

训练 Doc2Vec 模型

模型参数下面说明,先上代码

def train():

"""训练 Doc2Vec 模型

"""

# 先把所有文档的路径存进一个 array中,docLabels:

data_dir = "./data/corpus_words"

docLabels = [f for f in listdir(data_dir) if f.endswith('.txt')]

data = []

for doc in docLabels:

ws = open(data_dir + "/" + doc, 'r', encoding='UTF-8').read()

data.append(ws)

print(len(data))

# 训练 Doc2Vec,并保存模型:

sentences = LabeledLineSentence(data, docLabels)

# 实例化一个模型

model = gensim.models.Doc2Vec(vector_size=256, window=10, min_count=5,

workers=4, alpha=0.025, min_alpha=0.025, epochs=12)

model.build_vocab(sentences)

print("开始训练...")

# 训练模型

model.train(sentences, total_examples=model.corpus_count, epochs=12)

model.save("./models/doc2vec.model")

print("model saved")

保存成功后会有三个文件,分别是:doc2vec.model,doc2vec.model.trainables.syn1neg.npy,doc2vec.model.wv.vectors.npy

Doc2Vec参数说明:

· vector_size:是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好.

· window:表示当前词与预测词在一个句子中的最大距离是多少

· alpha: 是学习速率

· min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5

· workers参数控制训练的并行数。

· epochs: 迭代次数,默认为5

文本转换成向量

利用之前保存的模型,把分词后的分本转成向量,代码如下

def sent2vec(model, words):

"""文本转换成向量

Arguments:

model {[type]} -- Doc2Vec 模型

words {[type]} -- 分词后的文本

Returns:

[type] -- 向量数组

"""

vect_list = []

for w in words:

try:

vect_list.append(model.wv[w])

except:

continue

vect_list = np.array(vect_list)

vect = vect_list.sum(axis=0)

return vect / np.sqrt((vect ** 2).sum())

计算两个向量余弦值

余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。

余弦值的范围在[-1,1]之间,值越趋近于1,代表两个向量的方向越接近;越趋近于-1,他们的方向越相反;接近于0,表示两个向量近乎于正交。

最常见的应用就是计算文本相似度。将两个文本根据他们词,建立两个向量,计算这两个向量的余弦值,就可以知道两个文本在统计学方法中他们的相似度情况。实践证明,这是一个非常有效的方法。

公式:

def similarity(a_vect, b_vect):

"""计算两个向量余弦值

Arguments:

a_vect {[type]} -- a 向量

b_vect {[type]} -- b 向量

Returns:

[type] -- [description]

"""

dot_val = 0.0

a_norm = 0.0

b_norm = 0.0

cos = None

for a, b in zip(a_vect, b_vect):

dot_val += a*b

a_norm += a**2

b_norm += b**2

if a_norm == 0.0 or b_norm == 0.0:

cos = -1

else:

cos = dot_val / ((a_norm*b_norm)**0.5)

return cos

预测

def test_model():

print("load model")

model = gensim.models.Doc2Vec.load(‘./models/doc2vec.model‘)

st1 = open('./data/courpus_test/t1.txt', 'r', encoding='UTF-8').read()

st2 = open('./data/courpus_test/t2.txt', 'r', encoding='UTF-8').read()

# 分词

print("segment")

st1 = segment(st1)

st2 = segment(st2)

# 转成句子向量

vect1 = sent2vec(model, st1)

vect2 = sent2vec(model, st2)

# 查看变量占用空间大小

import sys

print(sys.getsizeof(vect1))

print(sys.getsizeof(vect2))

cos = similarity(vect1, vect2)

print("相似度:{:.4f}".format(cos))

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标人工智能机器学习频道!

python文本相似度检测框架_机器学习入门之使用gensim 的 doc2vec 实现文本相似度检测...相关推荐

  1. python 文本相似度_【机器学习】使用gensim 的 doc2vec 实现文本相似度检测

    环境 Python3, gensim,jieba,numpy ,pandas 原理:文章转成向量,然后在计算两个向量的余弦值. Gensim gensim是一个python的自然语言处理库,能够将文档 ...

  2. 使用opencv和python实现图像的智能处理_机器学习:使用opencv和python进行智能图像处理...

    译者序 序 前言 审校者简介 章 品味机器学习 1 1.1 初步了解机器学习 1 1.2 机器学习可以解决的事情 3 1.3 初步了解 Python 4 1.4 初步了解 OpenCV 4 1.5 安 ...

  3. 机器学习 来源框架_机器学习的秘密来源:策展

    机器学习 来源框架 成功的机器学习/人工智能方法 (Methods for successful Machine learning / Artificial Intelligence) It's wi ...

  4. python 非线性回归_机器学习入门之菜鸟之路——机器学习之非线性回归个人理解及python实现...

    本文主要向大家介绍了机器学习入门之菜鸟之路--机器学习之非线性回归个人理解及python实现,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助. 梯度下降:就是让数据顺着梯度最大的方向,也 ...

  5. python3中多项式创建_机器学习入门之机器学习之路:python 多项式特征生成PolynomialFeatures 欠拟合与过拟合...

    本文主要向大家介绍了机器学习入门之机器学习之路:python 多项式特征生成PolynomialFeatures  欠拟合与过拟合,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助. 分享 ...

  6. python泰坦尼克号数据预测_机器学习入门之Python机器学习:泰坦尼克号获救预测一...

    本文主要向大家介绍了机器学习入门之Python机器学习:泰坦尼克号获救预测一,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助. 一.项目概要 1.应用 模式识别.数据挖掘(核心).统计学 ...

  7. python机器学习及实践_机器学习入门之《Python机器学习及实践:从零开始通往Kaggle竞赛之路》...

    本文主要向大家介绍了机器学习入门之<Python机器学习及实践:从零开始通往Kaggle竞赛之路>,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助. <Python 机 ...

  8. python svr回归_机器学习入门之机器学习之路:python支持向量机回归SVR 预测波士顿地区房价...

    本文主要向大家介绍了机器学习入门之机器学习之路:python支持向量机回归SVR  预测波士顿地区房价,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助. 支持向量机的两种核函数模型进行预 ...

  9. 曲线聚类_机器学习入门必读:6种简单实用算法及学习曲线、思维导图

    来源:大数据DT 本文约3500字,建议阅读7分钟 本文为你介绍掌握机器领域知识的学习曲线.技术栈以及常用框架. [ 导读 ] 大部分的机器学习算法主要用来解决两类问题--分类问题和回归问题.在本文当 ...

最新文章

  1. nginx负载均衡策略upstream
  2. WPF 中的 Uri 地址的不同写法
  3. BXUG第11期活动
  4. Android官方开发文档Training系列课程中文版:构建第一款安卓应用之创建用户界面
  5. 中国软件开发project师之痛
  6. 图解Http读完有感
  7. 前端工程师技能之photoshop巧用系列第一篇——准备篇
  8. 一个数组去重的简单实现
  9. linux scp命令 将数据从一台linux服务器复制到另一台linux服务器
  10. vpx计算机论文,vpx总线
  11. zxr10交换机配置手册vlan_中兴交换机配置命令
  12. Android系统 GPIO状态查询
  13. 考研英语(一)——简单句
  14. win7升级ie到ie10后打不开的解决办法
  15. python27是什么文件夹可以删除吗_python如何跳过错误继续运行,同时删除产生错误的文档...
  16. C语言入门基础_验证哥德巴赫猜想
  17. 初一知识用计算机进行运算,【初一数学】必考的21个知识点!
  18. 再度公开少林内修心法(易筋经和洗髓经)欢迎转载,让全人类共享学习,过得更健康!
  19. 贵阳哪里有计算机二级培训机构,贵阳省计算机二级考试培训
  20. Android基础之intent-filter、action、category标签使用

热门文章

  1. executeUpdate模板方法
  2. 重发布(重分布、重分发)
  3. 概率论—高中基础知识
  4. 使用通用的单变量选择特征选择提高Kaggle分数
  5. Windows系统:桌面,开始菜单和工具栏都不见了
  6. SMO优化算法(转)
  7. 微信小程序输入框光标从中间删除跳到最后bug解决
  8. 炮打洋人(炮打洋鬼子)微信小程序创作
  9. 计算机算法的概念教案,1.1.1 算法的概念公开课教案(教学设计)
  10. JavaScript自己封装ajax的js