使用 Scikit-learn 标记预处理文本
Tokenizing Preprocessed text with Scikit-learn
我最近创建了一个 hadoop 作业,它接收数千个文本文件并执行一些基本的文本处理。工作完成后,我有两个输出文件,用于训练正面和负面情绪。两个文件如下所示:
word1 num_occurrences
...
wordN num_occurrences
我想使用 sci-kit 学习使用支持向量机进行分类,但我不确定如何操作,因为我不确定如何正确标记我的数据集。所有教程都假定您将原始文本文件提供给 sklearn.feature_extraction.text.CountVectorizer
并且没有进行任何预处理。我也尝试过使用 FeatureHasher
,但不是散列单个单词并创建稀疏矩阵,而是为我传递给它的每个字符创建一个散列。
就是说,根据我当前的输出文件,有没有人知道提取特征并将其传递给机器学习算法的最佳方法?谢谢!
由于您使用的是文本特征,TF-IDF representation 将为每个特征(单词)分配一个数字,表示其在文本中的重要性。这种表示在基于文本的分类中很常见。
TfidfTransformer 将输出一个矩阵,其中包含文件中使用的所有单词,每一行代表一个文档,行中的每个单元格代表一个特征(单词),单元格中的值是该特征的重要性。
确保以适当的格式(矩阵)将字数统计数据传递给它,然后使用此 TfidfTtransformer 的输出来训练分类器。
(到目前为止我还没有使用它,只使用了 Vectorizer 版本,但我已经看到它可以做你想要的事情的场景)。
这可能会帮助您入门。
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)
我最近创建了一个 hadoop 作业,它接收数千个文本文件并执行一些基本的文本处理。工作完成后,我有两个输出文件,用于训练正面和负面情绪。两个文件如下所示:
word1 num_occurrences
...
wordN num_occurrences
我想使用 sci-kit 学习使用支持向量机进行分类,但我不确定如何操作,因为我不确定如何正确标记我的数据集。所有教程都假定您将原始文本文件提供给 sklearn.feature_extraction.text.CountVectorizer
并且没有进行任何预处理。我也尝试过使用 FeatureHasher
,但不是散列单个单词并创建稀疏矩阵,而是为我传递给它的每个字符创建一个散列。
就是说,根据我当前的输出文件,有没有人知道提取特征并将其传递给机器学习算法的最佳方法?谢谢!
由于您使用的是文本特征,TF-IDF representation 将为每个特征(单词)分配一个数字,表示其在文本中的重要性。这种表示在基于文本的分类中很常见。
TfidfTransformer 将输出一个矩阵,其中包含文件中使用的所有单词,每一行代表一个文档,行中的每个单元格代表一个特征(单词),单元格中的值是该特征的重要性。
确保以适当的格式(矩阵)将字数统计数据传递给它,然后使用此 TfidfTtransformer 的输出来训练分类器。
(到目前为止我还没有使用它,只使用了 Vectorizer 版本,但我已经看到它可以做你想要的事情的场景)。
这可能会帮助您入门。
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)