我对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)
然后我使用了这个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)])
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))
通过以上我得到的准确度 [0.92494226327944573,0.91974595842956119,0.93360277136258663] 使用k-fold,k = 3。
正如我在TfidfTransformer的代码中看到的那样,我发现它只是一种数据预处理。 所以这意味着如果我使用sklearn,我不需要像在nltk中给出的那样进行预处理。
我的问题是 -
如果我可以直接在scikit库上运行数据集而不进行任何预处理并获得相当好的结果,那么情景何时是 我必须在运行数据之前使用预处理(nltk) 在skicit上?
答案 0 :(得分:5)
你可能会发现这个话题与情绪共存(即大多数关于特蕾莎修女的文章都是积极的情绪,大多数关于谋杀的文章都是否定的)。你的单词分类器可能是学习主题类别而不是情感类别。您可以通过检查分类器中术语的权重来验证这一点:我的猜测是最高加权术语是特定于主题的。
为什么这是一个问题?因为您所学到的内容不会归结为不在训练集中的主题。这将是一个很大的问题,例如Twitter,主题转移迅速。尝试在M个月学习这样的模型,并预测月M + 6中的推文中的情绪。我想它不会很好用!
答案 1 :(得分:-1)
Tfidf是一种了解单词在文档中有多重要的方法。为了从你的tfidf中获得有意义的结果,必须在词干,ngraming等方面进行良好的预处理.NLTK库对它有很好的支持。
TFidf的结果与您的预处理一样好,否则它将是GIGO(Garbage In Garbage Out)。由于您正在进行情绪分析,因此最好在预处理步骤中将“din't”等否定替换为“did not”。