如何识别“答非所问”?使用gensim进行文本相似度计算

  • 时间:
  • 浏览:1
  • 来源:彩神3D_神彩3D官方

[(0, 1), (2, 1), (3, 1), (12, 1), (17, 1)]

第三步:统计网页(文档)总数M。

根据类似度排序

第一步:把每个网页文本分词,成为词包(bag of words)。

all_doc.append(doc6)

sim = index[tfidf[doc_test_vec]]

4、类似度的计算

{‘一一两个’: 4,

‘上海’: 0,

‘不’: 1,

‘人’: 14,

‘北京’: 8,

‘和’: 15,

‘哪里’: 9,

‘喜欢’: 2,

‘在’: 10,

‘地方’: 5,

‘好’: 6,

‘好吃的面 的东西’: 11,

‘好玩’: 13,

‘小吃’: 17,

‘我’: 3,

‘是’: 7,

‘的’: 12,

‘路’: 16}

使用余弦类似度来计算用户查询和每个网页之间的夹角。夹角越小,越类似。

gensim包提供了这几块模型: TF-IDF、LSI 、LDA

all_doc.append(doc7)

首先用dictionary妙招 获取词袋(bag-of-words)

编号与词之间的对应关系

doc4 = "上海好玩的在哪里"

tf:term frequency 词频

all_doc = []

doc_test_vec = dictionary.doc2bow(doc_test_list)

doc_list = [word for word in jieba.cut(doc)]

doc5 = "上海是好地方"

1、文本类似度计算的需求刚结束搜索引擎。

all_doc.append(doc4)

[[(0, 1), (1, 1), (2, 1), (3, 1)],

[(0, 1), (4, 1), (5, 1), (6, 1), (7, 1)],

[(4, 1), (5, 1), (6, 1), (7, 1), (8, 1)],

[(0, 1), (9, 1), (10, 1), (11, 1), (12, 1)],

[(0, 1), (9, 1), (10, 1), (12, 1), (13, 1)],

[(0, 1), (5, 1), (6, 1), (7, 1)],

[(0, 2), (14, 1), (15, 1), (16, 1)],

[(2, 1), (17, 1)]]

pip install jieba

doc_test_vec

sim

num_features=len(dictionary.keys()))

第五步:重复第四步,计算出所有网页每个词的tf-idf 值。

以下doc0-doc7是几块最简单的文档,大伙儿都都能否称之为目标文档,本文也不 分析doc_test(测试文档)与以上8个文档的类似度。

了解TF-IDF模型

all_doc.append(doc0)

但会 大伙儿直接拿来用就好

pip install gensim

以下使用doc2bow制作语料库

doc2 = "北京是一一两个好地方"

类似度分析

本文来自云栖社区合作妙招 妙招 伙伴“大数据挖掘DT机器学习”,了解相关信息都都能否关注“大数据挖掘DT机器学习”。

[(7, 0.704771005),

(0, 0.546100777),

(3, 0.17724207),

(4, 0.17724207),

(5, 0.013545224),

(6, 0.01279765),

(1, 0.010553493),

(2, 0.0)]

获取测试文档中,每个词的TF-IDF值

语料库如下。语料库是一组向量,向量中的元素是一一两个二元组(编号、频次数),对应分词后的文档中的每一一两个词。

使用TF-IDF模型对语料库建模。

doc_test_list = [word for word in jieba.cut(doc_test)]

all_doc_list.append(doc_list)

安装相关包

第三步:统计第一一两个网页词数N,计算第一一两个网页第一一两个词在该网页中突然经常出现的次数n,再找出该词在所有文档中突然经常出现的次数m。则该词的tf-idf 为:n/N * 1/(m/M) (还有其它的归一化公式,这里是最基本最直观的公式)

首先引入分词API库jieba、文本类似度库gensim

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]

首先,为了冗杂操作,把目标文档上放一一两个列表all_doc中。

