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



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

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

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

我不擅长Python和机器学习,所以我在谷歌上搜索的所有样本都被卡住了。

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

您可以在scikit中非常轻松地完成此操作。

假设你有X和y数据:

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

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

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

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

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

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

特征提取

首先,您需要确定要使用哪些功能。这是主要任务之一,由您决定。标准方法是单词袋模型。这会统计每个文本中每个单词的出现次数。它是

相当简单,但在实际中却出奇地有用

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

让我们假设您想使用scikit-learn在Python中实现这一点。数据已经可用作具有textrating属性的class Review(object)。需要从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)

分类

现在你已经得到了特征向量,你需要决定使用哪个分类器。最容易的是k近邻。

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)

将其与y_test进行比较。

评论示例(略经编辑)

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

  1. 这太糟糕了|评分为1
  2. 太棒了|评分5

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

首先,您的words可能是['that', 'was', 'awful', 'great']

然后,你可能会得到

X = [[1, 1, 1, 0],
     [1, 1, 0, 1]]
y = [1, 5]

最新更新