公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

WPF 脫機(jī)環(huán)境實現(xiàn)支持拼音模糊搜索的AutoCompleteBox

freeflydom
2024年10月15日 8:40 本文熱度 1221

AutoCompleteBox是一個常見的提高輸入效率的組件,很多WPF的第三方控件庫都提供了這個組件,但基本都是字符串的子串匹配,不支持拼音模糊匹配,例如無法通過輸入ldhliudehua匹配到劉德華。要實現(xiàn)拼音模糊搜索功能,通常會采用分詞、數(shù)據(jù)庫等技術(shù)對待匹配數(shù)據(jù)集進(jìn)行預(yù)處理。某些場景受制于條件限制,無法對數(shù)據(jù)進(jìn)行預(yù)處理,本文將介紹在這種情況下如何實現(xiàn)支持拼音模糊搜索的AutoCompleteBox,先來看下實現(xiàn)效果。

主要思路#

WPF中并沒有AutoCompleteBox控件,我們可以使用TextBox輸入搜索內(nèi)容,用Popup+ListBox顯示匹配到的提示內(nèi)容。拼音模糊匹配漢字則采用字符串匹配的方式來解決,也就是搜索字符串和待匹配數(shù)據(jù)集的內(nèi)容全部轉(zhuǎn)換為拼音字符串,然后進(jìn)行子串匹配。這里有三個問題需要解決。

  1. 漢字轉(zhuǎn)換為拼音。

  2. 拼音如何匹配。 例如ldhlidhldhualiudehuadhuahua等都能匹配到劉德華

  3. 匹配后的內(nèi)容高亮顯示。 當(dāng)輸入dhua匹配到劉德華時需要把德華兩個字高亮。

漢字轉(zhuǎn)換拼音#

微軟為了開發(fā)者實現(xiàn)國際化語言的互轉(zhuǎn),提供了Microsoft Visual Studio International Pack,這個擴(kuò)展包里面有中文、日文、韓文、英語等各國語言包,并提供方法實現(xiàn)互轉(zhuǎn)、獲取拼音、獲取字?jǐn)?shù)、甚至獲取筆畫數(shù)等等。下載Microsoft Visual Studio International Pack 1.0 SR1安裝后,在安裝目錄中找到ChnCharInfo.dll,然后在項目中添加引用。
ChnCharInfo.dll獲取漢字的拼音時只能傳入單個字符,因此只能把漢字字符串拆分成一個個字符處理,由于漢字存在多音字情況以及缺少語義信息,獲取的拼音組合可能是多個,例如輸入長江,返回的是changjiangzhangjiang。漢字轉(zhuǎn)拼音的方法如下:

/// <summary>/// 獲取漢字拼音/// </summary>/// <param name="str">待處理包含漢字的字符串</param>/// <param name="split">拼音分隔符</param>/// <returns></returns>public static List<string> GetChinesePhoneticize(string str, string split = ""){
    List<string> result = new List<string>();
    char[] chs = str.ToCharArray();
    Dictionary<int, List<string>> totalPhoneticizes = new Dictionary<int, List<string>>();
    for (int i = 0; i < chs.Length; i++)
    {
        var phoneticizes = new List<string>();
        if (ChineseChar.IsValidChar(chs[i]))
        {
            ChineseChar cc = new ChineseChar(chs[i]);
            phoneticizes.AddRange(cc.Pinyins.Where(r => !string.IsNullOrWhiteSpace(r)).ToList<string>().ConvertAll(p => Regex.Replace(p, @"\d", "").ToLower()).Distinct());
        }
        else
        {
            phoneticizes.Add(chs[i].ToString());
        }
        if (phoneticizes.Any())
            totalPhoneticizes[i] = phoneticizes;
    }
    foreach (var phoneticizes in totalPhoneticizes)
    {
        var items = phoneticizes.Value;
        if (result.Count <= 0)
        {
            result = items;
        }
        else
        {
            var newtotalPhoneticizes = new List<string>();
            foreach (var totalPingYin in result)
            {
                newtotalPhoneticizes.AddRange(items.Select(item => totalPingYin + split + item));
            }
            newtotalPhoneticizes = newtotalPhoneticizes.Distinct().ToList();
            result = newtotalPhoneticizes;
        }
    }
    return result;
}

