自然语言处理——文本情感分析

文本情感分析:又称意见挖掘、倾向性分析等。简单而言,是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。互联网(如博客和论坛以及社会服务网络如大众点评)上产生了大量的用户参与的、对于诸如人物、事件、产品等有价值的评论信息。这些评论信息表达了人们的各种情感色彩和情感倾向性,如喜、怒、哀、乐和批评、赞扬等。基于此,潜在的用户就可以通过浏览这些主观色彩的评论来了解大众舆论对于某一事件或产品的看法。本文主要简述情感分析中的情感信息抽取,及文本粒度由大到小分别对情感分析方法进行对比和总结。


过程和环节:

1:收集数据集。采用用户评论和评分作为依据,通过样本数据训练分类来判断情感倾向

2:设计文本的表示模型。让机器读懂文本,是文本情感分析的基础首先要解决的是文本表示模型。向量表示文本,向量的特征是模型的最小单元。

3:选择文本的特征。中文分词(jieba,snownlp,thuLAC),将文本转换为词语。可以使用TF-IDF算法来抽取特征,并计算出特征值

4.选择分类模型:如 决策树,贝叶斯,人工神经网络,支持向量机等机器学习算法


示例代码:

import pandas as pd

from sklearn.cross_validation import train_test_split

import matplotlib.pyplot as plt

import os

#将文本转为小写,并且用空格对文本进行分割

from keras.preprocessing.text import text_to_word_sequence

import math

os.chdir("D:\python_workspace\sentimentClassification-master\data")

print("Loading data......")

#加载数据  训练集和测试集

train = pd.read_csv("train.csv")

test = pd.read_csv("test.csv")

# print(train.head(10))

# print(test.head(10))

print("#################")

#缺失值分析

print("train训练集的缺失值\n",train.isnull().sum())

print("test测试集的缺失值\n",test.isnull().sum())

#文本处理

train['comment_text_words']= train.comment_text.apply(text_to_word_sequence,filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n\'')

print("训练集中将文本转为小写,用空格分割\n",train.head())

test['comment_text_words'] = test.comment_text.apply(text_to_word_sequence, filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n\'')

print("测试集将文本转为小写,用空格分割\n",test.head())

# 将预训练好的 embeddings 进行处理,返回几个有用的变量:

# words_to_index:将单词和编号进行映射

# index_to_words:将编号和单词进行映射,与 words_to_index 相反

# word_to_vec_map:将单词与它的 embedding 进行映射

def read_glove_vecs(glove_file):

    with open(glove_file,"r",encoding="utf-8") as f:

        #将单词保存到一个集合中

        words = set()

        #将单词与embedding 的映射保存到一个字典中

        word_to_ver_map={}

        for line in f:

            line = line.strip().split()

            #列表的第一个元素是单词

            curr_word = line[0]

            #将单词假如到集合中

            words.add(curr_word)

            #列表的其他元素是embedding 将单词与embedding进行映射,然后存入在字典中

            word_to_ver_map[curr_word] =np.array(line[1:],dtype=np.float32)

    #将单词进行编号,编号从1开始

    i=1

    word_to_index={}

    index_to_words ={}

    for w in sorted(words):

        #创建映射,key是单词,value是编号

        word_to_index[w]=i

        #创建映射,key是编号,value是单词

        index_to_words[i]=w

        i=i+1

    return word_to_index,index_to_words,word_to_ver_map

# glove.6B.50d.txt 是网上已经预训练好的 word embedding 文件

word_to_index, index_to_word, word_to_vec_map = read_glove_vecs('glove.6B.50d.txt')

print("word_to_index:\n",word_to_index)

print("index_to_word:\n",index_to_word)

print("word_to_ver_map:\n",word_to_vec_map)

def sentences_to_indices(X):

    X_indices=[]

    for word in X:

        try:

            X_indices.append(word_to_index[word])

        except:

            pass

    return X_indices

test['comment_text_indexes'] = test.comment_text_words.apply(sentences_to_indices)

#文本长度分析

comment_text_max_words_length = np.max([np.max(train.comment_text_words.apply(lambda x: len(x)))

                                  , np.max(test.comment_text_words.apply(lambda x: len(x)))])

print("最大文本长度是 "+str(comment_text_max_words_length))

# 查看商品名的长度的分布

train.comment_text_words.apply(lambda x: len(x)).hist()

#文本长度集中在0-400之间,所以我们把最大文本长度设置为200

MAX_COMMENT_TEXT_SEQ = 200

# 如果列表长度大于最大长度,那么将列表进行裁剪,如果列表长度小于最大长度,那么将列表补充到最大长度,并且默认填充0

from keras.preprocessing.sequence import pad_sequences

def get_keras_data(dataset):

    X = {'comment_text': pad_sequences(dataset.comment_text_indexes, maxlen=MAX_COMMENT_TEXT_SEQ)}

    return X

# 将训练集数据的文本编号列表进行填充,并且提取出来

X_train = get_keras_data(train)

# 将测试集数据的文本编号列表进行填充,并且提取出来

X_test = get_keras_data(test)

#将处理好的数据保存起来

import pickle

datafile = open('data.pkl', 'wb')

pickle.dump(X_train, datafile)

pickle.dump(X_test, datafile)

pickle.dump(word_to_index, datafile)

pickle.dump(index_to_word, datafile)

pickle.dump(word_to_vec_map, datafile)

datafile.close()




(原码链接:https://pan.baidu.com/s/17dsY8Jr7HE3PD8r1sXH57A 密码:nd7p)

欢迎各位大神交流,交流QQ群:688933850

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,961评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,444评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,009评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,082评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,101评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,271评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,738评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,395评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,539评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,434评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,481评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,160评论 3 317
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,749评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,816评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,038评论 1 256
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,548评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,140评论 2 341

推荐阅读更多精彩内容

  • 转载自:https://districtdatalabs.silvrback.com/modern-methods...
    Traeyee阅读 1,320评论 0 0
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,271评论 0 10
  • 盛夏 一晃又来到了一年中最热的时节。 没错,和大家一样,西瓜空调冷饮就是夏天。 但我突然地,想要去感受一下这个盛夏...
    蜘蛛网_女士阅读 188评论 0 0
  • 人生活的是经历, 幸福总是在路上。 愿我们在充满阳光的路上, 自由行走, 向着理想、向着幸福向前, 向前!向前!
    袁益君阅读 238评论 1 1
  • 为什么要优化? 1. 提升网页加载速度 2. 对搜索引擎,屏幕阅读器友好 3. 提高可读性,可维护性 ...
    YM雨蒙阅读 367评论 0 1