python自然语言情感_Python的潜在语义分析和情感分类-自然语言处理,LSA,情感分析..._weixin_39635314的博客-程序员宅基地

技术标签: python自然语言情感  

潜在语义分析(LSA)是用于通过应用于大型文本语料库的统计计算来提取和表示单词的上下文使用含义的理论和方法。

LSA是一种信息检索技术,它分析和识别非结构化文本集合中的模式以及它们之间的关系。

LSA本身是一种无监督的方式来发现文档集合中的同义词。

首先,我们来看看在自然语言处理中如何使用潜在语义分析来分析一组文档与它们包含的术语之间的关系。然后我们进一步分析和分类情绪。让我们开始把!

数据

该数据集包含超过500,000条来自亚马逊的精美食品评论,可从Kaggle下载。(需要注册才能下载哦)

import pandas as pd

df = pd.read_csv('Reviews.csv')

df.head()

TFIDF

TF-IDF是一种信息检索技术,它对术语的频率(TF)和逆文档频率(IDF)进行加权。每个单词都有各自的TF和IDF分数。单词的TF和IDF分数的乘积称为该单词的TFIDF权重,

简而言之,TFIDF得分(重量)越高,该词越少,反之亦然。

from sklearn.feature_extraction.text import TfidfVectorizer

tfidf = TfidfVectorizer()

tfidf.fit(df['Text'])

X = tfidf.transform(df['Text'])

df['Text'][1]

参考上面的句子,我们可以查看这句话中几个单词的tf-idf分数。

print([X[1,tfidf.vocabulary_['peanuts']]])

[0.37995462060339136]

print([X[1,tfidf.vocabulary_['jumbo']]])

[0.530965343023095]

print([X[1,tfidf.vocabulary_['error']]])

[0.2302711360436964]

在“花生”,“巨型”和“错误”这三个词中,tf-idf赋予“巨型”最高权重。为什么?这表明“巨型”比“花生”和“错误”更为罕见。这是如何使用tf-idf来指示文档集合中的单词或术语的重要性。

情感分类

为了对情绪进行分类,我们删除中性分数3,然后将分数4和5分组为正(1),将分数1和2分为负数(0)。简单清理后,这是我们要使用的数据。

import numpy as np

df.dropna(inplace=True)

df[df['Score'] != 3]

df['Positivity'] = np.where(df['Score'] > 3,1,0)

cols = ['Id','ProductId','UserId','ProfileName','HelpfulnessNumerator',

'HelpfulnessDenominator','Score','Time','Summary']

df.drop(cols,axis=1,inplace=True)

df.head()

训练集测试集分拆

from sklearn.model_selection import train_test_split

X = df.Text

y = df.Positivity

X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)

print("Train set has total {0} entries with {1:.2f}% negative,{2:.2f}% positive".format(len(X_train),

(len(X_train[y_train==0])/(len(X_train)*1.))*100,

(len(X_train[y_train==1])/(len(X_train)*1.))*100))

训练总数为426308,其中21.91%为负,78.09%为正。

print("Test set has total {0} entries with {1:.2f}% negative,

{2:.2f}% positive".format(len(X_test),

(len(X_test[y_test==0])/(len(X_test)*1.))*100,

(len(X_test[y_test==1])/(len(X_test)*1.))*100))

测试总数为142103,其中21.99%为负,78.01%为正。

您可能已经注意到我们的课程是不平衡的,负面与正面实例的比例是22:78。

解决不平衡类的策略之一是使用决策树算法,因此,我们使用随机森林分类器来学习不平衡数据并设置class_weight=balanced。

首先,定义一个函数来print出准确度分数。

from sklearn.feature_extraction.text import CountVectorizer

from sklearn.ensemble import RandomForestClassifier

from sklearn.pipeline import Pipeline

from sklearn.metrics import accuracy_score

def accuracy_summary(pipeline,X_train,y_train,X_test,y_test):

sentiment_fit=pipeline.fit(X_train,y_train)

y_pred=sentiment_fit.predict(X_test)

accuracy=accuracy_score(y_test,y_pred)

print("accuracy score:{0:.2f}%".format(accuracy*100))

return accuracy

