分词hanlp分词工具应用案例:商品图自动推荐功能的应用

分词工具  时间:2021-03-07  阅读:()

h a n lp分词工具应用案例商品图自动推荐功能的应用

本篇分享一个hanlp分词工具应用的案例简单来说就是做一图库让商家轻松方便的配置商品的图片最好是可以一键完成配置的。

先看一下效果图吧

商品单个推荐效果匹配度高的放在最前面

这个想法很好那怎么实现了。分析了一下解决方案步骤

1、 图库建设至少要有图片吧 图片肯定要有关联的商品名称、商品类别、商品规格、关键字等信息。

2、商品分词算法 由于商品名称是商家自己设置的不是规范的所以不可能完全匹配要有好的分词库来找出关键字。还有一点分词库要能够自定义词库最好能动态添加。如果读者不知道什么是分词请自行百度本文不普及这个。

3、推荐匹配度算法肯定要最匹配的放在前面而且要有匹配度分数。商家肯定有图库没有的商品 自动匹配的时候不能随便配置不相关的图片。

先说明一下本文企业没有搜索引擎之类的工具所以本质就靠的是数据库检索。首页让我们先分析一下图库下面是图库的设置界面。

让我们先贴一下图库的表结构

CREATE TABLE`wj_tbl_gal lery` (

`gal lery_id` int(11)NOTNULLAUTO_INCREMENTCOMMENT'主键',

`fi leid` int(11)NOT NULLCOMMENT'文件服务器上的文件ID',

`ptype`tinyint(4)NOT NULL DEFAULT'0'COMMENT'图片类型 0点歌屏点餐图片',

`materialsort`varchar(50)DEFAULT NULLCOMMENT'商品分类',

`materialbrand`varchar(50)DEFAULT NULLCOMMENT'商品品牌',

`materialname`varchar(100)NOT NULLCOMMENT'商品名称',

`material_spec`varchar(50)DEFAULT NULLCOMMENT'商品规格',

`material_al lname`varchar(200)DEFAULTNULLCOMMENT'商品完整名称',

`status`tinyint(4)NOT NULL DEFAULT'0'COMMENT'状态 0正常 1停用 2删除',

`updatedatetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP COMMENT'更新时间',

`keyword`varchar(200)DEFAULT NULL COMMENT'商品关键字用逗号隔开',

`bstorage`tinyint(4)NOT NULL DEFAULT'0'COMMENT'关键字是否入库0没有 1有',

PRIMARY KEY(`gal lery_id`),

KEY`idx_fi leid` (`fi leid`)

)ENGINE=InnoDBAUTO_INCREMENT=435 DEFAULTCHARSET=utf8COMMENT='图库信息表';数据示例

简单说一下material_al lname是干什么用的呢主要就是拼接商品名称、规则、关键字字段。用来写sql的时候比较方便。关键字字段是干什么用的呢作用有两个。 1是商品可能有多个名字补充名称的。二是给分词库动态添加词库。 图库简单说到这。

再说一下分词库笔者选择的是开源的汉语言分词库-hanlp分词工具

优点是词库大有词性分析可以自定义词库。缺点当然也有就是不支持数据库方法动态读取词库。后面说一下我自己的解决办法。

上代码

分词代码,这时差会去掉一些没用字符。

图5

我们分词就是调用SegmentUti ls.segmentTerm(materialname);

动态添加词库方法private void addCustomerDictory(){

Integer max=gal leryRepository.getMaxGal lery();if(CommonUti ls. isNotEmpty(max) && max > 0 && max >SegmentUti ls.CACHE_GALLERY_ID){int oldid=SegmentUti ls.CACHE_GALLERY_ID;

SegmentUti ls.CACHE_GALLERY_ID=max;

List<String>gal lery=gal leryRepository.getGal lery(oldid,max);if(CommonUti ls. isNotEmpty(gal lery) ){

Map<String,Boolean>dicMap= new HashMap<>();for(String w:gal lery){if(CommonUti ls. isNotEmpty(w)){

String[]array=w.spl it(",");if(CommonUti ls. isNotEmpty(array)){for(String item:array){

String value=item.trim();if(CommonUti ls. isNotEmpty(value)){dicMap.put(value, true);

}

}

}

}

}

Set<String>keys=dicMap.keySet();if(CommonUti ls. isNotEmpty(keys)){

SegmentUti ls. insertCustomDictory(keys);

}

}

}

}

**

*获取关键字

*

*@authordeng

*@date2019年3月13日

*@param gal leryId

*@return

*/

@Query("select keyword from Gal lery a where gal leryId > ?1 and gal leryId<=?2 anda.keyword!=' ' and bstorage=0")publ ic List<String>getGal lery(int bgal leryId, int egal leryId);

@Cacheable(value = CacheConstants.CACHE_GALLERY, keyGenerator =CacheConstants.KEY_GENERATOR_METHOD)

@Query(value = "select gal lery_id from wj_tbl_gal lery a where a.keyword !=' ' andbstorage=0 order bygal lery_id desc l imit 1", nativeQuery=true)publ icIntegergetMaxGal lery();

说一下解决思路 由于ha nlp文档上没有看到从mysql上动态添加词库方法 只有CustomDictionary. insert能动态添加单个实例词库系统如果重启就要重新添加。我就想出一个办法就是分词的时候查一下类的保存的最大图库表的主键是什么如果跟数据库一样就不动态添加。如果小于图库的主键就把没有的那一段用CustomDictionary. insert添加进去。系统一般不重启如果重启就在分词的时候重新添加一下。查询数据库当然都有缓存编辑图库的时候把对应缓存清除一下。这种方式也能支持分布式环境多个实例都是一样处理的。每过一段时间就把图库表的关键字词库搞成文件的词库避免动态添加太多占用太多内存。 自定义词库其实是很重要的任何分词库都不可能包含所有的词库而分词算法是根据词库来展开的可以说词库决定了分词结果的准确性。

让我们看一下分词的效果

商品名称为”雪碧大“的分词结果雪碧/n z,大/a,其中nz表示专有词汇 a表示形容词。再看一下不理想的分词结果

商品品名称:”蕾芙曼金棕色啤酒“,类别名称:啤酒,

分词结果:蕾/ng,芙/n,曼/ag,金/ng,棕色/n,啤酒/nz

很明显分词结果不理想蕾芙曼金棕色其实是一个商品名不能分开。怎么办呢这时候动态添加词汇功能就派上用场了。

再图库关键字时差添加蕾芙曼金棕色啤酒保存一下再看一下分词效果

物品名称:蕾芙曼金棕色啤酒,类别名称:啤酒,分词结果:蕾芙曼金棕色/nz,啤酒/nz

蕾芙曼金棕色被分到了一起达到预期效果这其实就是CustomDictionary. insert(data, "nz1024");再起作用。 hanlp具体API功能请参考官方文档本文就不介绍了。

最后重头戏来了商品图片匹配度分析。作者就是采用了mysql的sql词句的方法搞定了其实就用到了LOCATE函数很简单。 SQL示例如下

SELECTgal lery_id, fi leid,materialname,material_al lname, score

,ROUND(score/4* 100,0)ASrate

FROM(

SELECTa.gal lery_id,a.fi leid,materialname,material_al lname

, IF(LOCATE('雪碧', a.material_al lname), 2,0)+IF(LOCATE('大', a.material_al lname), 1,

0)+IF(LOCATE('饮料',a.material_al lname), 1,0)ASscore

FROMwj_tbl_gal lerya

WHERE a.STATUS=0

AND(a.material_al lnameLIKE'%雪碧%'

ORa.material_al lnameLIKE'%大%'

ORa.material_al lnameLIKE'%饮料%')

)b

ORDERBYscore DESC,materialname

LIMIT0,8

执行结果

可以看出gal lery_id是第一条它的rate的是75满分是100匹配度蛮高的。

说一下匹配度算法原则如果完全匹配就是1百分肯定就上了。然后去除某些关键字后也匹配上了就是90分。最后采用分词算法按照1百分打分其中如果高于50分可以算基本匹配 自动配置图片的时候就可以当成匹配成功。总体原则就是匹配词汇越多分数越多。但是两个字的词汇和5个字的词汇分数是不一样的。还有词性专属词汇理论上应该比形容词分数高。详见下面的calculateWeight代码 自己体会了。publ ic List<Map<String,Object>>queryList(String searchstr, int pagenumber, int pagesize,Stringmaterialsortname,

List<Term>segmentList) {

String name="%"+searchstr+"%";

//先简单搜索完全匹配100分

List<Map<String,Object>>l ist=queryList(name,pagenumber,pagesize, 100);if(CommonUti ls. isEmpty( l ist)) {searchstr=searchstr.replaceAl l("\\s", "");

String regEx="(特价) | (/) | (\\() | (\\)) | ( ) | ( ) | (\\d+ml) | (买.送.) | (/) | (\\*)";searchstr=searchstr.replaceAl l(regEx, "");if(CommonUti ls. isNotEmpty(searchstr)) {name="%"+searchstr+"%";

//简单过滤90分l ist=queryList(name,pagenumber,pagesize,90);

}

//剩下分词靠计算if(CommonUti ls. isEmpty( l ist)) {if(CommonUti ls. isNotEmpty(segmentList)) {l ist = queryListTerm(pagenumber, pagesize, segmentList,materialsortname);

}

//如果只有分类先定10分else if (CommonUti ls. isNotEmpty(materialsortname) )

Pia云服务商春节6.66折 美国洛杉矶/中国香港/俄罗斯和深圳机房

Pia云这个商家的云服务器在前面也有介绍过几次,从价格上确实比较便宜。我们可以看到最低云服务器低至月付20元,服务器均采用KVM虚拟架构技术,数据中心包括美国洛杉矶、中国香港、俄罗斯和深圳地区,这次春节活动商家的活动力度比较大推出出全场6.66折,如果我们有需要可以体验。初次体验的记得月付方案,如果合适再续约。pia云春节活动优惠券:piayun-2022 Pia云服务商官方网站我们一起看看这次活...

onevps:新增(支付宝+中文网站),香港/新加坡/日本等9机房,1Gbps带宽,不限流量,仅需$4/月

onevps最新消息,为了更好服务中国区用户:1、网站支付方式新增了支付宝,即将增加微信;原信用卡、PayPal方式不变;(2)可以切换简体中文版网站,在网站顶部右上角找到那个米字旗,下拉可以换中国简体版本。VPS可选机房有:中国(香港)、新加坡、日本(东京)、美国(纽约、洛杉矶)、英国(伦敦)、荷兰(阿姆斯特丹)、瑞士(苏黎世)、德国(法兰克福)、澳大利亚(悉尼)。不管你的客户在亚太区域、美洲区...

弘速云香港VPSVPS线路有CN2+BGP、CN2 GIA,KVM虚拟化架构,裸金属月付564元

弘速云怎么样?弘速云是创建于2021年的品牌,运营该品牌的公司HOSU LIMITED(中文名称弘速科技有限公司)公司成立于2021年国内公司注册于2019年。HOSU LIMITED主要从事出售香港vps、美国VPS、香港独立服务器、香港站群服务器等,目前在售VPS线路有CN2+BGP、CN2 GIA,该公司旗下产品均采用KVM虚拟化架构。可联系商家代安装iso系统。点击进入:弘速云官方网站地址...

分词工具为你推荐
沙滩捡12块石头价值近百万捡块石头价值一亿 到底是什么石头能价值一亿mathplayerjavascript 如何判断document.body.innerHTML是否为空李子柒年入1.6亿魔兽rpg箱庭世界1.6怎么进入魔门刘祚天还有DJ网么?比肩工场命比肩多 是什么意思啊?22zizi.com福利彩双色球22号开奖号陈嘉垣陈浩民狼吻陈嘉恒是什么时候的事冯媛甑冯媛甄多大啊?百度关键词工具百度有关键字分析工具吗?Google AdWords有的777k7.comwww 地址 777rv怎么打不开了,还有好看的吗>com
美国服务器租用 域名查询工具 vps服务器 域名备案只选云聚达 国内免备案主机 wavecom cloudstack gitcafe 创宇云 搜狗12306抢票助手 湖南服务器托管 智能dns解析 电信宽带测速软件 卡巴斯基试用版下载 汤博乐 沈阳idc shuangcheng register.com apachetomcat 带宽测速 更多