華語歌曲之情感分析:
男女大不同?

語言與資料科學

背景

  1. 情感分析(Sentiment Analysis)是近幾年計算語言學相當熱門的主題,在許多領域等可以看見情感分析的應用。
  2. 情感(Sentiment)是我們語言互動溝通中,除了事件傳達外,另一項很重要的任務。
  3. 透過大量的語言資料,我們可以透過計算文本分析(Computational Text Analytic)的方式,分析在某個特定場域(genre)裡,對於特定「主題」、「人物」、「產品」、「物件」等之普遍情感偏好,結果可以二分(Binary)的方式呈現(如:正向/負向)或以數值(Continuous)呈現(如:正向分數0.8)。
  4. 情感亦可針對不同情緒進一步細分為「開心」、「難過」、「憤怒」等。

今日實作主題

  • 我們將以「華語歌曲」為例,展示如何執行一個簡單的「以詞彙為本(lexicon-based)」之情感分析研究。
  • 透過分析歌詞中的情感分佈,我們想探討,針對「男人」和「女人」這兩個概念,主流的情態為何?
  • 同時,透過這個簡單的例子,我們也帶著大家認識,典型的資料科學分析研究,所需的步驟、流程以及需要注意的細節。
  • 這次實作我們將利用目前深度學習中常使用的「詞向量(Word Embeddings)」方法,作為文本情感分析的基礎。

詞彙語意表徵

  • 一個詞彙的語意,該怎如何定義和表徵(Semantic Representation)1
    • 指涉(Meaning by reference)
    • 比較(Meaning by contrast)
    • 使用(Meaning by uses)

語言單位間的共現性(Co-occurrence)

  • 不同語言單位之間的共現,一直是語言學家關心的議題。

    • 詞彙間的搭配關係(Collocation)
    • 詞彙與句構間的搭配關係(Colligation, Collostruction)
  • 隨著語料庫方法發展成熟,字串間的相連性(sequentiality),成為詞彙語意(lexical semantics)研究的重要基礎。

  • 透過大量語料中的共現關係(Co-occurrence patterns),分析詞彙語意,定義其語意表徵(Semantic Representation)。

  • 透過語境所取得的詞彙分散式語意表徵(Distributed Semantic Representation),成為近年來在深度學習語意表徵的主要推手。(即:詞向量[Word Embeddings])。

分散式語意表徵 (Distributional Hypothesis)

  • 語言單位之間的共現關係(Co-occurrence patterns)成為分散式語意表徵(Distributed Semantic Representation)學習的重要基礎。

You shall know a word by the comany it keeps. (Firth, 1957, p.11)

[D]ifference of meaning correlates with difference of distribution. (Harris, 1970, p.785)

詞向量(Word Embeddings)

深度學習之「詞向量」

  • 「詞向量」的背後基礎假設,就是「分散式語意表徵」:即「兩個詞彙所使用的語境越相似,則兩者語意距離越相近。」

  • 透過深度學習方法,以非監督式方式,學習詞彙的分散式語意表徵,以「向量」方式呈現,通常稱為「詞向量(Word Embeddings)」



  • 詞向量模型之學習,是利用大量的語料庫作為基礎,訓練一個深度學習的Classifier達成以下目標:
    • 在特定範圍語境中,可以透過情境詞彙(Context Words)正確預測 某個Target詞彙。 (i.e., Continuous Bag-of-Words)
    • 在特定範圍語境中,可以正確預測某詞彙\(X\)是否為Target詞彙之情境詞彙(Context Words)。(i.e., Skip-Gram)

  • 而詞向量可以說是上述Classifier建置後的By-Product。

Continuous Bag-of-Words模型示意圖

Continuous Bag-of-Words模型示意圖


Skip-Gram模型示意圖

Skip-Gram模型示意圖

詞向量有什麼好處?

  • 簡言之,透過大型語料庫2,如果兩個詞彙周圍共現的搭配詞類似,則我們可以推測它們語意相近。

  • 詞向量讓我們能夠將詞彙語意做實際數值運算


詞向量怎麼訓練?

  • 詞向量訓練有許多不同演算法,除了我們先前提到,最常見的Word2Vec方法(Continuous Bag-of-Words, Skip-Gram)以外,還有後續許多改善的演算法。
  • 訓練工具也有許多Python Packages可以幫助我們完成詞向量訓練:
    • gensim: Simplest and straightforward implementation of word2vec.
    • Training based on deep learning packages (e.g., tensorflow + keras, PyTorch)
    • spacy (It comes with the pre-trained embeddings models, using GloVe.)

