簡體   English   中英

在排序的單詞列表中搜索沒有變音符號的單詞

[英]Searching words without diacritics in a sorted list of words

我一直在試圖為以下問題提供有效的解決方案。 我有一個包含變音符號的單詞排序列表,我希望能夠不使用變音符號進行搜索。 例如,我只想使用“ kriz”來匹配“kříž”。 經過一番集思廣益后,我想出了以下幾點,我想問一下那些經驗更豐富(或更聰明)的人,這是最佳選擇還是更好的解決方案。 我正在使用Python,但問題是語言無關。

首先,我提供了具有變音兄弟姐妹的那些字符的映射。 因此,對於捷克語:

cz_map = {'a' : ('á',), ... 'e' : ('é', 'ě') ... }

現在,我可以輕松地在輸入中創建單詞的所有變體。 因此,對於“ lama”,我得到:['lama','láma','lamá','lámá']。 我已經可以使用它來搜索與任何排列組合匹配的單詞,但是當涉及到“ nepredvidatelny”(不可預測)之類的單詞時,可以得到13824個排列組合。 即使我的筆記本電腦上印有一個閃亮的Intel i5徽標,這對我來說還是太幼稚的解決方案。

這是我想出的一項改進。 我正在使用的單詞詞典具有二進制搜索的一種變體,用於前綴匹配(在具有匹配前綴的最低索引上返回一個單詞),在這種情況下非常有用。 我從第一個字符開始,在字典中搜索它的前綴存在,如果存在,我將其堆疊為下一個要測試的字符,並附加到所有這些堆疊的序列中。 這樣,我只傳播那些導致匹配的字符串。 這是代碼:

def dia_search(word, cmap, dictionary):
    prefixes = ['']
    for c in word:
        # each character maps to itself
        subchars = [c]
        # and some diacritical siblings if they exist
        if cmap.has_key(c):
            subchars += cmap[c]
        # build a list of matching prefixes for the next round
        prefixes = [p+s for s in subchars
                        for p in prefixes
                        if dictionary.psearch(p+s)>0]
    return prefixes

這項技術可以產生很好的效果,但是效果會更好嗎? 還是在這種情況下有不需要字符映射的技術? 我不確定這是否相關,但我使用的字典未按任何整理規則排序,因此序列為“ a”,“ z”,“á”而不是“ a”,“á”,“ z”如人們所料。

感謝所有評論。

編輯:我不能創建任何輔助的預先計算的數據庫,它將是原始數據庫的副本,但沒有變音符號。 假設原始數據庫太大,無法復制。

僅使用標准庫( str.maketransstr.translate ),您可以這樣做:

intab = "řížéě"  # ...add all the other characters
outtab = "rizee" # and the characters you want them translated to
transtab = str.maketrans(intab, outtab)

strg = "abc kříž def ";
print(strg.translate(transtab)) # abc kriz def 

這是針對python3的。

對於python 2,您需要:

from string import maketrans
transtab = maketrans(intab, outtab)
# the rest remains the same

看看Unidecode ,您可以使用它實際將變音符號轉換為最接近的ascii。 例如: unidecode(u'kříž')

如建議的那樣,您要做的是將unicode單詞(包含變音符號)轉換為最接近的標准24單詞字母版本。

一種實現方式是用相應的翻譯創建第二個單詞列表(與原始單詞大小相同)。 然后,您在翻譯后的列表中進行查詢,一旦找到匹配項,便在原始列表中查找對應的位置。

或者,如果您可以更改原始列表,則可以就地翻譯所有內容並刪除重復項。

暫無
暫無

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

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