python - 判断一个句子是肯定的、中性的还是否定的?

标签 python machine-learning nlp nltk sentiment-analysis

我想创建一个脚本,可以确定一个句子是积极的、中性的还是消极的。

我上网搜索发现通过medium article可以使用 NLTK 库来完成。

所以,我已经尝试过这段代码。

import nltk.classify.util
from nltk.classify import NaiveBayesClassifier
from nltk.corpus import movie_reviews


def extract_features(word_list):
    return dict([(word, True) for word in word_list])


if __name__ == '__main__':
    # Load positive and negative reviews
    positive_fileids = movie_reviews.fileids('pos')
    negative_fileids = movie_reviews.fileids('neg')

    features_positive = [(extract_features(movie_reviews.words(fileids=[f])),
                          'Positive') for f in positive_fileids]
    features_negative = [(extract_features(movie_reviews.words(fileids=[f])),
                          'Negative') for f in negative_fileids]

    # Split the data into train and test (80/20)
    threshold_factor = 0.8
    threshold_positive = int(threshold_factor * len(features_positive))
    threshold_negative = int(threshold_factor * len(features_negative))

    features_train = features_positive[:threshold_positive] + features_negative[:threshold_negative]
    features_test = features_positive[threshold_positive:] + features_negative[threshold_negative:]
    print("\nNumber of training datapoints:", len(features_train))
    print("Number of test datapoints:", len(features_test))

    # Train a Naive Bayes classifier
    classifier = NaiveBayesClassifier.train(features_train)
    print("\nAccuracy of the classifier:", nltk.classify.util.accuracy(classifier, features_test))

    print("\nTop 10 most informative words:")
    for item in classifier.most_informative_features()[:10]:
        print(item[0])

    # Sample input reviews
    input_reviews = [
    "Started off as the greatest series of all time, but had the worst ending of all time.",
    "Exquisite. 'Big Little Lies' takes us to an incredible journey with its emotional and intriguing storyline.",
    "I love Brooklyn 99 so much. It has the best crew ever!!",
    "The Big Bang Theory and to me it's one of the best written sitcoms currently on network TV.",
    "'Friends' is simply the best series ever aired. The acting is amazing.",
    "SUITS is smart, sassy, clever, sophisticated, timely and immensely entertaining!",
    "Cumberbatch is a fantastic choice for Sherlock Holmes-he is physically right (he fits the traditional reading of the character) and he is a damn good actor",
    "What sounds like a typical agent hunting serial killer, surprises with great characters, surprising turning points and amazing cast."
    "This is one of the most magical things I have ever had the fortune of viewing.",
    "I don't recommend watching this at all!"
    ]

    print("\nPredictions:")
    for review in input_reviews:
        print("\nReview:", review)
        probdist = classifier.prob_classify(extract_features(review.split()))
        pred_sentiment = probdist.max()
        print("Predicted sentiment:", pred_sentiment)
        print("Probability:", round(probdist.prob(pred_sentiment), 2))

这是我得到的输出

Number of training datapoints: 1600
Number of test datapoints: 400

Accuracy of the classifier: 0.735

Top 10 most informative words:
outstanding
insulting
vulnerable
ludicrous
uninvolving
avoids
astounding
fascination
affecting
seagal

Predictions:

Review: Started off as the greatest series of all time, but had the worst ending of all time.
Predicted sentiment: Negative
Probability: 0.64

Review: Exquisite. 'Big Little Lies' takes us to an incredible journey with its emotional and intriguing storyline.
Predicted sentiment: Positive
Probability: 0.89

Review: I love Brooklyn 99 so much. It has the best crew ever!!
Predicted sentiment: Negative
Probability: 0.51

Review: The Big Bang Theory and to me it's one of the best written sitcoms currently on network TV.
Predicted sentiment: Positive
Probability: 0.62

Review: 'Friends' is simply the best series ever aired. The acting is amazing.
Predicted sentiment: Positive
Probability: 0.55

Review: SUITS is smart, sassy, clever, sophisticated, timely and immensely entertaining!
Predicted sentiment: Positive
Probability: 0.82

Review: Cumberbatch is a fantastic choice for Sherlock Holmes-he is physically right (he fits the traditional reading of the character) and he is a damn good actor
Predicted sentiment: Positive
Probability: 1.0

Review: What sounds like a typical agent hunting serial killer, surprises with great characters, surprising turning points and amazing cast.This is one of the most magical things I have ever had the fortune of viewing.
Predicted sentiment: Positive
Probability: 0.95

Review: I don't recommend watching this at all!
Predicted sentiment: Negative
Probability: 0.53

Process finished with exit code 0

我面临的问题是数据集非常有限,因此输出精度非常低。有没有更好的库或资源或其他任何东西来检查一个陈述是积极的、中立的还是消极的?

更具体地说,我想将其应用于一般的日常谈话

最佳答案

亚马逊客户评论数据集是一个庞大的数据集,包含 1.3 亿多条客户评论。您可以通过匹配评论和评级来使用它进行情感分析。这么多的数据也非常适合 super 花哨的数据密集型深度学习方法。

( https://s3.amazonaws.com/amazon-reviews-pds/readme.html )

如果您特别寻找电影评论,大型电影评论数据集也是一个选择,其中包含 50K+ IMDB 评论。 (http://ai.stanford.edu/~amaas/data/sentiment/)

我建议使用词嵌入来增强您的模型,而不是使用一次性编码的词袋。

关于python - 判断一个句子是肯定的、中性的还是否定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59521135/

相关文章:

machine-learning - 矢量化问题

nlp - 在哪里可以找到详尽的停用词列表?

python - opencv findContours 错过了一些区域。[没有得到所有正确的边界框]

machine-learning - 在语言建模中,为什么我必须在每个新的训练周期之前 init_hidden 权重? ( torch )

python - 计算损失相对于层输入的偏导数 |链式法则 | Python

algorithm - 无监督自动标注算法?

machine-learning - 根据示例学习用关键字标记句子

python - 有没有办法在 Python 中调用定义子类的方法?

python - 将带小数位的字符串列表转换为python中的整数

python - Python 的 "from <module> import <symbol>"的动态等价物