資料搜集

  • 資料科學第一步是培養資料搜集的能力。
  • 網路爬蟲通常是初學者的第一步。
  • 這次實作的資料,我們從MOJIM歌詞網爬取華語男女歌手,流行歌曲歌詞以及其他歌曲相關資訊(歌手、歌名、作詞、作曲等)。
  • 在這次實作裡,我們取部分資料作為展示,同學可下載demo_data/song_sub.csv3
import pandas as pd
import numpy as np
song_sub = pd.read_csv('song_sub.csv')

資料前處理

文字資料前處理

  • 常見的文字資料前處理包括:
    • 文字正規化(Text Normalization)
    • 文字切段(Text Tokenization)
    • 文字標記(Text Enrichment/Annotation)

清理

  • 資料往往有許多雜訊,分析第一步通常必須清理資料(Data Wrangling),將與研究主題不相關的字符刪除,以利後續資料分析。

  • 在這次實作中,我們將程序簡化,去除原始歌詞文字中以下字符(Characters):
    • 多餘空白格以及換行符號
    • 標點符號以及特殊符號
    • 英文字符和阿拉伯數字

import re
import unicodedata

## remove extra line breaks white spaces 
## and unicode category punctuations and symbols

def preprocess(doc):
    doc = re.sub(r'\n+','\n', doc)
    doc = ''.join([c if unicodedata.category(c)[0] not in ["P", "S", "N"] 
      else ' ' for c in doc]) ## symbols, punctuations, digits
    doc = ''.join([c if unicodedata.category(c) not in ["Ll", "Lu"] 
      else ' ' for c in doc]) 
    doc = re.sub(r'[ \u3000]+', '', doc)
    doc = re.sub(r'\n+','\n', doc)
    doc = '\n'.join([line.strip() for line in doc.split('\n')])
    return doc

lyric = [preprocess(l) for l in song_sub.lyric]
print(song_sub.lyric[325]) ## original
你整齊潔白的床 是我傾訴的地方
抱你哭著到天亮 你等待幸福的廚房
那次情人節晚餐 卻是我陪著你嘗
衣櫃不算太寬 藏著你的天堂 依然歡迎我分享
我們的愛很像 都因男人而受傷 卻又繼續碰撞
當天空昏暗 當氣溫失常 你用巨大的堅強 總能抵擋
當尖銳眼光 當刺耳聲響 你用彩虹的浪漫 溫柔包裝
衣櫃不算太寬 藏著你的天堂 依然歡迎我分享
我們的愛很像 都因男人而受傷 卻又繼續碰撞
當天空昏暗 當氣溫失常 你用巨大的堅強 總能抵擋
當尖銳眼光 當刺耳聲響 你用彩虹的浪漫 溫柔包裝
看我丟掉他的西裝 比我先紅了眼眶
笑我傻 陪我慌 當我找到幸福去向
幫我快樂的化妝 陪我傻 笑我慌
當天空昏暗 當氣溫失常 你用巨大的堅強 總能抵擋
當尖銳眼光 當刺耳聲響 你用彩虹的浪漫 溫柔包裝

print(lyric[325]) ## cleaned
你整齊潔白的床是我傾訴的地方
抱你哭著到天亮你等待幸福的廚房
那次情人節晚餐卻是我陪著你嘗
衣櫃不算太寬藏著你的天堂依然歡迎我分享
我們的愛很像都因男人而受傷卻又繼續碰撞
當天空昏暗當氣溫失常你用巨大的堅強總能抵擋
當尖銳眼光當刺耳聲響你用彩虹的浪漫溫柔包裝
衣櫃不算太寬藏著你的天堂依然歡迎我分享
我們的愛很像都因男人而受傷卻又繼續碰撞
當天空昏暗當氣溫失常你用巨大的堅強總能抵擋
當尖銳眼光當刺耳聲響你用彩虹的浪漫溫柔包裝
看我丟掉他的西裝比我先紅了眼眶
笑我傻陪我慌當我找到幸福去向
幫我快樂的化妝陪我傻笑我慌
當天空昏暗當氣溫失常你用巨大的堅強總能抵擋
當尖銳眼光當刺耳聲響你用彩虹的浪漫溫柔包裝

