短词匹配:拼音相似度
本文方法适用于信收场景,尤其待收集信息点是专业名词的情况,本文实验了两种拼音匹配方法,包括不带声调版本和带声调版本。
本文内容参考 短词匹配:拼音相似度
短词-不带声调拼音
test_words = ['路易威登SPIN TIME', '路易·威登', '克里斯汀·迪奥', '古驰', '路易威登TAMBOUR', 'LV Lagoon', 'LV Trainer', '路易威登 Virgil Abloh', 'Louis Vuitton Monogram', '古琦', '爱马仕']from pypinyin import *
import repattern = r"(\.|\·|\+|\-|\:|\(|\))"for wd in test_words:py = lazy_pinyin(wd)py_ = [re.sub(pattern, '', i, flags=re.DOTALL).replace(' ', '').lower() for i in py]print(wd, py, ''.join(py_))# 路易威登SPIN TIME ['lu', 'yi', 'wei', 'deng', 'SPIN TIME'] luyiweidengspintime
# 路易·威登 ['lu', 'yi', '·', 'wei', 'deng'] luyiweideng
# 克里斯汀·迪奥 ['ke', 'li', 'si', 'ting', '·', 'di', 'ao'] kelisitingdiao
# 古驰 ['gu', 'chi'] guchi
# 路易威登TAMBOUR ['lu', 'yi', 'wei', 'deng', 'TAMBOUR'] luyiweidengtambour
# LV Lagoon ['LV Lagoon'] lvlagoon
# LV Trainer ['LV Trainer'] lvtrainer
# 路易威登 Virgil Abloh ['lu', 'yi', 'wei', 'deng', ' Virgil Abloh'] luyiweidengvirgilabloh
# Louis Vuitton Monogram ['Louis Vuitton Monogram'] louisvuittonmonogram
# 古琦 ['gu', 'qi'] guqi
# 爱马仕 ['ai', 'ma', 'shi'] aimashi
短词-带音调拼音
from xpinyin import Pinyin
p = Pinyin()for wd in test_words:s = p.get_pinyin(wd, ',', tone_marks='numbers')s_ = s.split(',')py_ = [re.sub(pattern, '', i, flags=re.DOTALL).replace(' ', '').lower() for i in s_]print(wd, ' *** ', ''.join(py_))# 路易威登SPIN TIME *** lu4yi4wei1deng1spintime
# 路易·威登 *** lu4yi4wei1deng1
# 克里斯汀·迪奥 *** ke4li3si1ting1di2ao4
# 古驰 *** gu3chi2
# 路易威登TAMBOUR *** lu4yi4wei1deng1tambour
# LV Lagoon *** lvlagoon
# LV Trainer *** lvtrainer
# 路易威登 Virgil Abloh *** lu4yi4wei1deng1virgilabloh
# Louis Vuitton Monogram *** louisvuittonmonogram
# 古琦 *** gu3qi2
# 爱马仕 *** ai4ma3shi4
基于编辑距离和拼音匹配
相关函数参考 短词匹配:拼音相似度
(1.)带音调匹配
query = '路一威登'most_sim_word = ''
min_dist = 999
for wd in test_words:dist = getEditDistance_hastone(query, wd)if dist <= min_dist:most_sim_word = wdmin_dist = distprint('当前相似度匹配次: {}, 与query: {} 的相似度 {}'.format(wd, query, dist) )
print(most_sim_word, min_dist)# 当前相似度匹配次: 路易威登SPIN TIME, 与query: 路一威登 的相似度 9
# 当前相似度匹配次: 路易·威登, 与query: 路一威登 的相似度 1
# 当前相似度匹配次: 克里斯汀·迪奥, 与query: 路一威登 的相似度 14
# 当前相似度匹配次: 古驰, 与query: 路一威登 的相似度 13
# 当前相似度匹配次: 路易威登TAMBOUR, 与query: 路一威登 的相似度 8
# 当前相似度匹配次: LV Lagoon, 与query: 路一威登 的相似度 13
# 当前相似度匹配次: LV Trainer, 与query: 路一威登 的相似度 12
# 当前相似度匹配次: 路易威登 Virgil Abloh, 与query: 路一威登 的相似度 12
# 当前相似度匹配次: Louis Vuitton Monogram, 与query: 路一威登 的相似度 16
# 当前相似度匹配次: 古琦, 与query: 路一威登 的相似度 13
# 当前相似度匹配次: 爱马仕, 与query: 路一威登 的相似度 13
# 路易·威登 1
(2.)不带音调匹配
query = '路一威登'most_sim_word = ''
min_dist = 999
for wd in test_words:dist = getEditDistance_notone(query, wd)if dist <= min_dist:most_sim_word = wdmin_dist = distprint('当前相似度匹配次: {}, 与query: {} 的相似度 {}'.format(wd, query, dist) )
print(most_sim_word, min_dist)# 当前相似度匹配次: 路易威登SPIN TIME, 与query: 路一威登 的相似度 8
# 当前相似度匹配次: 路易·威登, 与query: 路一威登 的相似度 0
# 当前相似度匹配次: 克里斯汀·迪奥, 与query: 路一威登 的相似度 11
# 当前相似度匹配次: 古驰, 与query: 路一威登 的相似度 9
# 当前相似度匹配次: 路易威登TAMBOUR, 与query: 路一威登 的相似度 7
# 当前相似度匹配次: LV Lagoon, 与query: 路一威登 的相似度 9
# 当前相似度匹配次: LV Trainer, 与query: 路一威登 的相似度 8
# 当前相似度匹配次: 路易威登 Virgil Abloh, 与query: 路一威登 的相似度 11
# 当前相似度匹配次: Louis Vuitton Monogram, 与query: 路一威登 的相似度 15
# 当前相似度匹配次: 古琦, 与query: 路一威登 的相似度 9
# 当前相似度匹配次: 爱马仕, 与query: 路一威登 的相似度 10
# 路易·威登 0