2013-05-06 53 views
-1

我正在處理一個非常大的列表,大小約爲56,000個元素(所有字符串)。我試圖減少運行時間。基於列表中的第i個元素快速創建布爾數組

有一種方法以縮短此行: X = [INT(i的列表2),其中i在列表1]

給定字(list1的)和一些句子(列表2)的一些字典, 林試圖創建一個基於句子的二進制表示,如 [1,0,0,0,0,0,1 ........ 0]其中a 1表示字典中的第i個詞出現在句子中。

最快的方法是什麼?

示例數據:

dictionary = ['aardvark', 'apple','eat','I','like','maize','man','to','zebra', 'zed'] 
sentence = ['I', 'like', 'to', 'eat', apples'] 
result = [0,0,1,1,1,0,0,1,0,0] 
+0

請張貼一些樣本數據。 – 2013-05-06 07:09:53

+0

因此,句子列表包含「單詞」而不是句子。句子是空格分隔的字符串。 – 2013-05-06 07:28:23

+0

是的,我有超過10萬個句子,現在每個句子都代表一個包含它們的單詞列表。我現在需要將這些句子中的每一個表示爲布爾數組,其中在第i個索引處的布爾值爲1表示在該句子中存在我之前創建的詞義分析器中的第i個詞。 – user2353644 2013-05-06 07:36:25

回答

0

我會建議這樣的:

words = set(['hello','there']) #have the words available as a set 
sentance = ['hello','monkey','theres','there'] 
rep = [ 1 if w in words else 0 for w in sentance ] 
>>> 
[1, 0, 0, 1] 

因爲套有O(1)查找時間我會採取這種方法,是檢查是否wwords需要一定的時間。這導致列表理解爲O(n),因爲它必須訪問每個單詞一次。我相信這是接近或有效的,因爲你會得到。

您也提到創建「布爾」陣列,這將讓你只需改爲以下內容:

rep = [ w in words for w in sentance ] 
>>> 
[True, False, False, True] 
+0

OP正在迭代'單詞'並在'句子'列表中搜索,而'句子'列表中的項目不是'句子'。 – 2013-05-06 07:14:33

+0

不,OP正在對句子進行迭代,然後基於句子中的每個詞創建句子的表示,無論是否在單詞詞典中。 「**其中1表示字典中的第i個詞出現在句子中。**」 – HennyH 2013-05-06 07:16:33

+0

感謝您的幫助,我一定會執行集合。不幸的是,我仍然需要應用這個列表超過10萬次,因爲我有100,000個句子。我試圖看看是否有一個聰明的numpy方式,我可以將類似於這個列表comp的東西應用於句子矩陣,其中每一行都是一個句子 – user2353644 2013-05-06 07:18:29

0

使用sets,總的時間複雜O(N)

>>> sentence = ['I', 'like', 'to', 'eat', 'apples'] 
>>> dictionary = ['aardvark', 'apple','eat','I','like','maize','man','to','zebra', 'zed'] 
>>> s= set(sentence) 
>>> [int(word in s) for word in dictionary] 
[0, 0, 1, 1, 1, 0, 0, 1, 0, 0] 

如果你的句子列表中包含實際的句子不言那就試試這個:

>>> sentences= ["foobar foo", "spam eggs" ,"monty python"] 
>>> words=["foo", "oof", "bar", "pyth" ,"spam"] 
>>> from itertools import chain 

# fetch words from each sentence and create a flattened set of all words 
>>> s = set(chain(*(x.split() for x in sentences))) 

>>> [int(x in s) for x in words] 
[1, 0, 0, 0, 1] 
1
set2 = set(list2) 
x = [int(i in set2) for i in list1] 
+0

你不能使用這個在''hello world''中搜索''hello'''。 – 2013-05-06 07:22:58

+0

@AshwiniChaudhary,我的解釋是,list2是來自句子的單詞列表。 – 2013-05-06 07:24:15

+0

你的解釋是非常正確的,他的名單包含簡單的單詞而不是句子。 – 2013-05-06 07:46:40

相關問題