精华内容
下载资源
问答
  • Python训练文本情感分析模型

    万次阅读 多人点赞 2019-08-22 14:51:39
    最近闲来无事,看了 王树义老师 的一篇文章 《如何用Python和机器学习训练中文文本情感分类模型》,跟着步骤做了一个demo,此demo是爬取了美团用户的评论,对评论进行情感分析,收获很大,特此做下了笔记。...

    最近闲来无事,看了 王树义老师 的一篇文章 《如何用Python和机器学习训练中文文本情感分类模型》,跟着步骤做了一个demo,此demo是爬取了美团用户的评论,对评论进行情感分析,收获很大,特此做下了笔记。

    首先导入库

    import pandas as pd
    import numpy as np
    from pandas import DataFrame, Series
    

    读取评论数据,数据在 这里

    data = pd.read_csv("data.csv", encoding='GB18030')
    data
    

    数据如图所示
    在这里插入图片描述

    根据评分,使用lambda匿名函数,把评分>3的,取值1,当作正向情感,评分<3的,取值0,当作负向情感

    def make_label(df):
        df["sentiment"] = df["star"].apply(lambda x: 1 if x > 3 else 0)
    

    调用方法,并查看结果

    make_label(data)
    data
    

    特征、标签分开赋值:

    X = data[["comment"]]
    y = data.sentiment
    

    导入 jieba分词库,创建分词函数,将评论拆分,并用空格连接
    通过 apply 调用函数,并新增列,填充值:

    import jieba
    def chinese_word_cut(mytext):
        return " ".join(jieba.cut(mytext))
    
    X["cuted_comment"] = X.comment.apply(chinese_word_cut)
    

    接下来要将一团的数据,拆分成训练数据集、测试数据集
    sklearn.model_selection导入数据拆分函数train_test_split

    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
    

    查看数据集形状:

    X_train.shape
    

    可知道,train_test_split在默认模式下,训练数据集、测试数据集比例是3:1。

    接下来要处理中文停用词,可使用第三方停用词表,能在 这个GitHub上找到
    创建停词函数,将停用词转成列表形式返回:

    def get_custom_stopword(stop_word_file):
        with open(stop_word_file) as f:
            stop_word = f.read()
            
        stop_word_list = stop_word.split("/n")
        custom_stopword = [i for i in stop_word_list]
        return custom_stopword
    
    stopwords = get_custom_stopword("哈工大停用词表.txt")
    

    导入 CountVectorizer函数,将中文词语向量化:

    from sklearn.feature_extraction.text import CountVectorizer
    

    默认参数向量化

    vect = CountVectorizer()
    term_matrix = DataFrame(vect.fit_transform(X_train.cuted_comment).toarray(), columns=vect.get_feature_names())
    

    数据集长这样:
    在这里插入图片描述

    向量化后的数据集

    term_matrix.shape
    
    (1500, 7305)
    

    发现有特别多的数字存在,这些数字并不具有特征性,若是不过滤,会影响后面模型训练的效果

    将一部分特征向量过滤,
    CountVectorizer添加参数,并重新对数据集向量化:

    max_df = 0.8 # 在超过这一比例的文档中出现的关键词(过于平凡),去除掉。
    min_df = 3 # 在低于这一数量的文档中出现的关键词(过于独特),去除掉。
    
    vect = CountVectorizer(max_df = max_df,
                           min_df = min_df,
                           token_pattern=u'(?u)\\b[^\\d\\W]\\w+\\b',
                           stop_words=frozenset(stopwords))
    
    term_matrix = DataFrame(vect.fit_transform(X_train.cuted_comment).toarray(), columns=vect.get_feature_names())
    

    向量化后的数据集

    term_matrix.shape
    
    (1500, 1972)
    

    过滤了很多词汇,好棒!

    训练集已向量化完成,现在使用此特征矩阵训练模型
    导入 朴素贝叶斯函数,建立分类模型

    from sklearn.naive_bayes import MultinomialNB
    nb = MultinomialNB()
    

    注意,我们的处理数据流程是:
    1、特征向量化
    2、贝叶斯分类
    如果每修改一次参数,就要重新运行以上函数,会十分头疼

    sklearn提供了一个管道pipeline功能,能将顺序工作连接起来

    from sklearn.pipeline import make_pipeline
    pipe = make_pipeline(vect, nb)
    pipe
    

    现在我们就可以把pipe当成一个完整的模型来使用了。

    将未特征向量化的数据输入,验证模型的准确率:

    from sklearn.model_selection import cross_val_score
    cross_val_score(pipe, X_train, y_train, cv=5, scoring='accuracy').mean()
    

    得分:

    0.8333673633410742
    

    到此为止,模型已经初步搭建好了。【鼓掌】


    但是我们用的都是训练过的数据集来测试的,准确率真的有这么高吗,来,我们进行下一步测试。

    先用训练集拟合数据:

    pipe.fit(X_train.cuted_comment, y_train)
    

    测试集预测结果:

    y_pred = pipe.predict(x_test.cuted_comment)
    

    结果是, 都是 0,1,0,1…:
    在这里插入图片描述

    使用 metrics测度工具查看评分

    from sklearn import metrics
    metrics.accuracy_score(y_test, y_pred)
    

    评分:

    0.866
    

    结果显示,我们的模型对未曾见过的数据,预测的精确度达86.6%。

    混淆矩阵验证

    metrics.confusion_matrix(y_test, y_pred)
    

    结果

    array([[200,  37],
           [ 30, 233]], dtype=int64)
    

    混淆矩阵中的数字从上到下,从左到右分别表示:

    • 本来是正向,预测也是正向
    • 本来是正向,预测却是反向
    • 本来是反向,预测确实正向
    • 本来是反向,预测也是反向

    可见我们的模型性能还是挺不错的。

    下面我们来用 snowNLP 来做对比:

    from snownlp import SnowNLP
    def get_sentiment(text):
        return SnowNLP(text).sentiments
    

    使用测试集跑一遍:

    y_pred_snow = X_test.comment.apply(get_sentiment)
    

    结果:
    在这里插入图片描述
    snowNLP 返回的结果是0-1之间的数,而不是0、1,因此我们需要将数据转换一下,大于0.5为1,小于0.5为0。

    y_pred_snow_norm = y_pred_snow.apply(lambda x: 1 if x>0.5 else 0)
    

    结果:
    在这里插入图片描述
    这下好看多啦。
    查看snowNLP的评分:

    metrics.accuracy_score(y_test, y_pred_snow_norm)
    
    0.77
    

    en,比我们的模型差点。。

    混淆矩阵:

    metrics.confusion_matrix(y_test, y_pred_snow_norm)
    
    array([[189,  48],
           [ 67, 196]], dtype=int64)
    

    en,确实比我们的模型差点。。

    以上。

    展开全文
  • 文本情感分析模型构建及训练

    千次阅读 2020-03-04 23:41:09
    引自:文本情感分析 # 创建深度学习模型, Embedding + LSTM + Softmax. def create_LSTM(n_units, input_shape, output_dim, filepath): x, y, output_dictionary, vocab_size, label_size, inverse_word_...

    数据模型构建及训练代码:
    引自:文本情感分析

    # 创建深度学习模型, Embedding + LSTM + Softmax.
    def create_LSTM(n_units, input_shape, output_dim, filepath):
        x, y, output_dictionary, vocab_size, label_size, inverse_word_dictionary = load_data(filepath)
        model = Sequential()
        model.add(Embedding(input_dim=vocab_size + 1, output_dim=output_dim,
                            input_length=input_shape, mask_zero=True))
        model.add(LSTM(n_units, input_shape=(x.shape[0], x.shape[1])))
        model.add(Dropout(0.2))
        model.add(Dense(label_size, activation='softmax'))
        model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    
        plot_model(model, to_file='./model_lstm.png', show_shapes=True)
        model.summary()
    
        return model
    
    # 模型训练
    def model_train(input_shape, filepath, model_save_path):
    
        # 将数据集分为训练集和测试集,占比为9:1
        # input_shape = 100
        x, y, output_dictionary, vocab_size, label_size, inverse_word_dictionary = load_data(filepath, input_shape)
        train_x, test_x, train_y, test_y = train_test_split(x, y, test_size = 0.1, random_state = 42)
    
        # 模型输入参数,需要自己根据需要调整
        n_units = 100
        batch_size = 32
        epochs = 5
        output_dim = 20
    
        # 模型训练
        lstm_model = create_LSTM(n_units, input_shape, output_dim, filepath)
        lstm_model.fit(train_x, train_y, epochs=epochs, batch_size=batch_size, verbose=1)
    
        # 模型保存
        lstm_model.save(model_save_path)
    
        N = test_x.shape[0]  # 测试的条数
        predict = []
        label = []
        for start, end in zip(range(0, N, 1), range(1, N+1, 1)):
            sentence = [inverse_word_dictionary[i] for i in test_x[start] if i != 0]
            y_predict = lstm_model.predict(test_x[start:end])
            label_predict = output_dictionary[np.argmax(y_predict[0])]
            label_true = output_dictionary[np.argmax(test_y[start:end])]
            print(''.join(sentence), label_true, label_predict) # 输出预测结果
            predict.append(label_predict)
            label.append(label_true)
    
        acc = accuracy_score(predict, label) # 预测准确率
        print('模型在测试集上的准确率为: %s.' % acc)

    语句1:

    model = Sequential()
    model.add(Embedding(input_dim=vocab_size + 1, output_dim=20,
                        input_length=180, mask_zero=True))
    model.add(LSTM(100, input_shape=(x.shape[0], x.shape[1])))
    model.add(Dropout(0.2))
    model.add(Dense(label_size, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    
    plot_model(model, to_file='./model_lstm.png', show_shapes=True)
    model.summary()

    序贯模型:

    背景:

    Keras中有两种类型的模型,一种是序贯模型Sequential,另一种是函数模型Model。
    序贯模型是函数式模型的一种特殊情况。两类模型有一些方法是相同的:· model.summary():打印出模型概况,它实际调用的是keras.utils.print_summary· model.get_config():返回包含模型配置信息的Python字典。模型也可以从它的config信息中重构回去。

    添加layer:

    序贯模型是多个网络层的线性堆叠,也就是“一条路走到黑”。
    可以通过向Sequential模型传递一个layer的list来构造该模型:

    from keras.models import Sequential
    from keras.layers import Dense, Activation
    model= Sequential([
    Dense(32, units=784),
    Activation('relu'),
    Dense(10),
    Activation('softmax'),
    ])

    也可以通过.add()方法一个个的将layer加入模型中:

    model= Sequential()
    model.add(Dense(32, input_shape=(784,))
    )model.add(Activation('relu'))

    Embedding层

    嵌入层将正整数(下标)转换为具有固定大小的向量,只能作为模型的第一层。
    深度学习中 Embedding层两大作用

    参数:

    input_dim:大或等于0的整数,字典长度,即输入数据最大下标+1
    output_dim:大于0的整数,代表全连接嵌入的维度
    mask_zero:布尔值,确定是否将输入中的‘0’看作是应该被忽略的填充(padding)值,该参数在使用递归层处理变长输入时有用。设置为True的话,模型中后续的层必须都支持masking,否则会抛出异常。如果该值为True,则下标0在字典中不可用,input_dim应设置为|vocabulary| + 2。
    input_length:当输入序列的长度固定时,该值为其长度。

    Embedding实例讲解

    LSTM模型

    参数:

    n_units:隐藏神经元个数
    Keras关于LSTM的units参数
    Keras LSTM的参数input_shape, units等的理解

    Dropout

    深度学习中Dropout原理解析

    Dense层

    全连接层

    Compile

    优化器 optimizer:它可以是现有优化器的字符串标识符,如 rmsprop 或 adagrad,也可以是 Optimizer 类的实例.
    损失函数 loss:模型试图最小化的目标函数。它可以是现有损失函数的字符串标识符,如 categorical_crossentropy 或 mse,也可以是一个目标函数。
    评估标准 metrics:对于任何分类问题,你都希望将其设置为metrics=[‘accuracy’]。评估标准可以是现有的标准的字符串标识符,也可以是自定义的评估标准函数。

    语句2:

    train_x, test_x, train_y, test_y = train_test_split(x, y, test_size = 0.1, random_state = 42)
    
    lstm_model.fit(train_x, train_y, epochs=epochs, batch_size=batch_size, verbose=1)

    taain_test_split

    作用:

    随即划分样本数据作为测试集和训练集

    参数

    train_data:待划分样本数据
    train_target:待划分样本数据的结果(标签)
    test_size:测试数据占样本数据的比例,若整数则样本数量
    random_state:设置随机数种子,保证每次都是同一个随机数。若为0或不填,则每次得到数据都不一样

    lstm_model.fit

    参数:

    train_x:输入数据
    train_y:标签
    batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。
    epochs:整数,训练终止时的epoch值,训练将在达到该epoch值时停止。
    verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录

    语句3:

    for start, end in zip(range(0, N, 1), range(1, N+1, 1)):
        sentence = [inverse_word_dictionary[i] for i in test_x[start] if i != 0]
        y_predict = lstm_model.predict(test_x[start:end])
        label_predict = output_dictionary[np.argmax(y_predict[0])]
        label_true = output_dictionary[np.argmax(test_y[start:end])]
        print(''.join(sentence), label_true, label_predict) # 输出预测结果
        predict.append(label_predict)
        label.append(label_true)
    展开全文
  • 代码包括数据处理,模型训练,对新数据做出预测,并将预测结果(正向情感)保存到result.txt中 软件:anaconda3 一.数据集介绍 数据集链接: https://pan.baidu.com/s/1oIXkaL_SL9GSN3S56ZwvWQ 提取码: qgtg 训练集...
  • 中文文本情感分析案例 课程配套程序 该文件夹是本次课程配套的程序,打来即可使用 课后作业数据集 为大家课后作业的数据集,可以在该数据集上进行相关训练 test.tsv为测试数据集,测试模型准确度 train.tsv为训练...
  • 摘要:本篇博文从模型和算法的视角,分别介绍了基于统计方法的情感分析模型和基于深度学习的情感分析模型文本情感分析(Sentiment Analysis)是指利用自然语言处理和文本挖掘技术,对带有情感色彩的主观性文本进行...
    摘要:本篇博文从模型和算法的视角,分别介绍了基于统计方法的情感分析模型和基于深度学习的情感分析模型。

    文本情感分析(Sentiment Analysis)是指利用自然语言处理和文本挖掘技术,对带有情感色彩的主观性文本进行分析、处理和抽取的过程。目前,文本情感分析研究涵盖了包括自然语言处理、文本挖掘、信息检索、信息抽取、机器学习和本体学等多个领域,得到了许多学者以及研究机构的关注,近几年持续成为自然语言处理和文本挖掘领域研究的热点问题之一。

    从人的主观认知来讲,情感分析任务就是回答一个如下的问题“什么人?在什么时间?对什么东西?哪一个属性?表达了怎样的情感?”因此情感分析的一个形式化表达可以如下:(entity,aspect,opinion,holder,time)。比如以下文本“我觉得2.0T的XX汽车动力非常澎湃。”其中将其转换为形式化元组即为(XX汽车,动力,正面情感,我,/)。需要注意的是当前的大部分研究中一般都不考虑情感分析五要素中的观点持有者和时间。

    情感分析问题可以划分为许多个细分的领域,下面的思维导图展示了情感分析任务的细分任务:

    其中词级别和句子级别的分析对象分别是一个词和整个句子的情感正负向,不区分句子中具体的目标,如实体或属性,相当于忽略了五要素中的实体和属性这两个要素。词级别情感分析,即情感词典构建,研究的是如何给词赋予情感信息。句子级/文档级情感分析研究的是如何给整个句子或文档打情感标签。而目标级情感分析是考虑了具体的目标,该目标可以是实体、某个实体的属性或实体加属性的组合。具体可分为三种:Target-grounded aspect based sentiment analysis (TG-ABSA), Target no aspect based sentiment analysis (TN-ABSA), Target aspect based sentiment analysis (T-ABSA). 其中TG-ABSA的分析对象是给定某一个实体的情况下该实体给定属性集合下的各个属性的情感分析;TN-ABSA的分析对象是文本中出现的实体的情感正负向;T-ABSA的分析对象是文本中出现的实体和属性组合。下表例举了不同目标的情感分析任务:

    基于统计方法的情感分析模型

    基于统计方法的情感分析方法主要依赖于已经建立的“情感词典”,“情感词典”的建立是情感分类的前提和基础,目前在实际使用中,可将其归为4类:通用情感词、程度副词、否定词、领域词。英文方面主要是基于对英文词典WordNet[1] 的扩充,Hu和Liu[2]在已手工建立种子形容词词汇表的基础上,利用 WorldNet 中词间的同义和近义关系判断情感词的情感倾向,并以此来判断观点的情感极性。中文方面则主要是对知网Hownet[3] 的扩充,朱嫣岚[4]利用语义相似度计算方法计算词语与基准情感词集的语义相似度,以此推断该词语的情感倾向。此外,还可以建立专门的领域词典,以提高情感分类的准确性,比如建立新的网络词汇词典,来更准确的把握新词的情感倾向。

    基于情感词典的方法,先对文本进行分词和停用词处理等预处理,再利用先构建好的情感词典,对文本进行字符串匹配,从而挖掘正面和负面信息。其大致流程如图所示:

    这里处理上述的词典外,下面[5]补充了现有的其它中文词典以供参考:

    当然也可以通过语料来自己训练情感词典。导入情感词典后,我们需要利用情感词典文本匹配算法进行情感分析。基于词典的文本匹配算法相对简单。逐个遍历分词后的语句中的词语,如果词语命中词典,则进行相应权重的处理。正面词权重为加法,负面词权重为减法,否定词权重取相反数,程度副词权重则和它修饰的词语权重相乘。利用最终输出的权重值,就可以区分是正面、负面还是中性情感了。一个典型的利用情感词典文本匹配算法进行情感分析的算法流程如下[5]:

    基于统计方法的情感分析模型简单易行,具有通用和泛化性,但是仍然存在如下三点主要的不足:

    1 精度不高

    语言是一个高度复杂的东西,采用简单的线性叠加显然会造成很大的精度损失。词语权重同样不是一成不变的,而且也难以做到准确。

    2 词典需要持续更新

    对于新的情感词,比如给力,牛逼等等,词典不一定能够覆盖。因此需要不断刷新词典来补充新词。在当下网络词汇不断出现的时代,如果词典的刷新速度跟不上新词出现的速度,那么情感分析在实际使用中会与预期相差较大的距离。比如淘宝商品评价,饿了么外卖评价等,如果无法捕捉新词,那么分析的情感将会偏离实际。

    3 构建词典困难

    基于词典的情感分类,核心在于情感词典。而情感词典的构建需要有较强的背景知识,需要对语言有较深刻的理解,在分析外语方面会有很大限制。

    基于深度学习的情感分析模型

    在了解了基于统计方法的情感分析模型优缺点之后,我们看一下深度学习文本分类模型是如何进行文本情感分析分类的。深度学习的一个优势就是可以进行端到端的学习,而省略的中间每一步的人工干预步骤。基于预训练模型生成的词向量,深度学习首先可以解决的一个重要问题就是情感词典的构建。下面我们会以集中典型的文本分类模型为例,展示深度文本分类模型的演进方向和适用场景。

    2.1 FastText[6]

    模型运行步骤:

    2.2 TextCNN[7]

    2.3 TextRNN[8]

    2.4 TextRNN+Attention[9]

    HAN为Hierarchical Attention Networks,将待分类文本,分为一定数量的句子,分别在word level和sentence level进行encoder和attention操作,从而实现对较长文本的分类。相比于上述的算法模型,HAN的结构稍微复杂一些,具体可以分解为以下步骤。

    2.5 TextRCNN[10]

    RCNN算法过程:首先,采用双向LSTM学习word的上下文,利用前向和后向RNN得到每个词的前向和后向上下文的表示:

    词的表示变成词向量和前向后向上下文向量连接起来的形式:

    之后再接跟TextCNN相同卷积层,pooling层即可,在seq_length维度进行 max pooling,然后进行fc操作就可以进行分类了,可以将该网络看成是fasttext 的改进版本。

    总结

    本篇博文从模型和算法的视角,分别介绍了基于统计方法的情感分析模型和基于深度学习的情感分析模型。基于统计方法的情感分析模型简单易用,但是在准确、灵活和泛化性上有较大的缺陷;基于深度学习的模型演进方向是不断通过更深和复杂的网络来捕捉上下文信息,同时借助于强大的预训练模型生成的词向量来训练神经网络来完成这项任务。下面的开源仓库[13]详细介绍了每一种模型的pytorch实现以及在相同的中文baseline上的对比;下面的两篇博文[11][12]也是对其他情感分析深度学习模型进行了详细介绍,可以作为进一步探索的指引。

    参考文献

    [1]https://wordnet.princeton.edu/

    [2]HU M,LIU B. Mining and summarizing customer reviews[C]. NY,USA:Proceedings of Knowledge Discoveryand Da-ta Mining,2004:168 - 177.

    [3]https://languageresources.github.io/2018/03/07/

    %E9%87%91%E5%A4%A9%E5%8D%8E_Hownet/

    [4]朱嫣岚,闵锦,周雅倩,等. 基于 How Net 的词汇语义倾向计算[J]. 中文信息学报,2006,20(1):14 - 20

    [5]https://blog.csdn.net/weixin_41657760/article/

    details/93163519

    [6]https://arxiv.org/abs/1612.03651

    [7]https://arxiv.org/abs/1408.5882

    [8]https://www.ijcai.org/Proceedings/16/Papers/408.pdf

    [9]https://www.aclweb.org/anthology/P16-2034/

    [10]http://zhengyima.com/my/pdfs/Textrcnn.pdf

    [11]https://zhuanlan.zhihu.com/p/76003775

    [12]https://zhuanlan.zhihu.com/p/73176084

    [13]https://github.com/649453932/Chinese-Text-Classification-Pytorch

     

    本文分享自华为云社区《NLP专栏丨情感分析方法入门下》,原文作者:就挺突然 。

     

    点击关注,第一时间了解华为云新鲜技术~

    展开全文
  • 针对以往研究大多使用单一模型进行文本情感分析,导致无法很好地捕捉相关文本的情感特征,从而造成情感分析效果不理想的问题,提出一种基于多头自注意力和并行混合模型文本情感分析方法。首先,利用Word2vec模型捕捉...
  • 基于Pytorch的Bert应用,包括命名实体识别、情感分析文本分类以及文本相似度等(后续更新其他方向相关模块),并有相关数据与深度训练优化方式api。各个子项目大都为开源工作,本项目仅做相应处理以及提供一个已训练...
  • 情感分析 带有和不带有预训练模型文本情感分析
  • 文本情感分析

    千次阅读 2019-01-21 20:11:58
    基于主题模型文本情感分析系统主要包括以下部分: 评论信息采集与预处理(如网页爬取、中文分词、停用词处理等)、主题抽取、情感词抽取(可能涉及到情感词典构建)、主题的情感分类或评分、主题情感摘要生成...

    基于主题模型的文本情感分析系统主要包括以下部分:

    评论信息采集与预处理(如网页爬取、中文分词、停用词处理等)、主题抽取、情感词抽取(可能涉及到情感词典构建)、主题的情感分类或评分、主题情感摘要生成(方便用户直接了解主题)、系统评测等。

    此外,当前的基于主题模型的文本情感分析技术主要侧重于文本评论,而较少关注与客服人员的文本问答或者语音咨询;而后者对于挖掘用户需求也是有意义的。

    文本情感极性分析:

    目前常见的情感极性分析方法主要是两种:基于情感词典的方法和基于机器学习的方法。

    基于情感词典的方法:

    基于情感词典的文本情感分类规则比较机械化。简单起见,我们将每个积极情感词语赋予权重1,将每个消极情感词语赋予权重-1,并且假设情感值满足线性叠加原理;然后我们将句子进行分词,如果句子分词后的词语向量包含相应的词语,就加上向前的权值,其中,否定词和程度副词会有特殊的判别规则,否定词会导致权值反号,而程度副词则让权值加倍。最后,根据总权值的正负性来判断句子的情感。基本的算法如图。

    ★ 更新/新增情感词典库的方法:

    对所有词频为正和为负的分别统计各个词频,我们发现,新词语“黑心”在负面评论中出现很多次,但是在正面评论中几乎没有出现,那么我们就将黑心这个词语添加到我们的消极情感词典中。

    词典方法和机器学习方法的区别:(词典方法以SnowNLP为例)

    1. 使用词典不能区分情感上的程度级别,如“非常好看”和“好看”的情感判别概率分数是一样的

    2. 词典判断不出含否定词的情况

    3. 由于语义表达的丰富性,词典匹配会出现很大的误差,判断不出一些中性词或正词反用或反词正用的情况,如“油耗高”(高是正面的词汇,但表达的是负面的意思)、”话费减少了“(减少是负面的词汇,但表达的是正面的意思),【奥结局这类问题需要用到深度学习,机器学习可能也没办法完全解决】。而机器学习的方法精确度更高,可使用的场景更多样。无论是主客观分类还是正负面情感分类,机器学习都可以完成任务。

    4. 词典的语料是通用的,无论是手机、电脑这些商品,还是书评、影评这些语料,都可以适用。但机器学习则极度依赖语料,把手机语料训练出来的的分类器拿去给书评分类,那是注定要失败的。

    5. 词典匹配是直接计算文本中的情感词,得出它们的情感倾向分值。而机器学习方法的思路是先选出一部分表达积极情感的文本和一部分表达消极情感的文本,用机器学习方法进行训练,获得一个情感分类器。再通过这个情感分类器对所有文本进行积极和消极的二分分类。

    基于机器学习的方法:

    主要会用到nltk、scikit-learn(机器学习)或深度学习的程序包,参考http://www.360doc.com/content/16/0725/19/15165994_578332920.shtml

    nltk 主要负责处理特征提取(双词或多词搭配需要使用nltk 来做)和特征选择(需要nltk 提供的统计方法);

    scikit-learn 或深度学习包主要负责分类算法,评价分类效果,进行分类等任务。

    1.  有监督意味着需要人工标注,需要人为的给文本一个类标签 —— “积极”或“消极”

    2.  特征选择从评论中的所有切分后的单词、 双词搭配、三词搭配中挑选出合适的特征。

               比如这句话“手机非常好用!”,我给了它一个类标签“Positive”。里面有四个词(把感叹号也算上),“手机”,“非常”,“好用”,“!”。我可以认为这4个词都对分类产生了影响,都是分类的依据。也就是无论什么地方出现了这四个词的其中之一,文本都可以被分类为“积极”。这个是把所有词都作为分类特征

    3.   降维(词向量化):通过一定的统计方法找到信息量丰富的特征。

          特征降维说白了就是减少特征的数量。这有两个意义,一个是特征数量减少了之后可以加快算法计算的速度(数量少了当然计算就快了),另一个是如果用一定的方法选择信息量丰富的特征,可以减少噪音,有效提高分类的准确率。

     4. 转换成适合的特征形式:在使用分类算法进行分类之前,第一步是要把所有原始的语料文本转化为特征表示的形式。

         在NLTK 中,所选择作为特征词其形式是这样的:[ {“手机”: True, “非常”: True, “好用”: True, “!”: True} , positive]

     5. 把用特征表示之后的文本分成开发集测试集,把开发集分成训练集开发测试集。

     6. 用不同的分类算法给训练集构建分类器,用开发测试集检验分类器的准确度(选出最佳算法后可以调整特征的数量来测试准确度)。

    在选出最好的分类算法之后,就可以测试不同的特征维度对分类准确度的影响了。一般来说,特征太少则不足以反映分类的所有特点,使得分类准确率低;特征太多则会引入噪音,干扰分类,也会降低分类准确度。所以,需要不断的测试特征的数量,这样才可以得到最佳的分类效果。

     7. 选择出开发集中最佳的分类算法和特征维度,使用测试集检验得出情感分类的准确度。

    参考:

    1)https://blog.csdn.net/u012871493/article/details/72782744 

    2)https://www.jianshu.com/p/158c3f02a15b

    3)https://spaces.ac.cn/archives/3414

    展开全文
  • 基于谭松波老师的酒店评论数据集的中文文本情感分析,二分类问题 数据集标签有pos和neg,分别2000条txt文本 选择RNN、LSTM和Bi-LSTM作为模型,借助Keras搭建训练 主要工具包版本为TensorFlow 2.0.0、Keras 2.3.1和...
  • 本系统是基于svm训练得到的分类器,代码包含了数据集的预处理和模型训练,对给定测试集进行测试,并根据已有标签计算准确度。代码内有详细注释,下载即可运行。
  • 中文文本情感分析,可使用多种模型 使用bert模型进行训练测试,执行命令如下 python main.py --model bert 基于训练好的bert模型预测新数据,执行命令如下 python predict.py --model bert --predict "your ...
  • 文本情感分析作为NLP的常见任务,具有很高的实际应用价值。本文将采用LSTM模型训练一个能够识别文本postive, neutral, negative三种情感的分类器。
  • bert 情感分析训练When doing any Natural Language Processing (NLP) you will need to pre-process your data. In the following example I will be working with a Twitter dataset that is available from ...
  • NLP入门(十)使用LSTM进行文本情感分析

    千次阅读 多人点赞 2019-05-18 15:55:56
      文本情感分析(Sentiment Analysis)是自然语言处理(NLP)方法中常见的应用,也是一个有趣的基本任务,尤其是以提炼文本情绪内容为目的的分类。它是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的...
  • 文本情感分析综述

    万次阅读 2018-02-28 18:29:45
    摘要:文本情感分析:又称意见挖掘、倾向性分析等。简单而言,是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。互联网(如博客和论坛以及社会服务网络如大众点评)上产生了大量的用户参与的、对于诸如...
  • 最新的TensorFlow 中文数据集 基于 jieba 的中文处理工具 模型训练,模型保存,模型估计的完整实现
  • 文本分类模型 一、fastText https://fasttext.cc/docs/en/unsupervised-tutorial.html fastText模型架构: 其中x1,x2,…,xN−1,xN表示一个文本中的n-gram向量,每个特征是词向量的平均值。这和前文中提到的cbow相似,...
  • 不同性格用户所具有的语言表达方式不尽相同,现有情感分析工作很少考虑到用户性格,针对此问题,提出一种基于性格的微博情感分析模型PLSTM。该模型首先采用性格识别规则将微博文本分为五个性格集合和一个通用集合,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,188
精华内容 5,275
关键字:

文本情感分析模型训练