【问题标题】:sentiment analysis using sklearn in python在 python 中使用 sklearn 进行情感分析
【发布时间】:2015-02-17 09:35:05
【问题描述】:

我对 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)

K-Fold 精度测试

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 折,k = 3。

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

我的问题是 -

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

【问题讨论】:

  • 标题与这里提出的众多问题略有不同。尝试将其缩小到一个问题。另外请检查您的问题并修复代码格式。
  • 你可以使用 NLTK 来标记你的语料库一旦被标记和安排你可以使用 scikit-learn 进行分类。我不明白你的问题帮我帮你。
  • 没有使用 corpus 进行任何 nltk 标记,我直接通过 scikit-learn 获得了很好的准确性,那么究竟为什么我需要对语料库进行标记?

标签: python scikit-learn


【解决方案1】:

Tfidf 是一种找出单词在文档中的重要性的方法。要从您的 tfidf 获得有意义的结果,就词干提取、ngraming 等而言,必须进行良好的预处理。NLTK 库对此提供了很好的支持。

TFidf 的结果与您的预处理一样好,否则它将是 GIGO(Garbage In Garbage Out)。由于您有时会进行情绪分析,因此最好在预处理步骤中将“din't”等否定词替换为“did not”。

【讨论】:

    【解决方案2】:

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

    为什么会出现这个问题?因为您所学到的知识不会推广到不在您的训练集中的主题。这将是一个大问题,例如,在主题快速变化的 Twitter 上。尝试在 M 月学习这样的模型,并在 M + 6 月预测推文中的情绪。我想它不会很好用!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 2011-11-21
      • 1970-01-01
      • 2019-12-18
      • 2014-04-02
      相关资源
      最近更新 更多