要进行有效的情绪分析或解决任何NLP问题,我们需要很多功能。要弄清楚确切的功能数量并不容易。所以我们要尝试10000到30000。并print出与功能数量相关的准确度分数。

cv = CountVectorizer()

rf = RandomForestClassifier(class_weight="balanced")

n_features=np.arange(10000,30001,10000)

def nfeature_accuracy_checker(vectorizer=cv,n_features=n_features,

stop_words=None,ngram_range=(1,1),classifier=rf):

result=[]

print(classifier)

print("\n")

for n in n_features:

vectorizer.set_params(stop_words=stop_words,max_features=n,

ngram_range=ngram_range)

checker_pipeline=Pipeline([

('vectorizer',vectorizer),

('classifier',classifier)

])

print("Test result for {} features".format(n))

nfeature_accuracy=accuracy_summary(checker_pipeline,

X_train,y_train,X_test,y_test)

result.append((n,nfeature_accuracy))

return result

tfidf=TfidfVectorizer()

print("Result for trigram with stop words (Tfidf)\n")

feature_result_tgt =

nfeature_accuracy_checker(vectorizer=tfidf,ngram_range=(1,3))

太好了!

在我们完成之前,我们应该检测一下分类。

from sklearn.metrics import classification_report

cv = CountVectorizer(max_features=30000,ngram_range=(1,3))

pipeline=Pipeline([

('vectorizer',cv),

('classifier',rf)

])

sentiment_fit=pipeline.fit(X_train,y_train)

y_pred=sentiment_fit.predict(X_test)

print(classification_report(y_test,y_pred,target_names=['negative','positive']))

Chi-Squared用于特征选择

特征选择是机器学习中的一个重要问题。我将向您展示在我们的大规模数据集上进行基于卡方检验的特征选择是多么简单。

我们将计算所有特征的卡方分数,并可视化前20个,这里的术语或单词或N-gram是特征,正面和负面是两个类。给定一个特征X,我们可以使用卡方检验来评估其区分类的重要性。

from sklearn.feature_selection import chi2

import matplotlib.pyplot as plt

%matplotlib inline

plt.figure(figsize=(12,8))

scores=list(zip(tfidf.get_feature_names(),chi2score))

chi2=sorted(scores, key=lambda x:x[1])

topchi2=list(zip(*chi2[-20:]))

x=range(len(topchi2[1]))

labels=topchi2[0]

plt.barh(x,topchi2[1],align='center',alpha=0.5)

plt.plot(topchi2[1],x,'-o',markersize=5,alpha=0.8)

plt.yticks(x,labels)

plt.xlabel('$\chi^2$')

plt.show()

我们可以观察到,具有高χ2的特征可以被认为与我们正在分析的情感类相关。

例如,通过卡方检验选择的前5个最有用的特征是“不”,“失望”,“非常失望”,“不买”和“最差”。我认为它们大多来自负面评论。卡方检验选择的下一个最有用的功能是“很棒”,这肯定来自正面评价。

今天就是这样,很高兴听到任何问题或反馈。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39635314/article/details/110172114

智能推荐

2021-05-08_步入中年的狗的博客-程序员宅基地

33事实证明我得每天写csdn,因为少写了25号的,就少报了一天,245块啊啊啊啊啊啊啊啊啊够我4天的饭钱了,又不敢重新跟老大讲,哭泣。不过想想人生找到的第一份实习,竟然钱给的还好,不用打卡能偷偷溜出去,迟到也没被说过(每次都是意外迟到,很不好我知道),晚上很早出去吃饭也没事,有三周左右没写代码只是在看,公司作为作为做算法的不算小有名气,算个中厂?环境特别好(桌子宽靠窗户亮),mentor虽然知道我比较菜平时也很忙,但是跟我讲东西的时候非常耐心(我很笨,听不懂人话的那种),感觉增删改查熟悉了很多,组件啊

gradle 安装错误:JAVA_HOME is set to an invalid directory: /usr/lib/jvm/default-java_矛盾论的博客-程序员宅基地

fromhttp://blog.csdn.net/newchenxf/article/details/53169016手动安装gradle时, 即sudo apt-get install gradle然后,要使用gradle,输入 gradle -version,结果,出现了一下错误:[email protected]:~$ gradle --version

