[英]sentiment analysis using sklearn in python
我对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)
然后我用这个班级
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)])
classifier = classifier.fit(X_train, y_train)
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))
通过上述方法,使用k = 3的k倍,得到的精度为[0.92494226327944944573,0.91974595842956119,0.93360277136258663]
正如我在TfidfTransformer的代码中看到的那样,我发现它仅是一种数据预处理。 这是否意味着如果我使用sklearn,就不需要像nltk中给出的那样进行预处理。
我的问题是-
如果我可以直接在scikit库上运行数据集而不进行任何预处理并获得很好的结果,那么什么情况下才需要在skicit上运行数据之前使用预处理(nltk)?
您可能会发现主题与情感之间存在协变量(即,关于特蕾莎修女的大多数文章在情感上都是正面的,而关于谋杀的大多数文章都是负面的)。 您的单词分类器可能是在学习主题类别,而不是情感类别。 您可以通过检查分类器中术语的权重来验证这一点:我猜是加权最高的术语是特定于主题的。
为什么这是个问题? 因为您所学的内容不会推广到您的培训集中没有涉及的主题。 例如,在话题迅速变化的Twitter上,这将是一个大问题。 尝试在M个月学习类似的模型,并在M个月+ 6预测推文中的情绪。我想它不会很好地工作!
Tfidf是一种找出单词在文档中的重要性的方法。 为了从tfidf中获得有意义的结果,就词干,语法等而言,必须进行良好的预处理。NLTK库对此提供了良好的支持。
TFidf的结果与您的预处理效果一样好,否则将成为GIGO(垃圾进垃圾出)。 由于您正在进行情绪分析,因此有时最好在预处理步骤中将否定之类的否定替换为“没有”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.