【问题标题】:Python: implementing feature vectors efficientlyPython:有效地实现特征向量
【发布时间】:2011-04-12 23:33:58
【问题描述】:

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

例如,如果语料库词汇是['a', 'b', 'c', 'd'],文档d1 中的术语是['a', 'b', 'd', 'd'],那么d1 的特征向量应该是[1, 1, 0, 2]

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

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

  • 使用set 可以非常有效地检查词汇成员资格,但sets 没有排序,并且特征向量位需要按照已排序的语料库词汇表的顺序排列。
  • 对语料库词汇使用dict(将每个词汇项映射到任意值,如1)将允许迭代sorted(dict.keys()),这样我就可以跟踪索引。但是,我会有dict.values() 的空间开销。
  • 使用sorted(list) 将无法检查成员资格。

StackOverflow 有什么建议?

【问题讨论】:

  • 为什么排序列表查找效率低?您是否需要比二分搜索提供的 O(log(n)) 更好?
  • 数以万计的术语,数以千计的文档。我想最小化它,散列几乎允许O(1)
  • @yavoh:好的,公平点。您可以将初始文档术语的数据结构更改为集合而不是列表吗?你确定你真的需要这样的特征向量吗?您可以利用并行化吗?
  • 我忘了提到我需要保存术语的频率,而不仅仅是术语的存在,我的错误 - 我已经更新了原始问题。所以,一套是行不通的。
  • @yavoh:啊哈,这完全改变了它;-)

标签: python hash dictionary


【解决方案1】:

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

语料库术语的排序列表可以存储为带有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 提供的一些矩阵运算。

我希望这能让你开始:)

【讨论】:

  • 谢谢!我会研究 scipy 类。
  • @yavoh:您必须考虑两件事:(a) 如何有效地构建特征向量。上面的方法应该非常有效(实际上我认为不能做得更好)。 (b) 如何有效地存储特征向量。而且由于这些向量很可能包含很多零,所以稀疏矩阵是要走的路……
  • 你是对的,@Felix Kling。我正在考虑使用scipy.sparse.dok_matrix
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 2020-05-09
  • 2018-03-03
相关资源
最近更新 更多