mysql tode_【20201007】Python操作MySQL数据库_Dewey Frank的博客-程序员宅基地

介绍介绍今天我们学习如何通过Python操作MySQL数据库。在Python2.7下使用的是pymysql这个软件包,跟着福哥来操作吧。安装安装pymysql直接使用pip安装即可pip insall pymysql授权MySQL数据库服务器默认只能在安装了数据库服务器的本机操作,也就是在TFLinux上操作,但是我们的python是安装在TFWindows上的啊!所以,我们要授权任何电脑都可以操...

UIAlertView和UIAlertController的封装_Babystyles的博客-程序员宅基地

在iOS开发过程会经常使用到提示框(UIAlertView),iOS 8之后UIAlertView便被UIAlertController所代替,下面我们就对两者进行相应的封装方便使用,这边把UIAlertView的代理封装成block回调方便使用,废话不多说上代码才是硬道理。

web渗透--漏洞扫描与利用杂论_owasp zap与awvs对比_lao_wine的博客-程序员宅基地

一、漏洞扫描原理 扫描器通过发送对应的验证数据到目标具体服务进行验证。当收到目标返回的响应与存在的漏洞响应一致时,表明有漏洞。二、漏洞扫描工具 1、漏洞扫描工具--nmap 使用nmap也可以进行漏洞扫描: nmap --script vuln 目标IP地址 2、漏洞扫描工具--Nessus三、漏洞利用--metasploit 1、利用Metasploit对扫描到的漏洞加以利用。 2、步骤: 1、终端输入...

随便推点

剑指offer------递归------斐波那契数列_剑指offer-斐波那契数列_Jack-Curry的博客-程序员宅基地

题目大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。(n<=39)斐波那契数列公式为:思路这道题递归很好写,但是存在很严重的效率问题。我们以求解f(10)为例类分析递归的求解过程。想求f(10),需要先求得f(9)和f(8)。同样,想求得f(9),需要先求的f(8)和f(7)....我们可以用树形结构来表示这种依赖关系,如下图所示:我...

分享个WIFI 一键配置原理-以ESP8266为例_esp8266wifi模块控制开关_Surferqing_的博客-程序员宅基地

1wifi模块可以连接路由器,是不是就能实现远程控制呢?         wifi模块可以连接路由器,说明实现路由器的局域网控制没有问题。 2 远程控制的过程中,自己家里面搭建服务器可以吗?        远程控制需要服务器,但是用户通过自己的电脑在家里搭建服务器实现的可能性很小,因为搭建服务器需要公网的Ip还有服务器相关的软件开发,并且维护过程是一个成本较高的开支。3 现在...

BMZCTF:2020sdnisc-损坏的流量包_ctf 流量包损坏_末 初的博客-程序员宅基地

http://bmzclub.cn/challenges#2020sdnisc-%E6%8D%9F%E5%9D%8F%E7%9A%84%E6%B5%81%E9%87%8F%E5%8C%851.pcapng无法使用wireshark打开可能破坏了pcapng的文件结构,但是应该不会破坏数据内容,尝试使用foremost看看能不能从这个数据包中分离出什么东西得到一个zip压缩包,解压得到key.txtZmxhZ3tzZG5pc2NfbmV0X3NRMlgzUTl4fQ==PS C:\User

异步上传文件报错,重复使用java流_jackson1024的博客-程序员宅基地

如果上传的时候,是同步上传的,不会出现问题。如果是异步上传的,如果你传入的异步方法是 MultipartFile file,就会包下面的错java.io.FileNotFoundException: D:\usr\local\tomcat\work\Tomcat\localhost\upload_46ba607a_d50c_4618_9b66_234953a0ba1f_00000002.tmp...

莫比乌斯函数_weixin_34370347的博客-程序员宅基地

在讲这个函数之前。最好先了解欧拉函数。我们用 \ 记为整除。 记得小学的时候整除和整除以的概念么?别混淆。 2整除4 记作 2\4。欧拉函数用来表示。那么根据法里级数的展开(这个感觉和ACM关系不大就先不介绍了。大概讲的就是构造所有最简分数的一种树。而法里级数n定义分母<=n的最简分数。)比如对于分母为12.化简后:分别为:1/12 1/6 1/...