拼音匹配算法#

漢字轉(zhuǎn)換后的拼音字符串有多組,只要搜索字符串轉(zhuǎn)換的拼音組合有一組與待匹配字符串轉(zhuǎn)換的拼音組合中匹配,則認(rèn)為匹配成功,為了后續(xù)高亮顯示,需要記錄下匹配的起始位置以及匹配的子串長度。代碼如下:

public static bool fuzzyMatchChar(string character, string input, out int matchStart, out int matchCount){
    List<string> regexs = GetChinesePhoneticize(input);
    List<string> targetStr = GetChinesePhoneticize(character, " ");
    matchStart = -1;
    matchCount = 0;
    foreach (string regex in regexs)
    {
        foreach (string target in targetStr)
        {
            if (PhoneticizeMatch(regex, target.Split(' '), out matchStart, out matchCount))
                return true;
        }
    }
    return false;
}

這里的PhoneticizeMatch方法是拼音匹配算法的核心,是在【算法】拼音匹配算法這篇博文中算法的基礎(chǔ)上稍作修改,詳細(xì)的思路及圖解可閱讀這篇博文。

高亮匹配的子串#

WPF中可以通過TextEffectPositionStartPositionCount以及Foreground屬性設(shè)置字符串中需要高亮內(nèi)容的起始位置、長度以及高亮顏色。前面拼音匹配算法中獲取了匹配成功子串的起始位置和長度,也正是為此做準(zhǔn)備。之前在WPF使用TextBlock實現(xiàn)查找結(jié)果高亮顯示一文中有詳細(xì)介紹思路和代碼,此處不再贅述。

小結(jié)#

本文介紹了在不依賴數(shù)據(jù)庫及分詞的情況下如何實現(xiàn)拼音模糊搜索并在目標(biāo)字符串中高亮顯示,方法中也存在諸多不足需要完善的地方。

  1. 匹配策略存在誤匹配。例如輸入,可以匹配出拼音為shi的所有漢字。

  2. 匹配算法效率不夠高。測試過程中,待匹配數(shù)據(jù)集中模擬了500條數(shù)據(jù),匹配耗時大概在400~500ms左右。

代碼示例#

ChinesePhoneticizeFuzzyMatch

作者:czwy

出處:https://www.cnblogs.com/czwy/p/18321646

版權(quán):本作品采用「署名-相同方式共享 4.0 國際」許可協(xié)議進(jìn)行許可。



該文章在 2024/10/15 9:02:38 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产午夜片无码区在线观看爱情网 | 国产字幕无码avbb | 国产91精品白浆无码流出久久 | 2025国产精品每日更新在线 | 国产午夜福利不卡在线观看视频 | 国产精品美女久久福利网站 | 国产女人喷潮视频 | 国产精彩对白一区二区 | 国产成人一区二区三区高清 | 成人a级视频在 | 精品无人区麻豆乱码1区2区新区 | 国产精品一区二区四区 | 国产欧美日韩在线中文一区 | 爆乳一区二区无码 | 岛国在线观看无码不卡 | 国产边按摩边被躁在线播放 | 国产一二三区视频肉精品 | 国产精品成人观看视频免费 | av在线免费观看 | 国产偷摄中国推油按摩富婆 | 国产午夜精品无码一区二区 | 成人国产精品秘久久久 | 2025国产在线观看不卡视频 | 成人一区欧美高清夜夜片a 成人一区三区 | 91在线无码精品秘在线观看 | 国产欧美日韩制服在线精选推荐 | 成人av片国产 | 精品国产99久久久久久www | 国产人妖一区二区动漫黄片 | 成人欧美一区二区三 | 成人a级毛片无码免费 | 99久久无码一区人妻 | 国产一区二区三区精品在线观看 | 69久久久a片无码国产精 | 精品国产三级av一区二区三区 | 国产精品高清无码在线观看 | 国产免费拍福利短视频 | 国产寡妇树林野战在线播放 | 国产精品无码污污污免费网站 | 2025国产在线拍揄 | 国产成人免费 |