将文本数据存储在pandas框架中,如何使用sklearn实现简单分类

时间:2015-12-16 16:52:23

标签: pandas scikit-learn classification

我有一个框架,用于在A列中存储文本评论,在B列中存储评级(1到5)。

id .....review ..............rating          
1  .....That was awful ......1...

我需要创建一个简单的(任何基于算法的)分类器,例如,基于诸如词:出现词汇的特征,它将预测是否等级> 3或者< 3(假设我们将添加另一个col,如果等级为>则为1;如果为<则为0,则添加0)

我不擅长Python和机器学习,所以我被谷歌搜索了所有样本。

请解释一下,如何提取该示例案例中的功能,如何训练模型等,或者为该案例提供一个好的导师(我无法将sklearn导师翻译成我的案例)。

2 个答案:

答案 0 :(得分:4)

你可以在scikit中非常容易地做到这一点。

我们假设你有X和y数据:

X = ['the food was really delicious', 'the food was really terrible']
y = [5,2]

使用CountVectorizer,您可以将数据转换为2行代码中的数字:

from sklearn.feature_extraction.text import CountVectorizer
x_data = CountVectorizer().fit_transform(X)    

这会将您的数据完全转换为计数,然后可以输入您想要的任何算法:

from sklearn.neighbors import KNeighbors
clf = KNeighbors().fit(x_data, y)

答案 1 :(得分:2)

大约有两个一般步骤,可以详细解释。

特征提取

首先,您需要确定要使用的功能。这是主要任务之一,由您自己决定。标准方法是bag-of-words model。这会计算每个文本中每个单词的出现次数。 It is

  

非常简单但在实践中非常有用

还有专门的工具可以为您进行tf-idf分析,例如Sally

假设您想使用scikit-learn在Python中执行此操作。该数据已作为具有textrating属性的text提供。从def extract(review): '''extracts features from review''' result = {} for word in review.text.split(): if result[word] is not None: result[word] += 1 else: result[word] = 1 return result 开始,您需要提取功能。

示例:

Counter

会给你一个文本中所有单词的计数(还有一个库类X,可能会为你做这个)。这些,您可以组合形成一个特征矩阵X = [] y = [] words = [] # build an index of all occurring words for review in reviews: for word in extract(review): if word not in words: words.append(word) # creates the feature vectors for classification for review in reviews: feature_vector = [0] * len(words) y.append(review.rating) for word, count in extract(review): feature_vector[words.index(word)] = count X.append(feature_vector) 。 (此代码可能会进行大量优化)

from sklearn import neighbors, cross_validation
X_train, X_test, y_train, y_test = cross_validation.train_test_split(
    X, y, test_size=0.33, random_state=42)
knn = neighbors.KNeighborsClassifier()
knn.fit(X_train, y_train)
knn.predict(X_test)

分类

现在你已经有了特征向量,你需要决定使用哪个分类器。最简单的是k-nearest-neighbors

y_test

将此与{'that': 1, 'was': 1, 'awful': 1 }进行比较。

评论示例(略有编辑)

  

让我们考虑两个评论的例子:

     
      
  1. 太可怕了评分1;
  2.   
  3. 太棒了评级5.
  4.         

    创建了两个dicts:{'that': 1, 'was': 1, 'great': 1}words。在这种情况下,X和y向量应该是什么样的?

首先,您的['that', 'was', 'awful', 'great']可能是X = [[1, 1, 1, 0], [1, 1, 0, 1]] y = [1, 5]

然后,你可能会得到

{{1}}