Python:有效地实现特征向量

时间:2011-04-12 23:33:59

标签: python hash dictionary

我正在将特征向量实现为语料库中文档的位图。我已经拥有整个语料库的词汇表(作为列表/集合)和每个文档中的术语列表。

例如,如果语料库词汇表为['a', 'b', 'c', 'd']且文档d1中的术语为['a', 'b', 'd', 'd'],则d1的要素向量应为[1, 1, 0, 2]

要生成特征向量,我将迭代语料库词汇表并检查每个术语是否在文档术语列表中,然后将该位置于文档特征向量中的正确位置。

实现这一目标的最有效方法是什么?以下是我考虑过的一些事情:

  • 使用set会使检查词汇成员资格非常有效,但set没有排序,并且要素向量位需要按排序语料库词汇表的顺序排列。
  • dict用于语料库词汇(将每个词汇术语映射到任意值,如1)将允许迭代sorted(dict.keys()),以便我可以跟踪索引。但是,我的空间开销为dict.values()
  • 使用sorted(list)检查会员资格效率不高。

StackOverflow会建议什么?

1 个答案:

答案 0 :(得分:2)

我认为最有效的方法是循环遍历每个文档的术语,在(已排序的)语料库中获取术语的位置并相应地设置该位。

排序的语料库术语列表可以存储为具有term -> index映射的字典(基本上是inverted index)。

您可以这样创建:

corpus = dict(((term, index) for index, term in enumerate(sorted(all_words))))

对于每个文档,您必须生成0的列表作为特征向量:

num_words = len(corpus)
fvs = [[0]*num_words for _ in docs]

然后构建特征向量将是:

for i, doc_terms in enumerate(docs):
    fv = fvs[i]
    for term in doc_terms:
        fv[corpus[term]] += 1

测试成员资格没有任何开销,您只需循环遍历所有文档的所有条款。


所有人都说,根据语料库的大小,你应该看看numpyscipy。很可能会遇到内存问题,而scipy为sparse matrices提供了特殊的数据类型(而不是使用列表列表),可以节省很多的内存。
您可以使用与上面所示相同的方法,但不是将数字添加到列表元素,而是将其添加到矩阵元素(例如,行将是文档,列是语料库的术语)。

如果您想应用本地或全局加权方案,您还可以使用numpy提供的一些矩阵运算。

我希望这能让你开始:)