【问题标题】:Tokenizing Preprocessed text with Scikit-learn使用 Scikit-learn 标记预处理文本
【发布时间】:2015-10-08 13:43:08
【问题描述】:

我最近创建了一个 hadoop 作业,它需要数千个文本文件并执行一些基本的文本处理。工作完成后,我有两个输出文件用于训练正面和负面情绪。两个文件如下所示:

word1 num_occurrences
...
wordN num_occurrences

我想使用 sci-kit learn 使用支持向量机进行分类,但我不确定如何正确标记我的数据集。所有教程都假设您将原始文本文件提供给 sklearn.feature_extraction.text.CountVectorizer 并且没有进行任何预处理。我也尝试过使用FeatureHasher,但不是散列一个单词并创建一个稀疏矩阵,而是为我传递的每个字符创建一个散列。

也就是说,根据我当前的输出文件,是否有人对提取特征并将其传递给机器学习算法的最佳方法有任何想法?谢谢!

【问题讨论】:

    标签: python hadoop scikit-learn bigdata


    【解决方案1】:

    看看TfidfTransformer。

    由于您使用的是文本特征,TF-IDF representation 将为每个特征(单词)分配一个数字,表示其在文本中的重要性。这种表示在基于文本的分类中非常常见。

    TfidfTransformer 将输出一个矩阵,其中包含文件中使用的所有单词,每一行代表一个文档,行中的每个单元格代表一个特征(单词),单元格中的值是该特征的重要性。

    确保您以适当的格式(矩阵)传递您的字数统计数据,然后使用此 TfidfTtransformer 的输出,您可以训练您的分类器。

    (到目前为止我还没有使用它,只有 Vectorizer 版本,但我已经看到了它做你想做的事情的场景)。

    【讨论】:

    • 我不太明白的部分是如何将我拥有的内容转换为 TfidfTransformer 的输入。我尝试创建一个这样的数组:[ [word1, count], [word2, count] ...],然后将其传递给 fit 函数,但这不起作用。
    【解决方案2】:

    这可能会帮助您入门。

    import numpy as np
    import copy
    from numpy import *
    from sklearn.pipeline import Pipeline
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.svm import LinearSVC
    from sklearn.feature_extraction.text import TfidfTransformer
    from sklearn.multiclass import OneVsRestClassifier
    from sklearn import preprocessing
    
    x_temp_list = []
    y_temp_list = []
    y_train_text = []
    temp_list = []
    another_temp_list = []
    
    with open('newtrain.csv','r') as fp:
        lines = fp.readlines()
    
    for line in lines:
        if len(line.strip()) > 1:
            fields = line.split(',')
            if len(line.split(',')) == 2:
                x_temp_list.append(fields[0].strip())
                y_temp_list.append(fields[1].strip())
    
    X_train = np.array(x_temp_list)
    y_train_text = np.array(y_temp_list)
    
    X_test = np.array(['Barista'])
    
    mlb = preprocessing.LabelBinarizer()
    Y = mlb.fit_transform(y_train_text)
    
    classifier = Pipeline([
        ('vectorizer', CountVectorizer()),
        ('tfidf', TfidfTransformer()),
        ('clf', OneVsRestClassifier(LinearSVC()))])
    
    classifier.fit(X_train, Y)
    predicted = classifier.predict(X_test)
    all_labels = mlb.inverse_transform(predicted)
    #all_labels = lb.inverse_transform(predicted)
    
    for item, labels in zip(X_test, all_labels):
        print '%s => %s' % (item, labels)
    

    【讨论】:

      猜你喜欢
      • 2015-07-10
      • 2018-07-07
      • 1970-01-01
      • 2014-11-17
      • 2020-11-10
      • 2012-10-15
      • 2013-04-14
      • 2016-05-07
      相关资源
      最近更新 更多