斷詞

  • 由於中文資料沒有詞與詞之間的訊息,通常在前端清理完之後,下個步驟便是「斷詞(Word Segmentation)」。
  • 這次實作中,我們利用中央研究院CKIP團隊所開發的CKIP Transformer4進行此資料集的斷詞。
import ckip_transformers
from ckip_transformers.nlp import CkipWordSegmenter
import pickle

# Initialize CKIP driver
ws_driver = CkipWordSegmenter(level=3, device=-1)

# Segmentation
cur_ws = ws_driver(lyric, use_delim = True, delim_set='\n')

# Tokens to Strings
lyric_wordseg = [' '.join(d) for d in cur_ws]

with open('lyric_wordseg_ckip.pickle', 'wb') as f:
    pickle.dump(lyric_wordseg, f, protocol=pickle.HIGHEST_PROTOCOL)
  • 我們利用CKIP Transformer執行中文斷詞,取決不同資料大小,斷詞可能花費不少時間,通常我會建議同時將斷詞結果儲存至lyric_wordseg_ckip.pickle,以利後續資料分析。
  • 在斷詞的歌詞版本中,我們在詞與詞之間,以空白格作為分隔符號(Delimiter)。
import pickle
with open('lyric_wordseg_ckip.pickle', 'rb') as f:
    lyric_wordseg = pickle.load(f)

print(lyric_wordseg[325])
你 整齊 潔白 的 床 是 我 傾訴 的 地方 
 抱 你 哭 著 到 天亮 你 等待 幸福 的 廚房 
 那 次 情人節 晚餐 卻 是 我 陪 著 你 嘗 
 衣櫃 不 算 太 寬 藏 著 你 的 天堂 依然 歡迎 我 分享 
 我們 的 愛 很 像 都 因 男人 而 受傷 卻 又 繼續 碰撞 
 當 天空 昏暗 當 氣溫 失常 你 用 巨大 的 堅強 總 能 抵擋 
 當 尖銳 眼光 當 刺耳 聲響 你 用 彩虹 的 浪漫 溫柔 包裝 
 衣櫃 不 算 太 寬 藏 著 你 的 天堂 依然 歡迎 我 分享 
 我們 的 愛 很 像 都 因 男人 而 受傷 卻 又 繼續 碰撞 
 當 天空 昏暗 當 氣溫 失常 你 用 巨大 的 堅強 總 能 抵擋 
 當 尖銳 眼光 當 刺耳 聲響 你 用 彩虹 的 浪漫 溫柔 包裝 
 看 我 丟掉 他 的 西裝 比 我 先 紅 了 眼眶 
 笑 我 傻 陪 我 慌 當 我 找到 幸福 去向 
 幫 我 快樂 的 化妝 陪 我 傻笑 我 慌 
 當 天空 昏暗 當 氣溫 失常 你 用 巨大 的 堅強 總 能 抵擋 
 當 尖銳 眼光 當 刺耳 聲響 你 用 彩虹 的 浪漫 溫柔 包裝

儲存

  • 通常在語言學分析裡,我們希望能夠看到原始資料以及前置處理後的資料,因此,我個人習慣會將資料整理成Data Frame形式,以利後續量化分析。
  • 同學可以在demo_data/song_sub.csv資料夾,下載的資料集CSV中,lyric_wordseg欄位即為斷詞後的結果。

實作資料

  • 這次的實作資料(demo_data/song_sub.csv),收集17位華語男女歌手5歌曲之歌詞作為分析文本,總共有2409首歌曲。

  • 每位歌手蒐集之歌曲數目分佈如下:

研究方法

研究問題

  • 在我們收集的華語流行歌曲語料庫中,歌詞對於「男人」和「女人」這兩個概念,普遍情感連結為何?
  • 這些情感連結,「男人」與「女人」間有無差異?不同歌手的歌曲是否也有差異?

資料匯入

import pandas as pd
import re
song_sub = pd.read_csv('demo_data/song_sub.csv')

詞向量模型訓練

  • 首先,我們將所有要分析的歌詞集作為母體語料庫,訓練一個「基礎詞向量」模型,作為後續每一位歌手歌曲詞向量訓練的基礎。
  • 我們利用gensim訓練word2vec的詞向量模型。
## tokenization
lyric_wordseg_token = [re.split('[\s\n]+',text) 
    for text in song_sub.lyric_wordseg]

