首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:高效实现特征向量

Python:高效实现特征向量
EN

Stack Overflow用户
提问于 2011-04-12 23:33:58
回答 1查看 1.9K关注 0票数 2

我把特征向量作为语料库中文档的位映射来实现。我已经拥有了整个语料库的词汇表(作为一个列表/集)和每个文档中的术语列表。

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

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

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

使用vocabulary.

  • Using的
  • 将使检查词汇表成员资格变得非常有效,但set没有排序,特征向量位需要按照排序的语料库dict的顺序排列(将每个词汇表项映射为任意值,如1)将允许在sorted(dict.keys())上迭代,这样我就可以跟踪索引。但是,我有dict.values().
  • Using的空间开销-- sorted(list)检查成员资格的效率很低。

StackOverflow会提出什么建议?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-12 23:47:48

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

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

您可以这样创建它:

代码语言:javascript
复制
corpus = dict(((term, index) for index, term in enumerate(sorted(all_words))))

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

代码语言:javascript
复制
num_words = len(corpus)
fvs = [[0]*num_words for _ in docs]

然后构建特征向量将是:

代码语言:javascript
复制
for i, doc_terms in enumerate(docs):
    fv = fvs[i]
    for term in doc_terms:
        fv[corpus[term]] += 1

测试成员资格没有开销,您只需遍历所有文档的所有术语即可。

也就是说,取决于语料库的大小,您应该看看和。您可能会遇到内存问题,而can为提供了特殊的数据类型(而不是使用列表列表),这可以为节省大量的内存

您可以使用上面所示的方法,但是不是向list元素添加数字,而是将其添加到矩阵元素中(例如,行是文档,列是语料库的术语)。

如果要应用本地或全局加权方案,还可以使用numpy提供的一些矩阵操作。

我希望这能让你开始:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5642825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档