2015-07-05 19 views
1

在字符串數組中替換複合詞的最有效方法是什麼?有效地替換標記化的字符串數組中的複合詞。 Python

text = ['San', 'Francisco', 'is', 'foggy', '.','Viva', 'Las', 'Vegas','.'] 


replacements = {'san_francisco':['San Francisco'], 
       'las_vegas': ['Las Vegas'], 
       } 

text2= ' '.join(text) 

for key, value in replacements.items(): 
    text2=text2.replace(value[0],key) 

final=text2.split(' ') 

print(final) 

因此,此方法重建整個字符串,通過字典循環並替換文本。崇高的文字表明這需要0.2s。有沒有更有效的方法來做到這一點?

+0

對我來說它顯示0.0 s –

+0

@AvinashRaj它不同於計算機。在「Cython」之前是否有避免循環的方法? – ccsv

+0

「複合詞」的長度總是兩個單詞還是可以更長? –

回答

0

我還沒有在一個較大的數據集中描述它,但這可能會更有效。你的解決方案中的很多「重負」都是通過replace方法完成的,所以無論哪種方式更有效率都將很大程度上取決於cPython方法的優化方式(即他們可能會使用一些巧妙的技巧使其運行速度非常快) 。

text = ['San', 'Francisco', 'is', 'foggy', '.','Viva', 'Las', 'Vegas','.', "wild", "wild", "west"] 

replacements = { 
'San': {'Francisco': 'san_francisco'}, 
'Las': {'Vegas': 'las_vegas'}, 
'wild': {'wild': {'west': 'wild_wild_west'}} 
} 

for i in range(0, len(text)-1): 

    if text[i] is None: 
     continue 

    replacement_value = replacements.get(text[i]) 
    if replacement_value is None:. 
     continue 

    number_of_items_to_delete = 0 
    while isinstance(replacement_value, dict): 
     number_of_items_to_delete += 1 
     replacement_value = replacement_value.get(text[i + number_of_items_to_delete]) 

    text[i] = replacement_value 

    for j in range(i+1, i+1 + number_of_items_to_delete): 
     text[j] = None 

text = [n for n in text if n is not None] 
print (text) 

現在我們使用一個嵌套字典作爲查找表。注意我已經「翻轉」了查找表,以便該鍵來自單詞列表中的值,我們希望在表格中查找替換值。

  • 遍歷單詞列表:

    該算法可以被描述如下。

  • 如果在查找表中找到給定的單詞,請在查找表中查找其值。如果該值是另一個字典,請檢查單詞列表中的下一個單詞是否在我們剛纔檢索的嵌套字典中。跟蹤我們正在查看的列表中有多少單詞。
  • 當在查找表中檢索到的項目不再是字典時(當我們找到實際替換字符串時),我們用替換字符串替換當前字詞。然後,無論前進多少單詞,我們都希望查找表的末尾,我們用None
  • 替換這些索引。一旦我們正在進行迭代,然後我們從單詞列表中刪除所有「無」的實例。