2016-08-12 56 views
1

這與previous question非常相關,但我在適應我的使用情況時遇到困難。根據條件從已有的條件創建新的令牌和元組

我有一句話:"Forbes Asia 200 Best Under 500 Billion 2011"

我有這樣的標記:

oldTokens = [u'Forbes', u'Asia', u'200', u'Best', u'Under', u'500', u'Billion', u'2011'] 

和以往進行的解析器已經想通了,那裏應該是位置或時隙數的指標:

numberTokenIDs = {(7,): 2011.0, (2,): 200.0, (5,6): 500000000000.00} 
locationTokenIDs = {(0, 1): u'Forbes Asia'} 

令牌ID對應於有位置或數字的令牌索引,目標是獲得一組新的令牌,如:

newTokens = [u'ForbesAsia', u'200', u'Best', u'Under', u'500Billion', u'2011'] 

有了新的數量和位置tokenIDs也許像(避免索引越界異常):

numberTokenIDs = {(5,): 2011.0, (1,): 200.0, (4,): 500000000000.00} 
locationTokenIDs = {(0,): u'Forbes Asia'} 

基本上我想經過標記的新的,減小集,並且能夠通過通過新的令牌集的打算,並與eith更換正確tokenID

"LOCATION_SLOT NUMBER_SLOT Best Under NUMBER_SLOT NUMBER_SLOT"

:最終創造出所謂的新句子er LOCATION_SLOTNUMBER_SLOT。如果我這樣做是與當前設定的數量和位置標記ID的,我會得到:

"LOCATION_SLOT LOCATION_SLOT NUMBER_SLOT Best Under NUMBER_SLOT NUMBER_SLOT NUMBER_SLOT".

我將如何做到這一點?

另一個例子是:

Location token IDs are: (0, 1) 
Number token IDs are: (3, 4) 

老sampleTokens [u'United', u'Kingdom', u'USD', u'1.240', u'billion']

我想要的都刪除標記,改變位置和數量令牌的ID,以便能夠更換一句話:

sampleTokens[numberTokenID] = "NUMBER_SLOT" 
sampleTokens[locationTokenID] = "LOCATION_SLOT" 

這樣替換的令牌是[u'LOCATION_SLOT', u'USD', u'NUMBER_SLOT']

注意,如果有多個元組時,串聯應該連接元組中的所有值(也是元組也可以包含> 2個元素,例如The United States of America)。

回答

1

這應該工作(如果我理解正確的):

token_by_index = dict(enumerate(oldTokens)) 
groups = numberTokenIDs.keys() + locationTokenIDs.keys() 
for group in groups: 
    token_by_index[group[0]] = ''.join(token_by_index.pop(index) 
             for index in group) 
newTokens = [token for _, token in sorted(token_by_index.items(), 
              key=lambda (index, _): index)] 

找到新的令牌標識:

new_index_by_token = dict(map(lambda (i, t): (t, i), enumerate(newTokens)) 
numberTokenIDs = {(new_index_by_token[token_by_index[group[0]]],): value 
        for group, value in numberTokenIDs.items()} 
locationTokenIDs = {(new_index_by_token[token_by_index[group[0]]],): value 
        for group, value in locationTokenIDs.items()} 
+0

如何返回新的數量和位置tokenIDs匹配這些新的令牌?例如'numberTokenIDs = {(5,):2011.0,(1,):200.0,(4,):500000000000.00}' –

+0

我已更新答案 – ploutch