在python中创建一个词袋矢量的快速方法

时间:2016-05-19 16:49:05

标签: python arrays numpy

我有一个语料库,它已经被句子标记化并且被单词标记化。在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个月来处理它。任何人都可以给我任何关于加快这段代码的建议。我想过尝试一种更聪明的哈希技术,但我不确定这会给我带来的改进。

1 个答案:

答案 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)中运行。

Source