# -*- 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(“匹配成功“)
暂无评论内容