狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

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

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

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

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

主要思路#

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

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

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

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

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

微軟為了開發(fā)者實(shí)現(xiàn)國(guó)際化語(yǔ)言的互轉(zhuǎn),提供了Microsoft Visual Studio International Pack,這個(gè)擴(kuò)展包里面有中文、日文、韓文、英語(yǔ)等各國(guó)語(yǔ)言包,并提供方法實(shí)現(xiàn)互轉(zhuǎn)、獲取拼音、獲取字?jǐn)?shù)、甚至獲取筆畫數(shù)等等。下載Microsoft Visual Studio International Pack 1.0 SR1安裝后,在安裝目錄中找到ChnCharInfo.dll,然后在項(xiàng)目中添加引用。
ChnCharInfo.dll獲取漢字的拼音時(shí)只能傳入單個(gè)字符,因此只能把漢字字符串拆分成一個(gè)個(gè)字符處理,由于漢字存在多音字情況以及缺少語(yǔ)義信息,獲取的拼音組合可能是多個(gè),例如輸入長(zhǎng)江,返回的是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ù)高亮顯示,需要記錄下匹配的起始位置以及匹配的子串長(zhǎng)度。代碼如下:

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ǎng)度以及高亮顏色。前面拼音匹配算法中獲取了匹配成功子串的起始位置和長(zhǎng)度,也正是為此做準(zhǔn)備。之前在WPF使用TextBlock實(shí)現(xiàn)查找結(jié)果高亮顯示一文中有詳細(xì)介紹思路和代碼,此處不再贅述。

小結(jié)#

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

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

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

代碼示例#

ChinesePhoneticizeFuzzyMatch

作者:czwy

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

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



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