2014-01-07 106 views
0

已被編碼爲整數,我通過DictVectorizer(0.14)運行字典有特定的分類值的列表:DictVectorizer識別功能作爲字符串

> dictionary_list[0:2] 

日期:

[{u'Life': 3377, u'SerumX': 1015, u'duration': 3, u'gene_name': 37}, 
{u'Life': 11655, u'SerumX': 1913, u'duration': 3, u'gene_name': 1}] 

vec = DictVectorizer(sparse=False)
X = vec.fit_transform(dictionary_list)

例如,基因APC,AXIN1,BLM可以通過一些任意方法編碼爲37,1,15。也就是說,這些數字是不是有些NLP表達式中的字符/ n元語法等

我目前正在更新此名單爲重點「gene_name」值轉換從int到海峽內http://stardict.sourceforge.net/Dictionaries.php下載:

for dicts in dictionary_list: 
    dicts.update((k, str(v)) for k, v in dicts.iteritems() if k == 'gene_name') 

> dictionary_list[0:2] 

輸出:

[{u'Life': 3377, u'SerumX': 1015, u'duration': 3, u'gene_name': '37'}, 
{u'Life': 11655, u'SerumX': 1913, u'duration': 3, u'gene_name': '1'}] 

我期待優化速度,避免在通過DictVectorizer傳遞之前更新字典。我很好奇,如果有一種方法可以將我的列表傳遞給DictVectorizer,我可以通過這種方式將'gene_name'的值強制爲一個字符串來利用內置的編碼。

非常感謝scikit-learn團隊的出色工作。

+0

我不確定你的意思。數據最初的樣子是什麼? –

+0

謝謝@larsmans,我剛剛編輯了這個問題。 – KLDavenport

回答

2

我想你可以加快速度一點,如果你改變你的代碼,類似

for dct in dictionary_list: 
    if 'gene_name' in dct: 
     dct['gene_name'] = str(dct['gene_name']) 

我認爲你不能強迫從值的字符串脫身,因爲DictVectorizer使用isinstance(value, six.string_types)作爲條件來篩選提供數據中的分類值。

+0

感謝您的幫助和耐心。我將考慮對sklearn作出貢獻,以添加有關強制將特定列數組作爲字符串的功能。 – KLDavenport

1

如果我理解你的代碼的權利,你循環所有的關鍵,看看他們之一是否"gene_name"我猜你正在這樣做,因爲不是所有的字典可能有這個關鍵。

如果你做的事:

for dic in records_list: 
    if 'gene_name' in dic: 
     dic.update({ 'gene_name' , str(dic['gene_name']) }) 

你只能訪問你想改變的關鍵。

+0

嘿麥哲倫,我相信你所提供的和我上面分享的列表理解一樣。我只是編輯了我的問題,以幫助澄清。謝謝你的努力。 – KLDavenport

+0

@KLDavenport而等價,這個答案中的代碼應該比你的答案更有效。 – alko

+0

原諒我的無知,但我很難看出差異,我也在做一個,如果說明正確嗎? – KLDavenport