我有一个语料库,它已经被句子标记化并且被单词标记化。在python中工作时,我使用了9,999个最常用的单词并用特殊的'UNK'替换了词汇单词,因此我有一个10,000字的词汇表和一个python字典'word_to_index',它将每个单词映射为整数。
我想要一个二进制词袋表示,其中每个原始句子的表示是一个10,000维的numpy向量0s和1s。如果词汇表中的单词 i 在句子中,则numpy数组中的索引[ i ]将为1;否则,一个0.到现在为止,我一直在使用以下代码:
def bag_of_words(sent, vocab_length, word_to_index):
words = []
rep = np.zeros(vocab_length)
for w in sent:
if w not in words:
rep += np.eye(vocab_length)[word_to_index[w]]
words.append(w)
return rep
def get_bag_of_words_corpus(corpus, vocab_length, word_to_index):
return np.array([bag_of_words(sent, vocab_length, word_to_index) for sent in corpus])
问题在于,对于每个句子,创建numpy向量需要将近1秒。看到我的语料库是12.2 M的句子,我宁愿不等待~4.7个月来处理它。任何人都可以给我任何关于加快这段代码的建议。我想过尝试一种更聪明的哈希技术,但我不确定这会给我带来的改进。
答案 0 :(得分:0)
为什么要创建一个完整的眼睛阵列?
简单地做
for w in sent:
if w not in words:
ind=word_to_index[w]
rep[ind]+=1
#rep += np.eye(vocab_length)[word_to_index[w]]
words.append(w)
您还可以尝试将句子转换为sets.Set以消除重复。
您还应该使用sets.Set作为单词,因为如果您使用Set,in
函数将在O(1)
中运行。