電影評論人名抽取與情感分析

電影評論的數據挖掘是我一直以來的項目。最近的剛完成的一個工作是於分析影評中表露出來的對演員角色的情感傾向。主要的工作便是識別評論中人名+情感分析。

評論人名抽取與情感分析

影迷用戶的電影評論中往往包含大量對本部電影中演員的評價和看法,爲了瞭解觀衆對一位演員的情感傾向,我們首先需要識別一位演員在衆多評論中的稱呼、叫法,接着再在涉及該演員的相關短句中判斷情感。

主流的命名實體識別方法及其存在的問題

目前效果比較好的命名實體識別方法主要採用隱馬爾科夫模型(HMM)和條件隨機場(CRF)模型。基於HMM的NE識別問題就是如何在給定的模型下,從一定的觀察序列(評論句子)的所有可能的狀態下,選取最有可能的標記序列,如圖一。而條件隨機場是一種用於在給定輸入結點值時計算指定輸出結點值的條件概率的無向圖模型。與HMM相比,CRF不需要嚴格的獨立性假設條件,CRF是在給定需要標記的觀察序列的條件下,計算整個標記序列的聯合概率分佈,而不是給定當前狀態條件下,定義下一個狀態的分佈,如圖二所示。因而,CRF能夠更好地利用待識文本上下文的信息,識別的準確率更高。

HMM
圖一:HMM模型示意圖

CRF
圖二:CRF模型示意圖

然而由於電影評論的特殊性,評論中包含大量暱稱、簡稱還有不少需要背景知識的稱呼,例如在電影《戰狼2》的豆瓣影評中很多人評價演員張翰時用的是“瀚哥”(暱稱)、“熊孩子”(與影片中飾演的角色有關)、”塘主“(演員以前飾演過其他角色)等等。通過百度百科我們能夠獲取影片中演員及其角色名,如何將上述稱呼與對應的演員掛鉤是解決電影評論領域命名實體識別的重要難點。此外,部分稱呼會被hanlp標記爲“nz”,即專有名詞。導致只保留標記爲“nr”(即人名)的詞語雖然有較高的準確率,召回率卻不盡人意。

這裏寫圖片描述

人名識別的算法思路

通過對大量評論句子的切詞效果的觀察和分析,我們發現被錯分爲“專有名詞”的稱呼主要有兩種情況:一、簡稱或暱稱,如“大冪冪”,“冪”都指的是“楊冪”。二、具有背景知識的其他稱呼,如吳剛被叫做“達康書記”,“劉亦菲”也被很多人稱呼爲“茜茜”。
對此我們採用計算、篩選詞語與已確定的演員名字的jaccard相似度及網頁搜索匹配的方法,於詞性標記爲”nz”的詞語中提取演員相關稱呼。
同時,爲了儘可能多地獲取正確的相關名稱,我們依然會使用HMM分詞器。如圖三所示,存在部分詞語被CRF過濾掉但是HMM模型識別出來。

錯分詞語特徵

圖三:CRF與HMM的識別效果圖

算法思路如下:(相關代碼我都放在我的Github上啦)

  • 從百度百科上獲取一部電影的演員名字及其對應角色名N,N = {n1, n2, n3 ,……}。
  • 對於每一條評論,將CRF分詞器標記爲“專有名詞”的詞語記爲CZ,CZ = {cz1, cz2…..},同樣的CRF分詞器標記爲“人名”的詞語爲CR,HMM分詞器標記爲“專有名詞”和“人名”的分別爲HZ,HR。
  • 算法首先通過計算最小編輯距離和相似度將CRF識別出來部分專有名詞和HMM模型識別出來的部分詞語提取到人名隊列。取相似度閾值爲0.1,可以粗粒度過濾掉一些完全無關的噪音詞語,所留下詞語與已知的演員或者角色名至少有一個字相同。
for cz in CZ:
        for n in N:
            if minEditDistance(cz, n) == 0 
                save cz to CR
        else            
            if  jaccard(cz, n) > 0.1 # 即未知稱呼與某個演員名字或角色名至少有一個字相同
                save cz to CR

編輯距離(Edit Distance),又稱Levenshtein距離,是指兩個字符串之間,由一個轉成另一個所需要的最少編輯操作(替換、插入、刪除操作)。比如單詞life轉變到單詞live,最少的操作就是替換f爲v,即,life與live的最小編輯距離爲1。考慮到打錯字的情況,我們保留與演員名字拼音完全相同的詞語。

Jaccard相似度廣泛應用於文本相似度的計算之中,公式如下:

