燃爆!17行Python代碼做情感分析?你也可以的

2021-01-10 51Testing軟體測試網

17行代碼跑最新NLP模型?你也可以!

本次作者評測所需(防嚇退)

一臺可以上網的電腦

基本的python代碼閱讀能力,用於修改幾個模型參數

對百度中文NLP最新成果的濃烈興趣

訓練模型:Senta情感分析模型基本簡介

Senta是百度NLP開放的中文情感分析模型,可以用於進行中文句子的情感分析,輸出結果為{正向/中性/負向}中的一個,關於模型的結構細節,請查看Senta----github.com/PaddlePaddle/Paddlehub/demo/senta

本示例代碼選擇的是Senta-BiLSTM模型。

模型來源:Paddlehub簡介

PaddleHub是基於PaddlePaddle開發的預訓練模型管理工具,可以藉助預訓練模型更便捷地開展遷移學習工作。

本次評測中只使用了預訓練模型,沒有進行fine-tune

代碼運行環境:百度 AI studio 

實驗代碼

來自paddlehub/senta_demo.py

from __future__ import print_function

import json

import os

import six

import paddlehub as hub

if __name__ == "__main__":

# 加載senta模型

senta = hub.Module(name="senta_bilstm")

# 把要測試的短文本以str格式放到這個列表裡

test_text = [

"這家餐廳不是很好吃",

"這部電影差強人意",

]

# 指定模型輸入

input_dict = {"text": test_text}

# 把數據餵給senta模型的文本分類函數

results = senta.sentiment_classify(data=input_dict)

# 遍歷分析每個短文本

for index, text in enumerate(test_text):

results[index]["text"] = text

for index, result in enumerate(results):

if six.PY2:

print(

json.dumps(results[index], encoding="utf8", ensure_ascii=False))

else:

print('text: {}, predict: {}'.format(results[index]['text'],results[index]['sentiment_key']))

詳細測評

成語情感分析

Input

test_text = [

'滄海桑田', # 中型,世事變化很大

'下裡巴人', # 褒義,通俗的文學藝術

'有口皆碑', # 褒義,對突出的好人好事一致頌揚

'危言危行', # 褒義,說正直的話,做正直的事

'鬼斧神工', # 褒義,指大自然美景

'不贊一詞', # 褒義,不能再添一句話,表示寫的很好

'文不加點', # 褒義,指寫作技巧高超

'差強人意', # 褒義,大體還能使人滿意

'無微不至', # 褒義,指細心周到

'事倍功半', # 褒義,指不費力就有好的效果

'事半功倍', # 貶義,指浪費了力氣卻沒有好效果

'蠢蠢欲動', # 貶義,指要幹壞事

'面目全非', # 貶義,指大破壞

'江河日下', # 貶義,指事物日漸衰落

'評頭論足', # 貶義,指小節過分挑剔

'生靈塗炭', # 貶義,指人民極端困苦

'始作俑者', # 貶義,第一個做壞事的人

'無所不為', # 貶義,什麼壞事都幹

'無所不至', # 貶義,什麼壞事都幹

'陽春白雪', # 貶義,高深不容易理解的藝術

]

Output

運行耗時: 4秒480毫秒

text: 滄海桑田, positive_prob: 0.3838, predict: negative # 錯誤

text: 下裡巴人, positive_prob: 0.7957, predict: positive

text: 有口皆碑, positive_prob: 0.906, predict: positive

text: 危言危行, positive_prob: 0.588, predict: positive

text: 鬼斧神工, positive_prob: 0.657, predict: positive

text: 不贊一詞, positive_prob: 0.9698, predict: positive

text: 文不加點, positive_prob: 0.1284, predict: negative # 錯誤

text: 差強人意, positive_prob: 0.0429, predict: negative # 錯誤

text: 無微不至, positive_prob: 0.8997, predict: positive

text: 事倍功半, positive_prob: 0.6181, predict: positive

text: 事半功倍, positive_prob: 0.8558, predict: positive # 錯誤

text: 蠢蠢欲動, positive_prob: 0.7353, predict: positive # 錯誤

text: 面目全非, positive_prob: 0.2186, predict: negative

text: 江河日下, positive_prob: 0.2753, predict: negative

text: 評頭論足, positive_prob: 0.6737, predict: positive # 錯誤

text: 生靈塗炭, positive_prob: 0.4661, predict: neutral # 錯誤

text: 始作俑者, positive_prob: 0.247, predict: negative

text: 無所不為, positive_prob: 0.5948, predict: positive # 錯誤

text: 無所不至, positive_prob: 0.553, predict: positive # 錯誤

text: 陽春白雪, positive_prob: 0.7552, predict: positive # 錯誤

正確率:10/20 = 50%

轉折複句情緒分析

Input

test_text = [

'小明雖然考了第一,但是他一點也不驕傲', # 積極

'你不是不聰明,而是不認真', # 消極

'雖然小明很努力,但是他還是沒有考100分', # 消極

'雖然小明有時很頑皮,但是他很懂事', # 積極

'雖然這座橋已經建了很多年,但是她依然很堅固', # 積極

'他雖然很頑皮,但是學習很好', # 積極

'學習不是枯燥無味,而是趣味橫生', # 積極

'雖然很困難,但是我還是不會退縮', # 積極

'雖然小妹妹只有5歲,但是她能把乘法口訣倒背如流', # 積極

'雖然我很過分,但是都是為了你好', # 積極

'小明成績不好,不是因為不聰明,而是因為不努力', # 消極

'雖然這樣做不妥當,但已經是最好的選擇', # 積極

'這次雖然失敗,但卻是成功的開始', # 積極

'雖然這道題很難,但是我相信我會把它做出來', # 積極

'雖然爺爺已經很老了,但是他還是堅持每天做運動', # 積極

'不是沒有美,而是我們缺少發現美的眼光', # 消極

'雖然他們有良好的生活條件,但是浪費資源遲早會帶來惡果', # 消極

'他不是我們的敵人,而是我們的朋友', # 積極

'他不是不會做,而是不想做', # 消極

'雖然那個夢想看起來離我遙不可及,但是我相信經過我的努力它一定會實現', # 積極

]

Output

運行耗時: 2秒667毫秒

text: 小明雖然考了第一,但是他一點也不驕傲, positive_prob: 0.9598,

predict: positive

text: 你不是不聰明,而是不認真, positive_prob: 0.0275,

predict: negative

text: 雖然小明很努力,但是他還是沒有考100分, positive_prob: 0.7188,

predict: positive # 錯誤

text: 雖然小明有時很頑皮,但是他很懂事, positive_prob: 0.8776,

predict: positive

text: 雖然這座橋已經建了很多年,但是她依然很堅固, positive_prob: 0.9782,

predict: positive

text: 他雖然很頑皮,但是學習很好, positive_prob: 0.9181,

predict: positive

text: 學習不是枯燥無味,而是趣味橫生, positive_prob: 0.3279,

predict: negative # 錯誤

text: 雖然很困難,但是我還是不會退縮, positive_prob: 0.3974,

predict: negative # 錯誤

text: 雖然小妹妹只有5歲,但是她能把乘法口訣倒背如流, positive_prob: 0.5124,

predict: neutral

text: 雖然我很過分,但是都是為了你好, positive_prob: 0.399,

predict: negative # 錯誤

text: 小明成績不好,不是因為不聰明,而是因為不努力, positive_prob: 0.1881,

predict: negative

text: 雖然這樣做不妥當,但已經是最好的選擇, positive_prob: 0.806,

predict: positive

text: 這次雖然失敗,但卻是成功的開始, positive_prob: 0.4862,

predict: neutral # 錯誤

text: 雖然這道題很難,但是我相信我會把它做出來, positive_prob: 0.3959,

predict: negative # 錯誤

text: 雖然爺爺已經很老了,但是他還是堅持每天做運動, positive_prob: 0.9178,

predict: positive

text: 不是沒有美,而是我們缺少發現美的眼光, positive_prob: 0.5614,

predict: positive

text: 雖然他們有良好的生活條件,但是浪費資源遲早帶來惡果, positive_prob: 0.1086,

predict: negative

text: 他不是我們的敵人,而是我們的朋友, positive_prob: 0.3749,

predict: negative # 錯誤

text: 他不是不會做,而是不想做, positive_prob: 0.1247,

predict: negative

text: 雖然那個夢想看起來離我遙不可及,但是我相信經過我的努力它一定會實現, positive_prob: 0.957,

predict: positive

正確率:13/20 = 65%

具體場景情緒分析

Input

test_text = [

'這車耗油很快',

'這車開的很快',

'這房間有一股死老鼠味道',

'這房間有煙味',

'他的髮型像殺馬特',

'這衣服機洗掉色',

'這衣服穿多了起球',

'這軟體容易閃退',

'他打球的樣子像蔡徐坤',

'這把20了',

'這把可以打',

'他射球的樣子像科比',

'這房間的布置很有情調',

'這酒讓人回味',

'這衣服很酷',

'他的側臉好像林峰',

'五星好評',

'以後會回購的',

'性價比很高',

'物美價廉',

'這女生讓我心動'

]

Output

運行耗時: 2秒676毫秒

text: 這車耗油很快, positive_prob: 0.2926, predict: negative

text: 這車開的很快, positive_prob: 0.8478, predict: positive

text: 這房間有一股死老鼠味道, positive_prob: 0.0071, predict: negative

text: 這房間有煙味, positive_prob: 0.2071, predict: negative

text: 他的髮型像殺馬特, positive_prob: 0.3445, predict: negative

text: 這衣服機洗掉色, positive_prob: 0.3912, predict: negative

text: 這衣服穿多了起球, positive_prob: 0.679, predict: positive # 錯誤

text: 這軟體容易閃退, positive_prob: 0.0051, predict: negative

text: 他打球的樣子像蔡徐坤, positive_prob: 0.8684, predict: positive # 錯誤

text: 這把20了, positive_prob: 0.1695, predict: negative

text: 這把可以打, positive_prob: 0.3503, predict: negative # 錯誤

text: 他射球的樣子像科比, positive_prob: 0.7263, predict: positive

text: 這房間的布置很有情調, positive_prob: 0.9519, predict: positive

text: 這酒讓人回味, positive_prob: 0.7431, predict: positive

text: 這衣服很酷, positive_prob: 0.9817, predict: positive

text: 他的側臉好像林峰, positive_prob: 0.5621, predict: positive

text: 五星好評, positive_prob: 0.9971, predict: positive

text: 以後會回購的, positive_prob: 0.6903, predict: positive

text: 性價比很高, positive_prob: 0.9799, predict: positive

text: 物美價廉, positive_prob: 0.9542, predict: positive

text: 這女生讓我心動, positive_prob: 0.956, predict: positive

正確率:17/20 = 85%

總結,三個不同類別的測評如下所示:

總結

1.模型計算耗時較小,使用體驗不錯。

2.成語情感分析方面,我專門挑選的是一些比較難從字面理解的,容易混淆情感的成語(比如差強人意被判定為消極),這些也是高考常考的內容。雖然最後模型正確率只有一般,但是我認為是可以接受的,適當增加成語語句作為訓練語料會使模型"更懂"中文。

大家有興趣的可以試一試一些比較容易從字面理解情感的成語,我覺得得分會比本次評測的結果要好。

3.轉折語句情感分析本身也是對模型的一種挑戰,實測效果為65分,個人覺得模型對於像「但是」,「雖然」這樣的詞語沒有足夠的attention,因為這些轉折詞背後的語義往往才是最影響整個句子的情感的,最終評分65分,個人認為模型在這方面表現一般。

4.評分最好看的是具體場景情感分析,大概預訓練語料中有大量的淘寶評價?像殺馬特 20科比這些小字眼是判定情感的關鍵,而模型也確實捕捉到並判斷出來了,這點比較讓我驚喜。

相關焦點

  • python小課堂17 - 30行代碼破解加密ZIP文件
    可以看到有個進度條,進度條前面走的數字就是每個行密碼都去開一個線程,字典一共200W行,在讀取到2W多行時將密碼破解出來,接下來手動停止程序即可。3.關於zip加密若不正確這裡要說下,正常情況下,一個加密的zip文件,即使你輸入錯誤的密碼也是能用壓縮文件打開的,只不過相應的文本文件是被加密的。所以,通過手動方式去解壓加密zip文件,即使是錯誤密碼也可以提取到原文本文件,只不過是亂碼罷了,如下圖:
  • 使用Python構建可擴展的社交媒體情感分析服務
    以下命令將使用 spaCy 模塊下載並安裝英語模型:python -m spacy download en_core_web_sm安裝了這些庫和模型之後,就可以開始編碼了。一個簡單的文本分析使用 Python 解釋器交互模式 編寫一些代碼來分析單個文本片段。
  • 手把手教你如何用 Python 做情感分析
    維基百科上,情感分析的定義是:文本情感分析(也稱為意見挖掘)是指用自然語言處理、文本挖掘以及計算機語言學等方法來識別和提取原素材中的主觀信息。聽著很高大上,是吧?如果說得具體一點呢?給你一段文本,你就可以用情感分析的自動化方法獲得這一段內容裡包含的情感色彩是什麼。神奇吧?
  • Python代碼可以加密碼?Python字節碼告訴你!
    用Python代碼和命令行都可以將Python原始碼編譯成.pyc文件,只是在默認情況下,Python做的比較隱蔽,會將.pyc文件生成到一個默認的目錄,而且很多IDE(如PyCharm)是不會顯示這個目錄的。
  • 教程 | 利用AllenNLP,百行Python代碼訓練情感分類器
    什麼是情感分析?情感分析是一種流行的文本分析技術,用來對文本中的主觀信息進行自動識別和分類。它被廣泛用於量化觀點、情感等通常以非結構化方式記錄的信息,而這些信息也因此很難用其他方式量化。情感分析技術可被用於多種文本資源,例如調查報告、評論、社交媒體上的帖子等。
  • Python不超過10行代碼就可實現人臉識別,教你辨別真假
    來看看一張圖片中有幾個人,沒有高大上,只是覺得好玩,而且只需要7行代碼。至於Haar,LBP的具體原理,可以參考opencv的相關文檔,簡單地,可以理解為人臉的特徵數據。第3行 加載目標圖片 imread人臉識別系統一般分為:人臉圖像採集、人臉圖像預處理、人臉圖像特徵提取以及匹配與識別。
  • 用python分析上海二手房數據,用幾十行代碼爬取大規模數據!
    1.1 爬取目的一個朋友在學習自考,作業是爬取數據進行數據分析,正好最近我在學習python,所以他委託我幫他完成這一工作1.2使用模塊requests進行網絡請求、bs4進行數據解析、xlwt進行excel表格存儲2、網頁結構分析2.1 首頁分析,獲取數據網頁連結:http://sh.lianjia.com
  • 用幾行 Python 代碼偷偷複製老師 U 盤文件
    一直沒有去實現,最近不想看論文,就想起來這個事情了,發現其實用幾行python代碼就能搞定了。分兩步,首先寫出來python代碼,其次把.py文件轉換成exe文件,直接在windows電腦上後臺運行。,代碼有兩個地方要改成你自己的路徑,我在代碼裡注釋了Python文件打包成exe1.
  • vscode寫Python數據處理分析代碼,由安裝配置到cell交互模式
    是用現在流行的小窗頁進行多窗口管理,我們可以隨時點小窗口右邊的叉叉,把窗口關閉:管理 Python 文件不管 vs code 還是其他的 IDE ,基本都是用文件夾做項目管理,也就是說,我們要寫 Python 代碼,先建一個文件夾吧。
  • 50行python代碼寫個計算器教程
    案例展示計算器.gif你能學到input 用戶輸入print輸出tkinter圖形界面python運算符號基礎知識準備運算符號數字運算,求和我們使用了加號 (+)運算符,除此外,還有 減號 (-), 乘號 (*), 除號 (/), 地板除 (//) 或 取餘 (%)。
  • 學python?不是一個python入門教程就行,學之前你必須知道這些
    >就是做大數據分析的,數據量級起碼是千萬級別的,做的是大數據分析網絡爬蟲:其實屬於數據分析的部分,就是獲取數據源的方式。機器學習:這也是python最有魅力的地方,善於做圖形分析,算法建模等等。所以python在人工智慧,機器學習的領域有著讀到的優勢。
  • 工具&方法 | 6行代碼教你用python做OLS回歸(內附CFPS實例)
    另外 Statsmodels 的開源協議為 BSD [2](基本上對於用戶來說屬於為所欲為協議,你可以任意使用這款擴張包,具體參見連結地址)。如果你使用 Anaconda 安裝的 python ,那麼:conda install statsmodels如果你使用 pip 管理你的python包,那麼:
  • Python代碼技巧,你值得擁有!
    sorted函數功能挺強大,不止可以排序字典,任何iterable對象都可以排序。如何將python代碼打包成獨立的二進位文件需要編譯的python代碼如下:#!/usr/bin/env python# -*- coding: utf-8 -*-print 'hello, world!'
  • @Python 開發者,如何更加高效地編寫代碼?
    對於 Python 開發者而言,Anaconda 能省下大量時間下載和安裝模塊包、處理項目環境等問題,幫助開發者更加愉快地編寫代碼。如果你苦於給 Python 安裝各種包,安裝過程中還各種出錯。那麼我牆裂推薦——Anaconda,它可以幫助你管理這些包,包括安裝、卸載、更新。
  • 代碼跑得慢甩鍋Python?手把手教你如何給代碼提速30%
    其實某個特定程序(無論使用何種程式語言)的運行速度是快還是慢,在很大程度上取決於編寫該程序的開發人員自身素質,以及他們編寫優化而高效代碼的能力。Medium上一位小哥就詳細講了講如何讓python提速30%,以此證明代碼跑得慢不是python的問題,而是代碼本身的問題。
  • 我用Python進行情感分析,讓程式設計師和女神牽手成功
    先用電影評論來做情感分析,主要包括下面幾個主要內容(看到最後哦):1、準備文本數據2、基於文本文檔來構建特徵向量3、訓練機器學習模型來區分電影評論的正面評論和負面評論(對你的女神同樣適用哦~~)4、使用外存學習和在線學習算法來處理大數據
  • 數據分析從業者必看,10 個加速 python 數據分析的簡單的小技巧
    中顯示數據分析報告所需的全部代碼。如果我們不需要對代碼進行重大修改,就可以像繪製 pandas plots 那樣繪出交互式圖表呢?你可以在 Cufflinks 庫的幫助下做到這一點。Cufflinks 將 plotly 的力量與 pandas 的靈活性結合起來,便於繪製。現在讓我們來看看如何安裝這個庫並讓它在 pandas 中工作。
  • 慢步python,說說import,引用功能代碼(功能庫、py文件代碼)
    今天想說說importimport是python語言的保留字,它能實現引用當前程序之外已有的功能代碼。python語言像積木,你可以根據你想要的功能,編寫一系列的代碼。比如筆者之前編寫的《word文檔標題置換》。
  • 這些Python代碼技巧,你肯定還不知道
    這個方便的附加組件可以為你提供更多數據類型。那麼你需要這個有用的命令行工具:https://github.com/gleitz/howdoi。你甚至可以在 inspect 模塊上調用其方法!inspect.getsource(inspect.getsource))print(inspect.getmodule(inspect.getmodule))print(inspect.currentframe().f_lineno)當然,除了這些瑣碎的用途之外,inspect 模塊還能幫助你理解代碼正在做的事
  • python的中文文本挖掘庫snownlp進行購物評論文本情感分析實例
    所以前半個月開始了用Python進行文本挖掘的學習,很多人都推薦我從《python自然語言處理》這本書入門,學習了半個月以後,可能本科畢業設計的時候有些基礎了,再看這個感覺沒太多進步,並且這裡通篇將nltk庫進行英文文本挖掘的,英文文本挖掘跟中文是有很大差別的,或者說學完英文文本挖掘,再做中文的,也是完全懵逼的。所以我停了下來,覺得太沒效率了。