doc0 = "我不喜欢上海"

doc_test_list

从分析结果来看,测试文档与doc7类似度最高,其次是doc0,与doc2的类似度为零。大伙儿都都能否根据TF-IDF的原理,看看是是否符合预期。

因为将主要功能封装好,包括去掉 自定义语料,去掉 停用词等,简单、易调用

第四步:重复第三步,计算出一一两个网页所有词的tf-idf 值。

第二步:根据网页库(文档)的数据,计算用户查询中每个词的tf-idf 值。

doc_test="我喜欢上海的小吃"

[[‘我’, ‘不’, ‘喜欢’, ‘上海’],

[‘上海’, ‘是’, ‘一一两个’, ‘好’, ‘地方’],

[‘北京’, ‘是’, ‘一一两个’, ‘好’, ‘地方’],

[‘上海’, ‘好吃的面 的东西’, ‘的’, ‘在’, ‘哪里’],

[‘上海’, ‘好玩’, ‘的’, ‘在’, ‘哪里’],

[‘上海’, ‘是’, ‘好’, ‘地方’],

[‘上海’, ‘路’, ‘和’, ‘上海’, ‘人’],

[‘喜欢’, ‘小吃’]]

以下把测试文档也进行分词,并保处在列表doc_test_list中

这样Python 上端有计算文本类似度的程序包吗,恭喜你,不仅有,但会 很好很强大。

all_doc_list = []for doc in all_doc:

import jieba

在文本处置中,比如商品评论挖掘,有需要要了解每个评论分别和商品的描述之间的类似度,以此衡量评论的客观性。

分词

3、处置用户查询

评论和商品描述的类似度越高,说明评论的用语比较官方,不带太大感情的说说色彩,比较注重描述商品的属性和型态,层厚更客观。

array([ 0.546100777, 0.01055349, 0. , 0.17724207, 0.17724207,

0.01354522, 0.01279765, 0.704771005], dtype=float32)

doc7 = "喜欢小吃"

#models.LdaModel()

以下对目标文档进行分词,但会 保处在列表all_doc_list中

doc3 = "上海好吃的面 的东西的在哪里"

all_doc.append(doc1)

制作语料库

以下用同样的妙招 ,把测试文档也转换为二元组的向量

all_doc.append(doc3)

原文发布时间为:2018-09-6

2、主要使用的算法是tf-idf

关于结巴分词,这里推荐

for doc in all_doc_list]

再比如知乎、贴吧等问答社区内问题 下面有也不回复者,怎样快速过滤掉与问题 无关的回答因为垃圾广告??

第一步:对用户查询进行分词。

idf:inverse document frequency 倒文档频率

主要思想是:因为某个词或短语在一篇文章中突然经常出现的频率高,但会 在或多或少文章中很少突然经常出现,则认为此词因为短语具有很好的类别区分能力,适合用来分类。

https://github.com/WenDesi/zhcnSegment

#models.LsiModel()

doc6 = "上海路和上海人"

使用gensim进行文本类似度计算

[‘我’, ‘喜欢’, ‘上海’, ‘的’, ‘小吃’]

corpus = [dictionary.doc2bow(doc)

词袋中用数字对所有词进行了编号

原理

利用gensim包分析文档类似度

使用jieba进行中文分词

index = similarities.SparseMatrixSimilarity(tfidf[corpus],

from gensim import corpora,models,similarities

把分词后形成的列表显示出来:

对每个目标文档,分析测试文档的类似度

all_doc.append(doc2)

搜索引擎需要计算“用户查询”和爬下来的众多”网页“之间的类似度,从而把最类似的排在最前返回给用户。

doc1 = "上海是一一两个好地方"

[(0, 0.0811272100375910049),

(2, 0.3909393754390612),

(3, 0.5864090631585919),

(12, 0.3909393754390612),

(17, 0.5864090631585919)]

all_doc.append(doc5)