## Check results
print(lyric_wordseg_token[325][:50])
['你', '整齊', '潔白', '的', '床', '是', '我', '傾訴', '的', '地方', '抱', '你', '哭', '著', '到', '天亮', '你', '等待', '幸福', '的', '廚房', '那', '次', '情人節', '晚餐', '卻', '是', '我', '陪', '著', '你', '嘗', '衣櫃', '不', '算', '太', '寬', '藏', '著', '你', '的', '天堂', '依然', '歡迎', '我', '分享', '我們', '的', '愛', '很']
%%time

## Building base embeddings 

from gensim.models import Word2Vec

# Set values for various parameters
feature_size = 128
window_context = 10  
min_word_count = 5  

base_embeddings = Word2Vec(
    lyric_wordseg_token,
    size=feature_size,        # Word embeddings dimensionality
    window=window_context,    # Context window size
    #max_vocab_size = 1000,    # Max vocab size
    min_count=min_word_count, # Minimum word count
    sg=1,                     # `1` for skip-gram; otherwise CBOW.
    seed = 123,               # random seed
    workers=4,                # number of cores to use
    #negative = 5,             # how many negative samples should be drawn
    #cbow_mean = 1,            # whether to use the average of context word embeddings or sum(concat)
    #iter=10000,               # number of epochs for the entire corpus
    #batch_words=10000,        # batch size
)

base_embeddings.save('embeddings/base_embeddings')
  • 我們可以透過統計的降維方法(Dimensional Reduction)6,將一個詞向量模型中的詞彙,從高維空間投射至二維空間,觀察詞向量模型對於詞彙之間語意距離的掌握程度。
詞向量降維平面圖

詞向量降維平面圖

  • 接著,我們將整個資料庫,依據不同歌手分成17個子資料庫,不同歌手歌曲作為子語料庫,針對每一位歌手獨立訓練一個「歌手詞向量」模型,這些模型以先前建構的「基礎詞向量」模型作為pre-trained model,再以每一個歌手歌曲集資料,做模型微調(Model Fine-Tuning)。
## Artists of each lyrics
lyric_wordseg_artist = [art for art in song_sub.artist]
print(lyric_wordseg_artist[325])

## All Artists in the dataset
張惠妹
all_artists = set(lyric_wordseg_artist)
print(all_artists)
{'鄧紫棋', '田馥甄', '孫燕姿', '徐佳瑩', '林俊傑', '盧廣仲', '蔡依林', '王心凌', '周杰倫', '韋禮安', '蕭敬騰', '周興哲', '光良', '張雨生', '張惠妹', '魏如萱', '吳青峰'}
## Create artist-specific embeddings
for artist in all_artists:
    ## subset artist's data
    sub_corpus = [lyric_wordseg_token[i] for i, art 
      in enumerate(lyric_wordseg_artist) if art == artist]
      
    ## Progress report  
    print("Working on %s with %d songs" % (artist, len(sub_corpus)))
    
    ## Load baseline embeddings
    model_art = Word2Vec.load('embeddings/base_embeddings')
    
    ## Finetune embeddings using artist's data
    model_art.train(
      sub_corpus, 
      total_examples = len(sub_corpus), 
      epochs=10)
      
    ## Save artist's embeddings
    model_art.save('embeddings/%s' % artist)

尋找「男人」和「女人」概念相近詞彙

  • 從每一位歌手訓練出來的詞向量模型,尋找與「男人」和「女人」相近的200個詞彙,作為後續的情態分析。

  • 換言之,總共17位歌手,每位歌手找出400個與「男人」和「女人」語意相近詞彙(「男人」和「女人」各200個詞),共 \(17 \times 400 = 6800\) 的詞彙。

from gensim.models import Word2Vec
## Loading trained models
jay_embeddings = Word2Vec.load('embeddings/周杰倫')
amei_embeddings = Word2Vec.load('embeddings/張惠妹')
## Check their neighbors of 男人
print(jay_embeddings.wv.most_similar('男人'))
[('眼睜睜', 0.9178696870803833), ('不聞不問', 0.8718047142028809), ('算', 0.8187268972396851), ('遇到', 0.7342249155044556), ('假設', 0.7287271022796631), ('獻', 0.7162481546401978), ('哎唷', 0.7139003276824951), ('殷勤', 0.7060399055480957), ('終止', 0.7023175954818726), ('愧疚', 0.6992360353469849)]
print(amei_embeddings.wv.most_similar('男人'))
[('獻', 0.7740488052368164), ('大方', 0.7639797925949097), ('殷勤', 0.7607220411300659), ('高低', 0.7305169105529785), ('稀奇', 0.7153195738792419), ('假惺惺', 0.7148565053939819), ('大人', 0.6910188794136047), ('不聞不問', 0.6870435476303101), ('扛', 0.6836142539978027), ('帶過', 0.6744368076324463)]
  • 我們希望將「男人」和「女人」這兩個概念不要局限於詞彙層次,因此我們利用詞向量的優勢,將「男人」與「男孩」之平均值,視為MALE的概念向量。
  • 同樣地,我們將「女人」與「女孩」之平均值,視為FEMALE的概念向量。
