我正在寻找一些指导。我是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,0,1,1,1,1,0,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 "-----"
有关改进预测的任何建议!我很确定我错过了某个德克萨斯州大小的洞: - )
非常感谢
答案 0 :(得分:3)
您的系统的性能可能取决于各种不同的因素,但您使用的功能和您尝试预测的课程数量("目标")起着重要作用。你应该问自己的一些问题是:
尽管如此,我相信你的问题在于功能。你在答案中列出的那些似乎对情绪分析没有用。句子的起始POS并不表示在句子中表达了哪种感觉,也不是说,Wh-words的数量或标点符号的数量。 我无法给你一个具体的答案,但我建议你阅读一些关于情感分析的有用功能,这个领域很广泛,你可以采取几种方法。只需搜索一下Google学术搜索,您就会发现许多材料可以从中获取灵感。例如,您可以首先查看SentiWordNet,这是WordNet的情感注释版本,并尝试将其中包含的信息用作模型的功能。
修改强> 我认为对情绪预测有用的唯一功能是正面和负面的单词,但我可能会错,因为我不是该领域的专家。其他如开始POS,结束POS,Wh字的数量可能对疑问与声明预测有用。如果您在代码中没有做任何错误而且结果不佳,那么您必须尝试更多/不同的功能。此外,不要为每项任务使用所有功能:您应该为您要预测的每件事设计一个特定的功能集,作为对情感有用的功能 分析可能对其他预测没有用,反之亦然,它们实际上可能会对分类器造成混淆。有很多方法可以查看某个要素是否具有目标的预测值,例如,请参阅this,但我从未使用它们,因此我无法就此提供实际反馈。也许您应该查看是否已经在sklearn中实现了可以使用的内容。
答案 1 :(得分:1)
阅读@ 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)