我正在寻求一些指导。我是NLP的新手。我可以找到绕过python的方法,并对一些功能提取器进行了编码。我想做的是能够使用sklearn预测情绪类型,如快乐、悲伤等。为此,我创建了一个特征提取器,它提取了几个特征,如起始POS、结束POS、标点符号数量、WH__单词数量等。它创建了一组这些特征,我正试图找到一种将这些数据用于监督学习的方法。我已经复习了所有800多个句子,并有了回答这些句子的目标。然后我将前750个数组和答案数组交给sklearn,然后尝试预测最后50个数组。sklearn预测,但预测真的很差。
当然这是我的问题而不是sklearn。我正在寻找一些指导,以帮助我完成可能正确的功能建议,重新规范数据的建议,以及一般的任何指导。我将在下面举例说明。
文本文件每行包含一个句子,特征提取器加载每个句子并给出一个数组形式的特征列表。此时数据看起来像
阵列特征阵列:
setx=[[1, 0, 5, 12, 5, 13, .... -1, 0, 0, -1, 0, -1, 0, -1, 17, 11, 0],..... many more arrays like this]
目标阵列:sety=[0,0,0,0,0:0,…..0,0,1,1,1,0,0,0,1]
然后我使用:
clf=svm.SVC(gamma=0.001,C=10)
clf.fit(setx,sety)
下面的tstx和tsty是总特征阵列和目标阵列的最后50个
count=0
for n in tstx:
print clf.predict(n),',',tsty[count]
count=count+1
print "-----"
任何关于改进预测的建议!我很确定我在某个地方错过了德克萨斯州大小的洞:-)
感谢一堆
您的系统的性能可能取决于各种不同的因素,但您使用的功能和您试图预测的类("目标")的数量起着至关重要的作用。你应该问问自己的一些问题是:
- 你有几节课学习区分5个不同的班级比学习50个更容易,如果班级数量增加,你可能需要更多的例子
- 阶级分布平衡吗一般来说,最好的办法是每个类(悲伤、快乐等)都有相同数量的例子,没有一个类被过度或低估
尽管如此,我相信你的问题在于功能。你在答案中列出的那些似乎对情绪分析没有太大用处。句子的起始位置并不能说明句子中表达的是哪种感觉,我想说,也不是Wh单词的数量或标点符号的数量。我真的不能给你一个具体的答案,但我建议你读一些关于情绪分析有用功能的文章,这个领域很广,你可以采取几种方法。简单搜索一下谷歌学者,你会发现很多可以从中获得灵感的材料。例如,您可以从SentiWordNet开始,它是WordNet的一个情感注释版本,并尝试使用其中包含的信息作为模型的功能。
编辑我认为唯一对情绪预测有用的功能是积极和消极词语的#,但我可能错了,因为我不是该领域的专家。其他的,如起始词性、结束词性、Wh-词的数量可能对疑问句和陈述句的预测有用。如果你在代码中没有做错什么,结果也不好,那么你就必须尝试更多/不同的功能。此外,不要为每项任务使用所有功能:你应该为你试图预测的每件事设计一个特定的功能集,作为对情绪有用的功能分析可能对其他预测没有用处,反之亦然,它们实际上可能会让分类器感到困惑。有很多方法可以查看特征是否对目标具有预测价值,例如,看看这个,但我从未使用过它们,所以我无法对此给出实际反馈。也许你应该看看sklearn中是否已经实现了一些你可以使用的东西。
阅读@the Coding Monk对答案的评论,这可能不是一个完整的解决方案,但它可能适用于情绪分析。
-
与其显式提取特征,不如尝试使用sklearn的
TfIdfVectorizer
。TfIdfVectorizer将根据TF-IDF分数从句子中提取单词 -
由于你已经有了一个分类句子列表,即情感值为0-6的句子,你可以很容易地与TfIdfVectorizer 结合训练分类器
-
您可以使用
sklearn Pipeline
组合这两个步骤
以下是的外观
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model.logistic import LogisticRegression
pipeline=Pipeline([
('vect', TfidfVectorizer(stop_words='english',sublinear_tf=True)),
('clf', LogisticRegression())
])
from sklearn.grid_search import GridSearchCV
parameters={}#for simplicity, keep this blank for now
gridSearchClassifier = GridSearchCV(pipeline, parameters, n_jobs=3, verbose=1, scoring='accuracy')
一旦我们建立了管道,我们就可以引入我们的训练数据
import pandas as pd
traindf = pd.read_csv('path to your data')
# Create learning matrix
X, y = traindf['sentenceColumn'], traindf['sentimentColumn'].as_matrix()
# Split into Training and Validation Sets
from sklearn.cross_validation import train_test_split
Xtrain, Xvalidate, ytrain, yValidate = train_test_split(X, y, train_size=0.7)
最后,对于训练,你所要做的就是
gridSearchClassifier.fit(Xtrain, ytrain)
现在您可以在验证集上评估您的性能
# Evaluate performance of gridSearchClassifier on Validation Set
predictions = gridSearchClassifier.predict(Xvalidate)
print ('Accuracy:', accuracy_score(yValidate, predictions))
print ('Confusion Matrix:', confusion_matrix(yValidate, predictions))
print ('Classification Report:', classification_report(yValidate, predictions))
如果你满意,那么把你最后的50句话作为你的测试集
testdf = pd.read_csv("path to test data")
# Predict Sentiment on Test Set
predictions=gridSearchClassifier.predict(testdf['sentenceColumn'])
# Create new column in Test dataframe
testdf['predictedSentiment'] = predictions
# Save the dataframe with the new column
testdf.to_csv("result.csv",index=False)