簡體   English   中英

C#中部分詞的搜索算法

[英]Search algorithm for partial words in C#

我目前正在尋找一種在C#中實現部分單詞模式算法的方法。 我所處的情況如下所示:

我有一個搜索模式的文本字段。 每次用戶在此字段中輸入或刪除一個字符時,都會觸發一個事件,該事件將重新運行搜索算法。 因此,如果我想在字符串中搜索“ face”一詞,例如

“ Facebook”,“ Facelifting”,“ Faceless Face”(無論應該是什么)或通常在任何現實生活中以字符串形式出現的句子,

該算法將在該字段中鍵入“ f”時首先開始運行。 然后,它在字符串所在的列表的頂部顯示最相關的字符串。第二次運行時,鍵入“ fa”,然后再次對列表進行排序。 一直進行到在文本字段中完全鍵入“ face”並再次對列表進行排序為止。

但是我不知道可以使用什么算法。 我嘗試了Alain的答案( 獲取最接近的字符串匹配 ),一個簡單的Levenshtein-Distance算法以及一個自制算法,該算法通過

priority = (length_of_typed_pattern) * (amount_of_substr_matches)

在C#中,后者看起來像這樣:

count = Regex.Matches(Regex.Escape(title), pattern).Count;
priority = pattern.Length * count;

模式和標題僅由小寫字母組成。 到目前為止,我的結論是:

  • 漢明距離沒有任何意義,因為大多數情況下弦的長度不同
  • Alain的答案很好用,但前提是至少有一個單詞完全匹配(只有當至少一個單詞與模式相等時,您才找到最相關的字符串/句子,因此,如果您鍵入“ face”並且其中包含一個字符串單詞“ facebook”,包含“ facebook”的字符串幾乎從來都不是最高優先級

我還能嘗試其他什么想法? 目標是盡早(以最少的字母)對字符串列表進行最佳排序。

您可以在Sprung / WindowMatcher.cs和Sprung / Window.cs中http://github.com/croemheld/sprung上的存儲庫的search- *分支中查看我的實現。

謝謝你的幫助。

首先,您需要在某個地方存儲與字符串相關的頻率(搜索特定字符串的次數),以便在搜索時顯示最相關的頻率。 如果您需要說出k個最相關的條目,那么可以實現大小為“ k”的最小堆。

情況1-如果是第一次按下字母:

步驟(a)從數據庫或字典中讀取所有字符串,並將其存儲在某個FLAG_VALID(最初設置為1)的數據結構中(說DS1),這表明它對於當前搜索字符(對於第一個字母)是有效的字符串所有字符串都是有效的)。 當您閱讀字符串時,請根據其頻率填充“最小堆”,並且只有當其頻率大於最小頻率(即“最小堆”的第一個元素)時,才會插入具有特定頻率的元素。

步驟(b)(此步驟在所有情況下都相同,以顯示結果)要顯示結果,您需要以與“最小堆”相反的順序顯示元素,即“最小堆”中的第一個元素的優先級最低,因此基本上我們需要刪除所有元素並從最后到第一顯示它。 注意:-Min Heap將包含對特定字符串的引用,因此可以同時訪問該字符串及其頻率。

情況2-在搜索框中插入下一個字母:

步驟(a)在所有字符串都存在的DS1中進行搜索,然后首先檢查FLAG_VALID。 如果它是有效字符串,則比較來自搜索框的字符串和來自DS1的字符串。 相應地設置標志(如果它是match-1或not-0),並填充k-Min Heap,因為從上次搜索開始它是空的,如案例1所示。

步驟(b)與往常一樣。

情況3:在搜索框中刪除字母:

這與上述情況類似,但是這次我們將需要搜索FALG_VALID為0的字符串(即無效的字符串)。

這是一種粗略的搜索方法,可以使用某些數據結構和調整算法進行改進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM