小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

如何做中文文本的情感分析?

 老馬的程序人生 2021-05-11

如何做中文文本的情感分析?

這是本學(xué)期在大數(shù)據(jù)哲學(xué)與社會(huì)科學(xué)實(shí)驗(yàn)室做的第三次分享了。

第一次分享的是:如何利用“wordcloud+jieba”制作中文詞云?

第二次分享的是:如何爬取知乎中問題的回答以及評(píng)論的數(shù)據(jù)?

本次給大家分享兩種實(shí)現(xiàn)中文文本情感分析的方式,第一種是借助百度AI平臺(tái)的文本情感分析,第二種是使用snownlp的文本情感分析。

1. 百度AI平臺(tái)的文本情感分析

使用百度AI平臺(tái)的文本情感分析主要分為兩個(gè)步驟,第一步是創(chuàng)建一個(gè)賬號(hào),第二步是根據(jù)SDK調(diào)用平臺(tái)提供的API函數(shù)進(jìn)行情感分析。

第一步:創(chuàng)建賬號(hào)

首先,我們打開百度AI網(wǎng)站,然后點(diǎn)擊控制臺(tái)。

http://ai.baidu.com/

跳轉(zhuǎn)到登陸界面,輸入賬號(hào)密碼后,跳轉(zhuǎn)到管理界面,此時(shí)我們點(diǎn)擊自然語(yǔ)言處理。進(jìn)入到自然語(yǔ)言處理應(yīng)用界面。

然后創(chuàng)建一個(gè)應(yīng)用(如已創(chuàng)建好,就點(diǎn)擊管理應(yīng)用)。

創(chuàng)建好后,進(jìn)入到應(yīng)用列表中,記下來(lái)AppID、API KeySecret Key這三個(gè)參數(shù)的值。在后面對(duì)API進(jìn)行調(diào)用的時(shí)候需要用到這三個(gè)參數(shù)。

第二步:進(jìn)行文本情感分析

有關(guān)百度AI平臺(tái)的自然語(yǔ)言處理的SDK(Software Development Kit)文檔見如下網(wǎng)址:

http://ai.baidu.com/ai-doc/NLP/tk6z52b9z

這份SDK文檔,包括了詞法分析、詞向量表示、詞義相似度、短文本相似度、評(píng)論觀點(diǎn)抽取、情感傾向分析、文章標(biāo)簽、文章分類、文本糾錯(cuò)、中文分詞、詞性標(biāo)注、新聞?wù)?、地址識(shí)別等常用NLP功能。有關(guān)這些功能的使用,我們后面再來(lái)寫圖文進(jìn)行詳細(xì)介紹,下面只介紹情感分析功能。

首先,我們先安裝要使用到的庫(kù)。

pip install baidu-aip

安裝好后,我們就可以調(diào)用API函數(shù)來(lái)對(duì)包含主觀觀點(diǎn)信息的文本進(jìn)行情感極性類別(積極、消極、中性)的判斷了,代碼如下:

from aip import AipNlp

""" 你的 APPID AK SK """
APP_ID = '你的APP_ID'
API_KEY = '你的API_KEY'
SECRET_KEY = '你的SECRET_KEY'

client = AipNlp(APP_ID, API_KEY, SECRET_KEY)
text = "王建紅真帥"

""" 調(diào)用情感傾向分析 """
dict = client.sentimentClassify(text)
print(dict)

sentimentClassify(text)函數(shù):用于對(duì)文本的情感分析,參數(shù)text是進(jìn)行分析的文本內(nèi)容(GBK編碼),最大2048字節(jié)。

它的返回示例:

{
    'log_id'5284845474026755873,
    'text''王建紅真帥',
    'items': [
    {
        'positive_prob'0.999855,   #表示屬于積極類別的概率
        'negative_prob'0.000144523,  #表示屬于消極類別的概率
        'confidence'0.999679,   #表示分類的置信度
        'sentiment'2     #表示情感極性分類結(jié)果
    }
  ]
}

返回?cái)?shù)據(jù)參數(shù)詳情如下:

參數(shù)類型說(shuō)明
textstring輸入的文本內(nèi)容
itemsarray輸入的詞列表
+sentimentnumber表示情感極性分類結(jié)果, 0:負(fù)向,1:中性,2:正向
+confidencenumber表示分類的置信度
+positive_probnumber表示屬于積極類別的概率
+negative_probnumber表示屬于消極類別的概率

【例子】測(cè)試一個(gè)有關(guān)中醫(yī)的文本

text = u"因?yàn)橹嗅t(yī)自己都不認(rèn)可自己,你就別為難外人了。中醫(yī)們嘴上吹噓自己有多厲害," \
       u"實(shí)際上,他們能當(dāng)上中醫(yī),還得西醫(yī)給他們體檢合格了才能入職。中醫(yī)理論不能指導(dǎo)中醫(yī)入職體檢," \
       u"中醫(yī)術(shù)語(yǔ)不能用于中醫(yī)入職體檢報(bào)告,甚至中醫(yī)死了,他的死亡證明也和中醫(yī)理論與術(shù)語(yǔ)沒什么關(guān)系。" \
       u"你看中醫(yī)自己都不用,只能說(shuō)明中醫(yī)藥是專供中醫(yī)粉的。"

dict = client.sentimentClassify(text)
print(dict['items'])
# [{'positive_prob': 1.76205e-05, 'confidence': 0.999961, 'negative_prob': 0.999982, 'sentiment': 0}]

我們可以發(fā)現(xiàn)這段關(guān)于中醫(yī)的描述偏消極('sentiment': 0)。

2. 使用snownlp的文本情感分析

Python有一個(gè)第三方庫(kù)snownlp,它是專門用來(lái)處理中文文本內(nèi)容的庫(kù),有中文分詞(s.words)、詞性標(biāo)注(s.tags)、情感分析(s.sentiments)、提取關(guān)鍵詞(s.keywords())等功能。

首先,我們先安裝要使用到的庫(kù)(安裝后可以直接用)。

pip install snownlp

安裝好后,我們就可以調(diào)用函數(shù)來(lái)對(duì)包含主觀觀點(diǎn)信息的文本進(jìn)行情感分析了,它會(huì)計(jì)算出文本語(yǔ)義接近積極的概率,越接近0情感表現(xiàn)越消極,越接近1情感表現(xiàn)越積極。代碼如下:

from snownlp import SnowNLP

text = "王建紅真帥"
s = SnowNLP(text)
print(text, s.sentiments)

# 王建紅真帥 0.868676346818001

【例子】測(cè)試一個(gè)有關(guān)中醫(yī)的文本

from snownlp import SnowNLP

text = u"因?yàn)橹嗅t(yī)自己都不認(rèn)可自己,你就別為難外人了。中醫(yī)們嘴上吹噓自己有多厲害," \
       u"實(shí)際上,他們能當(dāng)上中醫(yī),還得西醫(yī)給他們體檢合格了才能入職。中醫(yī)理論不能指導(dǎo)中醫(yī)入職體檢," \
       u"中醫(yī)術(shù)語(yǔ)不能用于中醫(yī)入職體檢報(bào)告,甚至中醫(yī)死了,他的死亡證明也和中醫(yī)理論與術(shù)語(yǔ)沒什么關(guān)系。" \
       u"你看中醫(yī)自己都不用,只能說(shuō)明中醫(yī)藥是專供中醫(yī)粉的。"

s = SnowNLP(text)

for sentence in s.sentences:
    print(sentence, SnowNLP(sentence).sentiments)

# 因?yàn)橹嗅t(yī)自己都不認(rèn)可自己 0.816024132542549
# 你就別為難外人了 0.6792294609027675
# 中醫(yī)們嘴上吹噓自己有多厲害 0.32479885192764957
# 實(shí)際上 0.478723404255319
# 他們能當(dāng)上中醫(yī) 0.7191238537063072
# 還得西醫(yī)給他們體檢合格了才能入職 0.2899327459226514
# 中醫(yī)理論不能指導(dǎo)中醫(yī)入職體檢 0.9719464371262481
# 中醫(yī)術(shù)語(yǔ)不能用于中醫(yī)入職體檢報(bào)告 0.9964791023333988
# 甚至中醫(yī)死了 0.5308849018309401
# 他的死亡證明也和中醫(yī)理論與術(shù)語(yǔ)沒什么關(guān)系 0.994350435104035
# 你看中醫(yī)自己都不用 0.6714833680109371
# 只能說(shuō)明中醫(yī)藥是專供中醫(yī)粉的 0.9076878772503925

print(s.sentiments)
# 0.9999999813523964

from snownlp import sentiment

sen = sentiment.classify(text)
print(sen)
# 0.9999999813523964

我們看到snownlp的情感分析結(jié)果與百度AI的情感分析結(jié)果相反。所以,在實(shí)際的項(xiàng)目中,需要根據(jù)實(shí)際的數(shù)據(jù)重新訓(xùn)練情感分析的模型。

首先,我們看一下snownlp的語(yǔ)料庫(kù):

C:\ProgramData\Anaconda3\Lib\site-packages\snownlp

sentiments目錄下有5個(gè)文件,其中__init__.py是程序,neg.txtpos.txt分別是消極和積極語(yǔ)料庫(kù)(也就是用來(lái)訓(xùn)練的數(shù)據(jù)集)sentiment.marshal.3sentiment.marshal是訓(xùn)練保存的模型。(python2保存的是sentiment.marshal;python3保存的是sentiment.marshal.3)。

其次,我們看一下__init__.py文件中的代碼。

data_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
                         'sentiment.marshal')

class Sentiment(object):

    def __init__(self):
        self.classifier = Bayes()  # 使用的是Bayes的模型

    def save(self, fname, iszip=True):
        self.classifier.save(fname, iszip)  # 保存最終的模型

    def load(self, fname=data_path, iszip=True):
        self.classifier.load(fname, iszip)  # 加載貝葉斯模型

    # 分詞以及去停用詞的操作    
    def handle(self, doc):
        words = seg.seg(doc)  # 分詞
        words = normal.filter_stop(words)  # 去停用詞
        return words  # 返回分詞后的結(jié)果

    def train(self, neg_docs, pos_docs):
        data = []
        # 讀入負(fù)樣本
        for sent in neg_docs:
            data.append([self.handle(sent), 'neg'])
        # 讀入正樣本
        for sent in pos_docs:
            data.append([self.handle(sent), 'pos'])
        # 調(diào)用的是Bayes模型的訓(xùn)練方法
        self.classifier.train(data)

    def classify(self, sent):
        # 1、調(diào)用sentiment類中的handle方法
        # 2、調(diào)用Bayes類中的classify方法
        ret, prob = self.classifier.classify(self.handle(sent))  # 調(diào)用貝葉斯中的classify方法
        if ret == 'pos':
            return prob
        return 1 - probclass
        Sentiment(object):

classifier = Sentiment()
classifier.load()


def train(neg_file, pos_file):
    neg_docs = codecs.open(neg_file, 'r''utf-8').readlines()
    pos_docs = codecs.open(pos_file, 'r''utf-8').readlines()
    global classifier
    classifier = Sentiment()
    classifier.train(neg_docs, pos_docs)


def save(fname, iszip=True):
    classifier.save(fname, iszip)


def load(fname, iszip=True):
    classifier.load(fname, iszip)


def classify(sent):
    return classifier.classify(sent)

從上述的代碼中,classify函數(shù)和train函數(shù)是兩個(gè)核心的函數(shù),其中,train函數(shù)用于訓(xùn)練一個(gè)情感分類器,classify函數(shù)用于預(yù)測(cè)。在這兩個(gè)函數(shù)中,都同時(shí)使用到的handle函數(shù),handle函數(shù)的主要工作為:對(duì)輸入文本分詞和去停用詞。

了解snownlp的語(yǔ)料庫(kù)以及訓(xùn)練的代碼之后,就可以用自己的語(yǔ)料庫(kù)進(jìn)行訓(xùn)練了。訓(xùn)練的過程大致分為如下的幾個(gè)步驟:

  • 準(zhǔn)備正負(fù)樣本,并分別保存,如正樣本保存到pos.txt,負(fù)樣本保存到neg.txt;
  • 利用snownlp訓(xùn)練新的模型;
  • 保存好新的模型;

重新訓(xùn)練情感分析的代碼如下:

from snownlp import sentiment

# 重新訓(xùn)練模型
sentiment.train('./neg.txt''./pos.txt')
# 保存好新訓(xùn)練的模型
sentiment.save('sentiment.marshal')

訓(xùn)練完成后,可以把sentiment.marshal復(fù)制到sentiments目錄下替換原來(lái)的或者改變讀取模型的路徑。

# data_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
#                         'sentiment.marshal')

data_path = '這里填入新模型的路徑'

經(jīng)過以上操作,就可以利用新的模型來(lái)做情感分析了。

3. 總結(jié)

本文介紹了兩種對(duì)文本進(jìn)行情感分析的方式,大家可以根據(jù)自身喜好來(lái)進(jìn)行選擇。百度AI的自然語(yǔ)言處理和snownlp庫(kù),不止這一種功能,后面我會(huì)寫一系列圖文來(lái)介紹它們的使用方法。


    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多