惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
V
V2EX
Engineering at Meta
Engineering at Meta
美团技术团队
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 司徒正美
I
InfoQ
S
SegmentFault 最新的问题
博客园 - 叶小钗
N
Netflix TechBlog - Medium
Y
Y Combinator Blog
IT之家
IT之家
博客园 - Franky
大猫的无限游戏
大猫的无限游戏
人人都是产品经理
人人都是产品经理
T
The Blog of Author Tim Ferriss
月光博客
月光博客
The Cloudflare Blog
U
Unit 42
GbyAI
GbyAI
L
LangChain Blog
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - andy.wu

聊聊除了生产率之外的东西,比如赚钱效率 一些需要解决的问题(Win32) svn howto: svn合并时报错:retrieval of mergeinfo unsupported by 。 Windows Mobile应用开发(1):使用Win32 SDK 开发屏幕手电程序 vs(2005 and 2008)中使用vc++创建智能设备项目失败的正确解决方案 思考:google的opensocial的实现原理 思考:日期类型的数据应该用什么样的具体形式存储到数据库? google got crazy!!! EnableViewState详细分析 - andy.wu - 博客园 NHibernate Tips: 要注意模型与数据库在Null方面的匹配 AjaxPro基础知识 and FAQ 在iis 6中使用共享目录作为虚拟目录 初学wpf感想 Sql Server 2005全文检索中碰到的问题和分析 asp.net faq: 在html文件中,用js获取session? 给博客园首页管理的建议 china-pub,当当,卓越购书经验谈 使用Emacs代替Windows下的Command shell 经验:使用.net 2.0中的TransactionScope碰到的问题
一次思维锻炼,使用拼音模糊匹配中文 - andy.wu - 博客园
andy.wu · 2009-05-31 · via 博客园 - andy.wu

Outlook的联系人查找,不支持用拼音的模糊查找,于是自己想实现一个。需求如下:

要求

允许模糊音,比如(zh,z),(ing, in)

允许每个字的模糊匹配,字之间不能用空格

比如:

字符串"Nokia客户服务中心",先拆开成拼音为:Nokia Ke Hu Fu Wu Zhong Xing ,拼音的总长为22

每个字再拆开后,表示为下表(第一行是标题),注意空也算一个字的组合之一

标题

Nokia

1

n

k

h

f

w

z

x

2

no

ke

hu

fu

wu

zo

xi

3

nok

    

zon

xin

4

noki

    

zong

xing

5

nokia

    

zh

 

6

     

zho

 

7

     

zhon

 

8

     

zhong

 

合计

6

3

3

3

3

9

5

目标:使用所有字的任意组合,都能匹配到字符串Nokia客户服务中心。也就是说有 6 * 3 * 3 * 3 * 3 * 9 * 5 = 21870种组合可以匹配,每一种组合会有相应的权重,计算公式为:

权重(组合串) = 组合串的长度 / 拼音的总长度

可能表达的不是很清楚,以下随意举例可能的匹配(以*间隔是为了说明,实际输入时不应该有*)

组合串

组合串的长度

组合串的权重

n*ke*h*f*wu*zho*xi

12

12 / 22

nok*k*hu*f*w*z*x

10

10 / 22

n*k*h*f*w*z*x

7

7 / 22

本以为不难,但真的做起来发现算法的效率是个大问题,一开始没有仔细想,就是简单的把所有组合作了散列,一运行发现在散列时相当慢,仔细一看才发现有些联系人的组合数量是相当惊人,比如举的例子,达到了21870种。

说来惭愧,对数据结构和算法实在是不济,一时间就想不出复杂度在O(1)或O(log n)的算法。在此抛砖引玉,希望和大家讨论。

========这是无敌的分割线=============

以下是做这个事情过程中的一些工具代码,很简单,与大家分享

  1. 汉字转拼音

程序很简单,就是使用码表,因为只是作为工具,我没有做任何优化。

下载ChineseSpell.cs