在python中使用sklearn进行情感分析

Abh*_*ary 0 python scikit-learn

我对python和机器学习都很陌生.我正在努力研究Twitter数据的情感分析,所以在研究时我直接使用sklearn而不需要在nltk中进行任何预处理.

#reading data from csv having 1 column with text and other with sentiment as pos and neg
for index, row in val.iterrows():
   statement = row['tweets'].strip() #get the tweet from csv
   tweets.append((statement, row['emo'])) #append the tweet and emotion(pos,neg)
Run Code Online (Sandbox Code Playgroud)

然后我用了这个classfier

classifier = Pipeline([
    ('vectorizer', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
    ('classifier', OneVsRestClassifier(LinearSVC())
    )])

#Dividing data into training and Testing
np.random.shuffle(tweets)
for key, value in tweets:
    keys.append(key)
    values.append(value)

size = len(keys) * 1 / 2

X_train = np.array(keys[0:size])
y_train = np.array(values[0:size])

X_test = np.array(keys[size + 1: len(keys)])
y_test = np.array(values[size + 1: len(keys)])
Run Code Online (Sandbox Code Playgroud)

分类

classifier = classifier.fit(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)

K折度精度测试

X_folds = np.array_split(X_test, 3)
y_folds = np.array_split(y_test, 3)

scores = list()
for k in range(3):
    X_train = list(X_folds)
    X_test = X_train.pop(k)
    X_train = np.concatenate(X_train)
    y_train = list(y_folds)
    y_test = y_train.pop(k)
    y_train = np.concatenate(y_train)
    clsf = classifier.fit(X_train, y_train)

    scores.append(clsf.score(X_test, y_test))
Run Code Online (Sandbox Code Playgroud)

通过上述,我 使用k-fold 得到[0.92494226327944573,0.91974595842956119,0.93360277136258663]的准确度,其中k = 3.

正如我在TfidfTransformer的代码中看到的那样,我发现它只是一种数据预处理.所以这意味着如果我使用sklearn,我不需要像在nltk中给出的那样进行预处理.

我的问题是 -

如果我可以直接在scikit库上运行数据集而不进行任何预处理并获得相当好的结果,那么在skicit上运行数据之前我必须使用预处理(nltk)的情况何时?

Ben*_*son 5

你可能会发现这个话题与情绪共存(即大多数关于特蕾莎修女的文章都是积极的情绪,大多数关于谋杀的文章都是否定的).你的单词分类器可能是学习主题类别而不是情感类别.您可以通过检查分类器中术语的权重来验证这一点:我的猜测是最高加权术语是特定于主题的.

为什么这是个问题?因为您所学到的内容不会归结为不在训练集中的主题.这将是一个很大的问题,例如Twitter,主题转移迅速.尝试在M个月学习这样的模型,并在月M + 6中预测推文的情绪.我想它不会很好用!