jaccard

  • 接下來對人名隊列進行判斷,如果稱呼與某個演員或角色相似度達到0.6,即至少有兩個字是相同的,就認爲該稱呼是該演員名/角色名的擴展。否則使用該詞語構造問句進行網頁搜索。
  • 獲取百度搜索返回來網頁源碼,截取該詞語所在位置前後各包含12個字符串的短句,判斷所有短句中是否有高頻演員名或者角色名,若匹配,則認爲該詞語是高頻名的擴展。前後12個字符串的選擇是爲了保證所匹配到的名字具有較強的相關性,減小噪音。
For cr in CR:
    mark = false
    for n in N:
        if jaccard(cr, n) >= 0.6  # 稱呼cr與名字n的相似度達到閾值
            add cr to n # 認爲cr是名字n的擴展
            mark = true 
            break
    if mark != true: # 相似度不達閾值的,進行網頁搜索匹配
        put question “who is cr in movieName” to web search
        if return n:
            add cr to n
        else: 
            pass

情感分析的算法思路

通過上述方法識別出演員的同謂表述詞典,以此對演員作情感分析,一方面切分小句取情感均分,另一方面給予觀衆所給的打分一定的權重。情感分析,這次做項目採用的是snowNLP,其情感分析模塊簡單地將句子分爲兩類,積極和消極,即預測輸入句子是屬於積極還是消極的概率,概率期間爲【0,1】。隨機抽取高分評論(微博打分9分以上)和低分評論(打分3分以下)各7000條,訓練snowNLP情感分析模型。

結合電影評論的特點,爲了更準確地計算一條評論所表現出來的對某個特定演員的情感傾向,我們通過逗號,句號等將每條評論切分爲小短句,計算演員在短句中的情感值平均值,以避免受其他意羣的影響。另一方面,電影的總體評分也是不可忽視,例如,不帶顯性情感詞的評論諸如“爲了我的黃渤男神”,如若直接分析句子,其情感分將會偏低,如果給予總評一個權重,即評論中演員的情感分:

Q = w1 * comment_score + w2 * emotion_score

comment_score是整條評論的打分,emotion_score是短句中該演員的情感平均分。

由於snowNLP的情感區間是0~1,爲了防止負面情感累加造成的錯覺,在情感分的基礎上減去0.5,將區間平移到-0.5~0.5。考慮到觀衆打分區間爲1~10,爲了均衡兩個分數的影響,應該使兩個權重: w1<=10*w2。

情感分析的僞代碼如下 :

for aComment in comments:
    String[] shortSentence = aComment.split(“,”)  # 將一條評論切分爲短句
    for a str in shortSentence:
        for n in N:
            if str.contains(n): # 判斷短句是否包含人名
                n.value += emotionScore(str, n) #累加短句的情感分

實驗分析

通過百度百科爬取電影《記憶大師》的演員及其角色表,爬取微博評論共1483條,爲了這裏方便展示效果,我隨機抽取7條評論,如圖四。對比單純使用CRF的nr詞性詞語和加入篩選nz詞語及對部分詞語進行網頁搜索兩種方法的準確率和召回率。從圖五可以看到,前者準確率高達100%,幾乎所識別的都是人名,卻只有20%的召回率,說明漏掉了很多其他名稱。而改良後的算法,雖然犧牲了部分準確率,召回率卻得到了顯著的提高。

評論表
圖四:抽取的7條評論

這裏寫圖片描述
圖五:模型識別效果對比

將識別出來的人名使用在情感分析中,首先判斷評論中是涉及某個確切演員,再通過短句的情感值平均分和總分的加權得到演員的總體情感分。如下圖六是上述7條評論得到的演員情感分。

情感分析效果
圖六:情感分析效果

這部分的工作到這裏就告一段落了,但是還是有很多可以改進的地方,比如網頁搜索的效果還是不太好,snowNLP的情感打分似乎不是很理想,將代碼運用到豆瓣評論上後,發現大量負分的存在,與微博的分數有很明顯的對比(也許相比之下豆瓣用戶對電影是比較挑剔的)。

這部分工作從我暑假的尾巴8月中旬開始,差不多在開學後的一個星期結束。自認爲是個很好的鍛鍊的機會,除了實踐數據挖掘方面的知識,也讓我鍛鍊了一次寫文檔的能力。然而剛剛看完了整個項目的文檔,覺得自己不過是其中的一個小小部分,除了自己的模塊,還有很多別人的工作。還是應該多多提醒自己,戒驕戒躁,沉下心來好好學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章