search_terms = [
  ['男人','男孩'], ## Average of these words represents MALE
  ['女人','女孩']  ## Average of these words represents FEMALE
  ]

jay_embeddings.wv.most_similar(search_terms[0])
[('眼睜睜', 0.7991461753845215), ('扛', 0.789160966873169), ('對象', 0.7887976765632629), ('最最', 0.7863415479660034), ('詛咒', 0.782548189163208), ('胃口', 0.7815563678741455), ('芭比', 0.7772644758224487), ('猜測', 0.7738674879074097), ('簡直', 0.7722352743148804), ('罪惡', 0.7717766761779785)]
jay_embeddings.wv.most_similar(search_terms[1])
[('可愛', 0.8298066854476929), ('面紅', 0.817287266254425), ('壞壞', 0.7807778120040894), ('心疼', 0.7771245837211609), ('權力', 0.7697545289993286), ('瘋狂', 0.7644705772399902), ('讓讓', 0.7583451271057129), ('地心引力', 0.7327780723571777), ('淚珠', 0.7303798198699951), ('約好', 0.729374349117279)]

TOPN = 200

## Extract MALE/FEMALE neighbors for each artist
for artist in all_artists:
    ## Load artist's embeddings
    cur_model = Word2Vec.load('embeddings/%s' % (artist))
    
    ## Extract MALE/FEMALE neighbors
    similar_words = {
        '_'.join(search_term):
        [item[0] for item in cur_model.wv.most_similar(search_term, topn=TOPN)]
            for search_term in search_terms
    }
    
    ## Save reulst in JSON format
    with open('embeddings/%s.json' % (artist), 'w') as outfile:
        json.dump(similar_words, outfile, ensure_ascii=False)

量化分析

  • 目前為止,我們已經透過深度學習的詞向量方法,在每一位歌手的歌曲集中,找到分別與MALE和FEMALE這兩個概念最相近的200個詞彙。
  • 下一步我們只要能夠分析這些相近詞彙中,在不同情感層面的分布狀況,就可以得知每一位歌手歌曲中,對於MALE和FEMALE的情感偏好為何。
  • 在接下來的量化分析,由於細部研究與分析仍然進行中,且後續分析均以R語言進行,因此接下來的分享,著重初步的分析結果以及未來可能應用與延伸。

情感字典

  • 目前中文的情感字典,能夠公開使用的不多,在這個小研究中,我們使用的是NRC Emotion Dictionary7
  • NRC是一個以英文為主的情感字典,作者透過自動化翻譯將字典擴增至全球一百多種語言。
  • 我們使用NRC提供之中文版本,透過人工修正翻譯正確性,目前仍在進行當中。

初步正反情態分析

  • 我們可以依據一般的二分情感字典,以正向與負向兩端來初步分析所有MALEFEMALE概念相近詞。
  • 語料庫中共有17位歌手,每一位歌手的詞向量模型定義出200個與MALE相近概念詞,200與FEMALE相近概念詞8
  • 因此,我們可初步觀察,對於MALEFEMALE這兩個概念,語意鄰近詞彙的正向與負向分佈。

MALE的情感初步分析

與「MALE」相關之正向與負向詞彙

與「MALE」相關之正向與負向詞彙

FEMALE的情感初步分析

與「FEMALE」相關之正向與負向詞彙

與「FEMALE」相關之正向與負向詞彙

統計分析

        negative  positive
FEMALE -3.342732  3.295439
MALE    3.423076 -3.374646

    Pearson's Chi-squared test with Yates' continuity correction

data:  keywords_df_wider_matrix
X-squared = 44.524, df = 1, p-value = 2.513e-11

