字符串相似度匹配算法python_Python – 处理字符串相似度

背景:

通过爬虫获取了大量的商品信息,由于爬到的商品类别是商家自定义的,现在要统一管理,把商家类别映射成自定义类别

思路:

匹配商家类别和自定义类别中每个名称的相似度,相似度大于某个阀值的,最大的自定义类别字符串则为映射目标

一、Levenshtein

使用python的Levenshtein来处理相似度

1、安装

pip install python-Levenshtein

sourceCode:https://github.com/ztane/python-Levenshtein/

2、使用

使用方法很简单,用 Levenshtein.distance 就行,直接上代码:

#!/usr/bin/python

import Levenshtein

baseCat = ['Womens Clothing & Accessories','Mens Clothing & Accessories'...]

needCampareStr = ['Masturbators','Palette','Mens Watch']

for cS in needCampareStr:

dStr = ''

distance = 999

for bS in baseCat:

cbDis = Levenshtein.distance(cS,bS)

if distance > cbDis:

distance = cbDis

dStr = bS

print('['+cS+'] --------> ['+dStr+']')

当然,很明显出来的结果不是想要的,出现了比如以下结果

[Palette] --------> [Pants]

[Lip Kits] --------> [Jumpsuits]

这是因为 Levenshtein 只是用文本距离来计算文本的相似度,并没有结合语意,比如

Palette 应该是对应 Painting 比较正确,但是单纯从字符串距离看,是Pants更接近

[Palette] ——–> [Pants] 4

[Palette] ——–> [Painting] 5

二、spaCy

因此需要换个思路,考虑语义,换用 spaCy 来尝试处理

1、安装

pip install -U spacy

2、下载英文模型

python -m spacy download en_core_web_lg

3、使用

import spacy

nlp = spacy.load('en_core_web_lg') # make sure to use larger model!

baseToken = ["Womens Clothing & Accessories"...]

checkToken = nlp("Palette")

maxMatch = 0

maxMatchStr = ''

for tokenStr in baseToken:

token = nlp(tokenStr)

match = token.similarity(checkToken)

print(tokenStr,'----->' ,match)

if match>maxMatch:

maxMatch = match

maxMatchStr = tokenStr

print ('['+maxMatchStr+']---->['+str(maxMatch)+']')

你可能感兴趣的:(字符串相似度匹配算法python_Python – 处理字符串相似度)