当前位置:首页 > 公司荣誉 >

python 商品名称相似度查找(difflib库和结巴分词的运

作者:曲靖市宁江木业有限公司 来源:www.ynnjmy.com 发布时间:2017-09-15 10:13:11

python 商品名称相似度查找(difflib库和结巴分词的运用) 今天同事被告知要写一个查询商品相似度的系统,我以为事类似推荐系统一样的高大上系统,心中暗自庆幸没有被委以如此重任,不然在紧迫的时间里学习实现这套系统一定会睡眠不足的,后来同事讲解后我才知道只是一个商品名称相似度查找的小系统,说白了就是字符串相似度!
关于字符串相似度python也有很多库,比如自带的difflib库,第三方Levenshtein库等等
关于字符串相似度的原理我网上找了一篇博客看看,可惜太长了,理论知识太多,专业性太强,惭愧,我看了两行就没坚持下去,就直接用difflib库了,理由也很简单,不需要额外安装

直接上代码:

# -* coding:utf-8 -*- import difflib query_str = "美妆 日本 Laurier花王乐而雅F系列日用护翼卫生巾(25cm*17片)瞬吸干爽超薄棉柔".decode("utf-8") str_2 = "Lauríer 乐而雅 F系列敏感肌超长夜用护翼型卫生巾 40厘米 7片".decode("utf-8")#8 str_3 = "Lauríer 乐而雅 花王S系列超薄日用护翼卫生巾 25厘米 19片".decode("utf-8")#10 str_4 = "Lauríer 乐而雅 S系列 超薄瞬吸量多夜用卫生巾 30厘米 15片/包".decode("utf-8")#8 str_5 = "Lauríer 乐而雅 花王F系列敏感肌超量日用护翼型卫生巾 25厘米 18片".decode("utf-8")#10 print(difflib.SequenceMatcher(None, query_str, str_2).quick_ratio()) print(difflib.SequenceMatcher(None, query_str, str_3).quick_ratio()) print(difflib.SequenceMatcher(None, query_str, str_4).quick_ratio()) print(difflib.SequenceMatcher(None, query_str, str_5).quick_ratio())

quick_ratio()比 ratio() 效率高,好像

python 商品名称相似度查找(difflib库和结巴分词的运用)

虽然这个库和函数用起来很方便,但是,仔细一看发现结果却是:

0.560975609756
0.691358024691
0.571428571429
0.658823529412

结果显示相似度最高的尽然是“Lauríer 乐而雅 花王S系列超薄日用护翼卫生巾 25厘米 19片”,明显不对啊,一个F系列,一个S系列

于是我试了Levenshtein库

import Levenshtein print(Levenshtein.ratio(query_str,str_2)) print(Levenshtein.ratio(query_str,str_3)) print(Levenshtein.ratio(query_str,str_4)) print(Levenshtein.ratio(query_str,str_5)) 结果: 0.487804878049
0.543209876543
0.404761904762
0.541176470588
还是第二条相似度最高,见鬼啊,难道是程序比我更懂卫生巾,好吧,反正我对卫生巾的知识为零,比我强也不奇怪,但是作为字符串而言,怎么看都应该是最后一条相似度最高啊,于是我开始想怎么提高正确度,当然什么机器学习之类的高大上我是不懂,我只能自己想办法
第一个想法,分词,然后用分词得到的列表中的子字符串到对比字符串中看出现了几个,出现的越多我就认为它相似度越高

这时候就用到了结巴分词

# -* coding:utf-8 -*- import jieba import Levenshtein import difflib import numpy as np #jieba.load_userdict("dict.txt") #可以使用自定义词典 query_str = "美妆 日本 Laurier花王乐而雅F系列日用护翼卫生巾(25cm*17片)瞬吸干爽超薄棉柔".decode("utf-8") str_2 = "Lauríer 乐而雅 F系列敏感肌超长夜用护翼型卫生巾 40厘米 7片".decode("utf-8")#8 str_3 = "Lauríer 乐而雅 花王S系列超薄日用护翼卫生巾 25厘米 19片".decode("utf-8")#10 str_4 = "Lauríer 乐而雅 S系列 超薄瞬吸量多夜用卫生巾 30厘米 15片/包".decode("utf-8")#8 str_5 = "Lauríer 乐而雅 花王F系列敏感肌超量日用护翼型卫生巾 25厘米 18片".decode("utf-8")#10 str_list=[str_2,str_3,str_4,str_5] seg_list = list(jieba.cut(query_str.strip()))#默认精确模式 dict_data={} sarticiple =list(seg_list) for strs in str_list: num=0 for sart in sarticiple: if sart in strs: num = num+1 else: num = num dict_data[strs]=num for k,v in dict_data.items(): print(k) print(v) print("\n") 结果:
Lauríer 乐而雅 花王S系列超薄日用护翼卫生巾 25厘米 19片
10
Lauríer 乐而雅 花王F系列敏感肌超量日用护翼型卫生巾 25厘米 18片
10
Lauríer 乐而雅 S系列 超薄瞬吸量多夜用卫生巾 30厘米 15片/包
8
Lauríer 乐而雅 F系列敏感肌超长夜用护翼型卫生巾 40厘米 7片
8

结果发现相似度最高的S系列也是最多10个匹配,这样可以推断出相似度算法基本也有一部分是像我这样分词匹配,看匹配的多少,难道这就是字符串相似度其中一部分算法?
这样还是没有提高准确度,那该怎么办呢,我在想原始字符串和对比字符串的两个长度会不会有什么关联呢,毕竟两个相同的字符串长度一定一样啊,那相似的字符串是不是长度也就越接近呢,那我可以用原始字符串减去(原始字符串和比较字符串的中位数)然后用1除以得到一个值用来调节相似度算法所得到的偏差值,因为我看difflib给出的值是在0.0x左右,所以我打算给调节值再乘以0.1,让它的影响力稍微小一点,不至于大的夸张,对于长度相等的我直接给0.05这个调节值,不要问为什么,我瞎给的

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:湖北网站建设 http://hubei.45qun.com

  • 上一篇:新手站长浅谈网络供职领域的产业规律
  • 下一篇:最后一页