23

我想在大文本语料库上应用快速的在线降维技术,例如(在线/小批量)字典学习。我的输入数据自然不适合内存(这就是我想使用在线算法的原因)所以我正在寻找一种可以迭代文件而不是将所有内容加载到内存中的实现。可以用 sklearn 做到这一点吗?有替代品吗?

感谢注册

4

3 回答 3

25

对于一些支持 的算法partial_fit,可以在脚本中编写一个外循环来进行核外的大规模文本分类。然而,有一些缺失的元素:一个数据集读取器,它将磁盘上的数据作为平面文件的文件夹或 SQL 数据库服务器进行迭代,或 NoSQL 存储或具有存储字段的 Solr 索引。我们还缺少在线文本矢量化器。

这是一个示例集成模板,用于解释它如何组合在一起。

import numpy as np
from sklearn.linear_model import Perceptron

from mymodule import SomeTextDocumentVectorizer
from mymodule import DataSetReader

dataset_reader = DataSetReader('/path/to/raw/data')

expected_classes = dataset_reader.get_all_classes()  # need to know the possible classes ahead of time

feature_extractor = SomeTextDocumentVectorizer()
classifier = Perceptron()

dataset_reader = DataSetReader('/path/to/raw/data')

for i, (documents, labels) in enumerate(dataset_reader.iter_chunks()):

    vectors = feature_extractor.transform(documents)
    classifier.partial_fit(vectors, labels, classes=expected_classes)

    if i % 100 == 0:
        # dump model to be able to monitor quality and later analyse convergence externally
        joblib.dump(classifier, 'model_%04d.pkl' % i)

数据集阅读器类是特定于应用程序的,可能永远不会进入 scikit-learn(除了可能不需要向库添加新依赖项的平面文本文件或 CSV 文件的文件夹)。

文本矢量化部分问题更大。partial_fit由于我们构建内存词汇表的方式(根据 max_df 和 min_df 修剪的 python dict),当前的矢量化器没有方法。我们也许可以使用外部存储构建一个并删除 max_df 和 min_df 功能。

或者,我们可以构建一个 HashingTextVectorizer,它使用散列技巧来删除字典要求。目前这些都不存在(尽管我们已经有了一些构建块,例如 murmurhash 包装器和散列功能的拉取请求)。

同时,我建议你看看Vowpal Wabbit那些 python 绑定

编辑:该类sklearn.feature_extraction.FeatureHasher已合并到 scikit-learn 的主分支中,将在下一个版本(0.13)中可用。查看有关特征提取的文档。

编辑 2: 0.13 现已发布FeatureHasherHashingVectorizer可以直接处理文本数据。

编辑 3:现在在项目的官方示例库中有一个使用 Reuters 数据集进行核外学习的示例。

于 2012-09-17T14:00:45.720 回答
7

由于 Sklearn 0.13 确实存在HashingVectorizer的实现。

编辑:这是此类应用程序的完整示例

基本上,这个例子展示了你可以学习(例如分类文本)不能放入计算机主存储器(而是磁盘/网络/...)的数据。

于 2013-05-22T08:41:26.290 回答
4

In addition to Vowpal Wabbit, gensim might be interesting as well - it too features online Latent Dirichlet Allocation.

于 2012-09-18T11:52:55.733 回答