python句子相似度比较

python句子相似度比较-源码网
python句子相似度比较
此内容为付费阅读,请付费后查看
0.1
立即购买
您当前未登录!建议登陆后购买,可保存购买订单
付费阅读
已售 1
# -*- coding: utf-8 -*-
import jieba
import numpy as np
import re

def get_word_vector(s1, s2):
“””
:param s1: 句子1
:param s2: 句子2
:return: 返回句子的余弦相似度
“””
# 分词
cut1 = jieba.cut(s1)
cut2 = jieba.cut(s2)
list_word1 = (‘,’.join(cut1)).split(‘,’)
list_word2 = (‘,’.join(cut2)).split(‘,’)

# 列出所有的词,取并集
key_word = list(set(list_word1 + list_word2))
# 给定形状和类型的用0填充的矩阵存储向量
word_vector1 = np.zeros(len(key_word))
word_vector2 = np.zeros(len(key_word))

# 计算词频
# 依次确定向量的每个位置的值
for i in range(len(key_word)):
# 遍历key_word中每个词在句子中的出现次数
for j in range(len(list_word1)):
if key_word[i] == list_word1[j]:
word_vector1[i] += 1
for k in range(len(list_word2)):
if key_word[i] == list_word2[k]:
word_vector2[i] += 1

# 输出向量
print(word_vector1)
print(word_vector2)
return word_vector1, word_vector2

def cos_dist(vec1, vec2):
“””
:param vec1: 向量1
:param vec2: 向量2
:return: 返回两个向量的余弦相似度
“””
dist1 = float(np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2)))
return dist1

def filterHtmlTag(htmlstr):
”’
过滤html中的标签
”’
# 兼容换行
s = htmlstr.replace(\r\n, \n)
s = htmlstr.replace(\r, \n)

# 规则
re_cdata = re.compile(//<!\[CDATA\[[^>]*//\]\]>, re.I) # 匹配CDATA
re_script = re.compile(<\s*script[^>]*>[\S\s]*?<\s*/\s*script\s*>, re.I) # script
re_style = re.compile(<\s*style[^>]*>[\S\s]*?<\s*/\s*style\s*>, re.I) # style
re_br = re.compile(<br\\s*?\/??>, re.I) # br标签换行
re_p = re.compile(<\/p>, re.I) # p标签换行
re_h = re.compile(<[\!|/]?\w+[^>]*>, re.I) # HTML标签
re_comment = re.compile(<!–[^>]*–>) # HTML注释
re_hendstr = re.compile(^\s*|\s*$) # 头尾空白字符
re_lineblank = re.compile([\t\f\v ]*) # 空白字符
re_linenum = re.compile(\n+) # 连续换行保留1

# 处理
s = re_cdata.sub(, s) # CDATA
s = re_script.sub(, s) # script
s = re_style.sub(, s) # style
s = re_br.sub(\n, s) # br标签换行
s = re_p.sub(\n, s) # p标签换行
s = re_h.sub(, s) # HTML标签
s = re_comment.sub(, s) # HTML注释
s = re_lineblank.sub(, s) # 去空白字符
s = re_linenum.sub(\n, s) # 连续换行保留1
s = re_hendstr.sub(, s) # 去头尾空白字符

# 替换实体
s = replaceCharEntity(s)

return s

def replaceCharEntity(htmlStr):
”’
替换html中常用的字符实体
使用正常的字符替换html中特殊的字符实体
可以添加新的字符实体到CHAR_ENTITIES
CHAR_ENTITIES是一个字典前面是特殊字符实体 后面是其对应的正常字符
:param htmlStr:
”’
self.htmlStr = htmlStr
CHAR_ENTITIES = {‘nbsp’: ‘ ‘, ‘160’: ‘ ‘,
‘lt’: ‘<‘, ’60’: ‘<‘,
‘gt’: ‘>’, ’62’: ‘>’,
‘amp’: ‘&’, ’38’: ‘&’,
‘quot’: ‘”‘, ’34’: ‘”‘, }
re_charEntity = re.compile(r’&#?(?P<name>\w+);)
sz = re_charEntity.search(htmlStr)
while sz:
entity = sz.group() # entity全称,如>
key = sz.group(‘name’) # 去除&;后的字符如(” “—>key = “nbsp”) 去除&;entity,>gt
try:
htmlStr = re_charEntity.sub(CHAR_ENTITIES[key], htmlStr, 1)
sz = re_charEntity.search(htmlStr)
except KeyError:
# 以空串代替
htmlStr = re_charEntity.sub(, htmlStr, 1)
sz = re_charEntity.search(htmlStr)
return htmlStr

if __name__ == ‘__main__’:
s1= 乔疏沛,五格,吉祥,名字,,的人,财库明天五格
s2 = ,乔子,乔安,乔安之,乔慕,乔疏沛,五格,吉祥,名字,,字根,寓意,总称,成语,老鼠
vec1, vec2 = get_word_vector(s1, s2)
dist1 = cos_dist(vec1, vec2)
print(dist1)
if dist1 >= 0.9:
print(匹配成功)

© 版权声明
THE END
喜欢就支持一下吧
点赞5赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容