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

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

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

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

主要思路#

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

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

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

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

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

微軟為了開發(fā)者實現(xiàn)國際化語言的互轉(zhuǎn),提供了Microsoft Visual Studio International Pack,這個擴展包里面有中文、日文、韓文、英語等各國語言包,并提供方法實現(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)換的拼音組合中匹配,則認為匹配成功,為了后續(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ǔ)上稍作修改,詳細的思路及圖解可閱讀這篇博文。

高亮匹配的子串#

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

小結(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é)議進行許可。



該文章在 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)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(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

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲国产成在人网站天堂网 | 未发育女AV一区三区三区 | 日日噜噜噜夜夜爽爽国产 | 最新理论片在线观看免费 | 日韩动漫在线一区二区 | 日本中文字幕aⅴ精品看片 亚洲国产精品不卡Av在线 |