本文分享了汉普分词工具的一个应用案例。简单地说,就是建立一个图片库,这样企业就可以方便地配置商品的图片。最好用一个键完成配置。
让我们先看看效果图:
单一推荐效果:将最匹配的项目放在前面
的想法非常好,如何实现分析解决方案的步骤:
1,画廊建设:至少要有图片,其中必须有商品名称、商品类别、商品规格、关键词等相关信息。
2,商品分割算法:由于商品名称是由商家自己设定的,没有标准化,因此不可能完全匹配。需要一个好的子词库来找到关键词。另外,子词库应该能够定制词库,最好是动态添加。如果读者不知道什么是分词,请使用百度。这篇文章没有推广这一点
3,推荐的匹配算法:最好的匹配必须放在前面,并且必须有匹配分数商人必须拥有画廊没有的商品。当自动匹配时,他们不能随机配置不相关的图片。
先解释一下,这个企业没有搜索引擎之类的工具,所以本质上是依靠数据库检索
首页让我们先分析一下图库,下面是图库设置界面
让我们粘贴图库的表格结构
创建表格' WJ _ TBL _图库'(
' GALLERY _ ID ` INT(11)NOT NULL AUTO _ INGRATION COmment ' PK ',
' FileID ` INT(11)NOT NULL COmment '文件服务器上的文件ID,
' Ptype ` Tinint(4)NOT Null默认值' 0' Comment '图片类型,0顺序歌曲屏幕顺序图片
'材料名称' varchar (100)非空注释'商品名称',
' material _ spec ' varchar(50)默认空注释'商品规格',
' material _ all name ' varchar(200)默认空注释'商品全称',
'状态' tinyint (4)非空默认' 0 '注释'状态,0正常,1禁用,2删除',
“b storage”tiny int(4)not null默认值“0”注释“是否将关键字放入存储0,1 has”,
PRIMARY KEY (`gallery _ id '),
KEY ` idx _ fileid `(` fileid `)
)引擎= InNODB Aut _ increment = 435 default charset = utf8 comment = ' gallery information table ';
数据示例:
简要描述了material_allname的用途,主要是拼接商品名称、规则和关键字字段写sql很方便关键字字段用于什么?它有两个功能1是商品可能有多个名称,补充名称第二种方法是将同义词库动态添加到子同义词库中画廊很简短。说到这里
又是子词典,作者选择了开源的中文子词典——汉普分词工具
具有大词典、词性分析的优点,并且可以定制词典当然,也有缺点,即它不支持数据库方法来动态读取同义词库。稍后,我将谈论我自己的解决方案。代码在
:
分词代码,然后一些无用的字符将被删除
我们的分词叫segment utils . segment term(material name);
动态词典添加方法:
私有空添加客户目录{
Integermax =图库储存库。GetMaxGallery。
if(CommonUtils . iSNOTempty(max)amp;&max >。0和。&max >。分段工具。CACHE _ GALLERY _ ID){
int oldid = SegmentUtils。CACHE _ GALLERY _ ID
分割线。CACHE_GALLERY_ID =最大值;
Listgallery = GalleryRepository . GetGallery(oldid,max);if(Commonutils . iSNotempty(gallery)){
MapDicMap =新哈希表& lt>;;用于(字符串w:gallery){
if(Commonutils . isnotempty(w)){
字符串数组= w.split(",");
if(Commonutils . isnotempty(array)){
for(String item:array){
String value = item . trim;
if(Commonutils . iSNotempty(value)){
DicMap . put(value,true);
}
)
)
)
)
SetKeys = DicMap . KeySet;if(Commonutils . iSNotempty(key)){
SEGMENT utils . InsertCustomdictory(key);
}
)
)
)
/* *
*获取关键字
*
|* @ AuthorDeng
* @日期2019年3月13日
* @ param Gallery
* @ return
.?1和galleryId & lt=?2和a.keyword!=“”和b storage = 0”)公共列表库(int bgalleryId,int EgalleryID);@Cacheable(值= CacheConstants。CACHE_GALLERY,keyGenerator =常量。KEY _ GENERATOR _ METHoD)
@ Query(value = "从wj_tbl_gallery a中选择gallery_id,其中a .关键字!=“”和b存储=0,按画廊_id排序,desc限制为1 ",nativeQuery = true)
公共整数getMaxGallery
表示解决方案,因为hanlp文档没有看到从mysql动态添加同义词库的方法,只有CustomDictionary.insert可以动态添加单个实例同义词库,如果系统重新启动,它将被再次添加我想出了一个办法,就是在分词时,检查类中存储的最大的库表的主键是什么,如果它和数据库一样,就不会动态添加。如果它小于图库的主键,请添加自定义词典中不存在的主键。插入通常,系统不会重新启动。如果系统重新启动,请在分词时再次添加。当然,有一个用于查询数据库的缓存。编辑图库时,请清除相应的缓存。这种方法还可以支持分布式环境,在这种环境中,多个实例以相同的方式处理。经过一段时间后,库表的关键字库被改变为文件字库,以避免动态添加过多内容和占用过多内存。事实上,定制词库非常重要。任何子词库都不能包含所有词库。分词算法基于词库。可以说,词库决定了分词结果的准确性。
让我们看看分词的效果。
的商品名是“Sprite (big)”,分词结果是Sprite /nz,big /a,其中nz表示专有词,A表示形容词
让我们来看看不满意的细分结果:
产品名称:“日尔曼金棕色啤酒”,类别名称:啤酒,
细分结果:雷/ng、付/n、满/ag、金/ng、布朗/n、比尔/nz
显然,细分结果不令人满意,日尔曼金棕色实际上是一个商品名称,不能分开。我该怎么办?此时,动态添加单词的功能将派上用场。
Re-gallery关键字时差添加Leffman Golden Brown Beer,保存并查看分割效果:
项目名称:Leffman Golden Brown Beer,类别名称:Beer,分割结果:Leffman Golden Brown /nz,Beer/NZ
Leffman Golden Brown被组合在一起以达到期望的效果,这实际上是自定义词典。插入(数据,“NZ 1024”);再现效果关于hanlp的具体API函数,请参考官方文件,本文将不介绍它们。
的最后一个亮点是商品图片的匹配度分析。作者使用mysql的sql语句来完成它,但实际上他使用了LOCATE函数,这非常简单。如
SELECT GALLERY _ ID,FILEID,MATERIAL NAME,MATERIAL _ ALL NAME,SCORE
,ROUND (SCORE/4 * 100,0)as rate
from(
SELECT a . GALLERY _ ID,a.fileid,MATERIAL NAME,material _ allname
,if (locate ('sprite ',a.material _ allname)),2。0)+如果(LOCATE ('big ',a.material_allname),1,0)+如果(locate ('drink ',a.material _ allname),1,0)作为核心
from wj _ TBL _ gallery a
其中a . status = 0
和(a . material _ all name LIKE ' % sprite % '
或a . material _ all name LIKE ' % large % '
或a.material _ allname LIKE。8
:
的执行结果可以看出,gallery_id是第一项,其评分为75分,满分为100分,匹配度相当高
表示匹配度算法原理,如果完全匹配为1%,则肯定上删除一些关键词后,匹配分数为90分。最后,使用分词算法按照1%的分数进行评分,其中如果分数高于50,则可视为基本匹配,当图片自动配置时,则可视为成功匹配。总的原则是匹配的单词越多,分数越高。然而,两个单词和五个单词的分数是不同的。还有一部分词类。理论上,专有词应该比形容词得分高详情请参考下面的计算重量代码,我自己也经历过。
公共列表