「男人」與「女人」概念相近詞情態分析

  • 我們將每位歌手詞向量模型所找出之MALEFEMALE概念相近詞,依據上述情感字典(i.e., NRC Emotion Dictionary),找出夾帶「特殊情感」之詞彙,接著,分析每一個歌手的MALEFEMALE概念相近詞之情感分佈。
  • 針對每一種情感字典中的特殊情感,我們計算Emotion Density數值:\(\frac{該情感詞彙個數}{200}*1000\),此為一個normalized數值,代表平均每1000個「MALE/FEMALE」概念相近詞中,與某情感相關詞彙之個數。
  • Density數值越高,表示「MALE/FEMALE」與該特定情感連結性越高。

統計分析

           anger    disgust      fear       joy   sadness   surprise     trust
FEMALE -2.766402 -0.1877814 -1.786705  2.118818 -1.728819  0.2116291  3.843316
MALE    2.886736  0.1959496  1.864424 -2.210983  1.804020 -0.2208346 -4.010494

    Pearson's Chi-squared test

data:  ALL_EMOTION_WIDER_MATRIX
X-squared = 69.298, df = 6, p-value = 5.695e-13
  • 初步研究結果顯示,MALEFEMALE概念相近詞,在不同情感分佈上,有顯著差異。( \(\chi\) = 69.3; df = 6; p < .01)

  • 我們目前資料呈現兩個明顯的連結:MALE與ANGER以及FEMALE與TRUST。

文字分析

  • FEMALE與TRUST

「女人」文字雲圖

  • MALE與ANGER

「男人」文字雲圖

結語

資料科學分析

  • 議題發想
  • 資料收集(Corpus, Web-Crawling)
  • 資料前置處理 (Text Pre-processing, Data Wrangling)
  • 資料分析 (Statistics, Data Analysis)
  • 結果詮釋 (Data Visualization, Reproducible Reports)

研究限制與未來方向

  • Base Embeddings的訓練與選擇,其實還有許多可能性。 亦可使用中央研究院CKIP團隊釋出的Word Embeddings Model9
  • 未來或許可以利用整個華語歌壇的所有歌曲作為母語料庫,訓練Base Embeddings模型。
  • 由於每位歌手歌曲數目不同,可考慮控制歌曲數目,以利後續的統計分析。
  • 情感字典目前仍是問題,跨語言翻譯過程中,英語具備某個特定情感的詞彙,它在另一語言的對譯,不見得能夠完全反映原先英語中情感,這也是目前我們改善情感字典的重要課題之一。
  • 如何將數位情感分析(Computational Sentiment Analysis)從詞彙層次提升至更高語言層次(如:Morphosyntactic structures)10,是我們目前重要的研究目標之一。

感謝聆聽!


  1. Riemer, Nick. 2010. Introducing semantics. Cambridge: Cambridge University Press.↩︎

  2. 此範例是根據中央研究院漢語對話語料庫,建置中文口語詞向量模型。↩︎

  3. 雲端硬碟所需密碼於演講中公布。↩︎

  4. https://github.com/ckiplab/ckip-transformers↩︎

  5. 這些歌手的選擇沒有什麼邏輯,如果考量研究嚴謹度,應該納入所有男女歌手,比較合適。↩︎

  6. 常見的降維方法,包括t-Distributed Stochastic Neighbor Embedding (t-SNE)以及Principal Component Analysis (PCA)。↩︎

  7. Saif Mohammad and Peter Turney (2013). Crowdsourcing a Word-Emotion Association Lexicon. Computational Intelligence, 29 (3), 436-465, 2013.↩︎

  8. 語意距離我們採取的是計算語言學中常使用的兩個詞向量之間的Cosine Similarity。↩︎

  9. https://ckip.iis.sinica.edu.tw/project/embedding↩︎

  10. 如:(1) Rashkin, H., Singh, S., & Choi, Y. (2016, August 7-12, 2016). Connotation frames: A data-driven investigation. Proceedings of 54th Annual Meeting of the Association for Computational Linguistics, 311-321. https://doi.org/10.18653/v1/P16-1030. (2) Sap, M., Prasetio, M. C., Holtzman, A., Rashkin, H., & Choi, Y. (2017, September 7-11, 2017). Connotation frames of power and agency in modern films. Proceedings of 2017 Conference on Empirical Methods in Natural Language Processing, 2329-2334. https://doi.org/10.18653/v1/D17-1247.↩︎