当前位置:   article > 正文

基于text2vec的中文文本相似度计算(解决简单对比问题)_text2vec-large-chinese

text2vec-large-chinese


本文主要解决的问题是给定一个语料库,这里语料库记录对比的问题,然后用户输入文本,计算语料库中哪一条文本与用户输入最为相似。

代码获取-更多实战项目见文章底部官网

全部代码已经上传csdn

下载地址: CSDN资源下载地址

数据格式以及内容

  1. 语料库主要用来做参考对比的基础数据,数据格式如下(base_content.csv):
 ,key_text
0,我今天用了支付宝买了东西
1,我今天用了微信买了东西
2,今天上班遇到一个漂亮的女孩,她长的很好看。
3,今天上班遇到一个帅气的男孩,他长的很帅气。
4,早上过马路遇到一个老奶奶,我扶她过了马路
5,早上过马路遇到一个老爷爷,我扶他过了马路
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. 输入待对比文件,记录的用户输入字符串,用来与语料库作对比的,数据格式如下(demo.csv):
,key_text
text
遇到一个女孩,他很漂亮
老奶奶摔倒了,我扶她起来
  • 1
  • 2
  • 3
  • 4

代码流程以及设计

加载读取数据

这里主要加载读取语料库和待对比文件,我自己定义了一个读取方法如下。

"""
加载初始数据信息
str:文件传输路径
index:所需真实值索引列表
"""
def init_data(str, index):
  dream_data = pd.read_csv(str)
  return dream_data.values[:, index]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

处理文本数据

处理文本数据,主要是去除停用词、单词(如果单词存在在关键字中则不去除)。这里读取一些停用词、关键词库是写在全局的,未定义方法。

"""
初始化获取停用词表
"""
stop = open('stop_word.txt', 'r+', encoding='utf-8')
stopword = stop.read().split("\n")
key = open('key_word.txt', 'r+', encoding='utf-8')
keyword = key.read().split("\n")

"""
对文本内容进行过滤
1。过滤停用词
2。结合关键词/字过滤
"""
rd = key.read().split("\n")

def strip_word(seg):
  # 打开写入关键词的文件
  jieba.load_userdict("./key_word.txt")
  # print("去停用词:\n")
  wordlist = []
  # 获取关键字
  keywords = jieba.analyse.extract_tags(seg, topK=5, withWeight=False, allowPOS=('n'))
  # 遍历分词表
  for key in jieba.cut(seg):
      # print(key)
      # 去除停用词,去除单字且不在关键词库,去除重复词
      if not (key.strip() in stopword) and (len(key.strip()) > 1 or key.strip() in keyword) and not (
              key.strip() in wordlist):
          wordlist.append(key)
          # print(key)
  # 停用词去除END
  stop.close()
  return ''.join(wordlist)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

文本数据对比

将输入数据与语料库对比,并记录。

"""
通过text2vec词向量模型计算
出来两段处理后的文本相似度
"""


def similarity_calculation(str_arr, str_2):
  sim = Similarity()
  str_2 = strip_word(str_2)
  result = []
  for item in str_arr:
      #这里可以将base提前处理好导出备用,以达到优化目的
      item = strip_word(item)
      result.append(sim.get_score(item, str_2))
  return result
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

全部代码示例

from text2vec import Similarity
import jieba
import heapq
import jieba.analyse
import pandas as pd

"""
初始化获取停用词表
"""
stop = open('stop_word.txt', 'r+', encoding='utf-8')
stopword = stop.read().split("\n")
key = open('key_word.txt', 'r+', encoding='utf-8')
keyword = key.read().split("\n")

"""
加载初始数据信息
str:文件传输路径
index:所需真实值索引列表
"""


def init_data(str, index):
  dream_data = pd.read_csv(str)
  return dream_data.values[:, index]

"""
对文本内容进行过滤
1。过滤停用词
2。结合关键词/字过滤
"""
rd = key.read().split("\n")

def strip_word(seg):
  # 打开写入关键词的文件
  jieba.load_userdict("./key_word.txt")
  # print("去停用词:\n")
  wordlist = []
  # 获取关键字
  keywords = jieba.analyse.extract_tags(seg, topK=5, withWeight=False, allowPOS=('n'))
  # 遍历分词表
  for key in jieba.cut(seg):
      # print(key)
      # 去除停用词,去除单字且不在关键词库,去除重复词
      if not (key.strip() in stopword) and (len(key.strip()) > 1 or key.strip() in keyword) and not (
              key.strip() in wordlist):
          wordlist.append(key)
          # print(key)
  # 停用词去除END
  stop.close()
  return ''.join(wordlist)



"""
通过text2vec词向量模型计算
出来两段处理后的文本相似度
"""


def similarity_calculation(str_arr, str_2):
  sim = Similarity()
  str_2 = strip_word(str_2)
  result = []
  for item in str_arr:
      #这里可以将base提前处理好导出备用,以达到优化目的
      item = strip_word(item)
      result.append(sim.get_score(item, str_2))
  return result

"""
将用户细节文本描述
转换为关键词文本
"""

def deal_init_data(text_data):
  text_arr = []
  for item in text_data:
      # 做关键词提取
      text_arr.append(strip_word(item))
  key_words = pd.DataFrame(text_arr, columns=['key_text'])
  key_words.to_csv('base_content.csv', sep=',', header=True, index=True)
  return key_words
  


if __name__ == '__main__':
  # 读取文本的对比数据关键词
  key_arr = init_data('base_content.csv', 1);
  # 读取文本的对比数据关键词
  demo_arr = init_data('demo.csv', 0);
  #循环对比每一个输入
  for index,item in enumerate(demo_arr):
      result = similarity_calculation(key_arr,item)    
       # 获取相似度最高的前三个
      re1 = map(result.index, heapq.nlargest(3, result))
      re2 = heapq.nlargest(3, result)
      print("原文本",item)
      for i, val in enumerate(list(re1)):
          print(i+1,".对比结果:",key_arr[val],",相似度:",re2[i])

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100

注:这个使用需要pip安装一下text2vec

运行结果:

原文本 遇到一个女孩,他很漂亮
1 .对比结果: 今天上班遇到一个漂亮的女孩,她长的很好看。 ,相似度: 0.9014007595177241
2 .对比结果: 今天上班遇到一个帅气的男孩,他长的很帅气。 ,相似度: 0.8269612688009047
3 .对比结果: 早上过马路遇到一个老奶奶,我扶她过了马路 ,相似度: 0.7627239914767185

原文本 老奶奶摔倒了,我扶她起来
1 .对比结果: 早上过马路遇到一个老奶奶,我扶她过了马路 ,相似度: 0.8301321157294765
2 .对比结果: 早上过马路遇到一个老爷爷,我扶他过了马路 ,相似度: 0.8151511340475789
3 .对比结果: 今天上班遇到一个帅气的男孩,他长的很帅气。 ,相似度: 0.6141663077445291

原文本 早晨用微信买了个包子
1 .对比结果: 我今天用了微信买了东西 ,相似度: 0.7883183438706154
2 .对比结果: 我今天用了支付宝买了东西 ,相似度: 0.7377135198420246
3 .对比结果: 早上过马路遇到一个老爷爷,我扶他过了马路 ,相似度: 0.7074578367274513
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/255507
推荐阅读
相关标签
  

闽ICP备14008679号