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

陳正賢(Alvin Cheng-Hsien Chen)
國立台灣師範大學英語學系副教授

2021年11月19日,國立中正大學

語言與資料科學

背景

  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詞彙。(Continuous Bag-of-Words -> Multi-class Classifier)
    • 在特定範圍語境中,可以正確預測某詞彙\(X\)是否為Target詞彙之情境詞彙(Context Words)。(Skip-Gram -> Binary Classifier)
  • 而詞向量可以說是上述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歌詞網3爬取華語男女歌手,流行歌曲歌詞以及其他歌曲相關資訊(歌手、歌名、作詞、作曲等)。
  • 在這次實作裡,我們取部分資料作為展示,同學可下載demo_data/song_sub.csv4
import pandas as pd
import numpy as np
song_sub = pd.read_csv('song_sub.csv')

資料前處理

清理

  • 資料往往有許多雜訊,分析第一步通常必須清理資料(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 Transformer5進行此資料集的斷詞。
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位華語男女歌手6歌曲之歌詞作為分析文本,總共有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)7,將一個詞向量模型中的詞彙,從高維空間投射至二維空間,觀察詞向量模型對於詞彙之間語意距離的掌握程度。
詞向量降維平面圖

詞向量降維平面圖

  • 接著,我們將整個資料庫,依據不同歌手分成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)

量化分析

  • 在接下來的量化分析,由於細部研究與分析仍然進行中,且後續分析均以R語言進行,因此接下來的分享,著重初步的分析結果以及未來可能應用與延伸。

情感字典

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

初步正反情態分析

  • 我們可以依據一般的二分情感字典,以正向與負向兩端來初步分析所有MALEFEMALE概念相近詞。
  • 語料庫中共有17位歌手,每一位歌手的詞向量模型定義出200個與MALE相近概念詞,200與FEMALE相近概念詞9
  • 因此,我們可初步觀察,對於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概念相近詞,依據情感字典,找出夾帶「特殊情感」之詞彙,接著,分析每一個歌手的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

「男人」文字雲圖

結語

研究限制與未來方向

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

感謝聆聽!

問與答

詞向量模型的參數(如feature_size, window_context, min_word_count)應該如何依研究的課題及所蒐集的資料的特性調整設定?

: 詞向量參數值調整是個很重要的問題,目前大概主流做法都是採用前人常用的參數值,不過有幾個原則是:

  • feature_size越大,學習到的詞彙語意特徵可能會細緻,但是同時需要更大的語料庫
  • window_context 用廣,模型所學到的詞向量越趨近於廣泛的詞彙語意(如: semantic prosody),window_context越小,則系統所學習的語意訊息比較片面,可能多半也會跟morpho-syntactic information有關係(如:sub-categorization features)。
  • min_word_count通常是實務考量了,如果語料庫比較小,這個門檻的設定值可以避免一些低頻詞因為資料量不夠而影響學習結果;如果語料庫很大,這個門檻設定則跟系統硬體(如記憶體)是否能夠容納龐大的Vocabulary而有關係。

在做完詞向量的初步分析後如何將向量相近的詞彙再進一步依文法範疇(grammatical categories)分類計算?

: 這是個很好的問題!在詞向量的訓練過程中,Syntactic Relations是被忽略的。如果在分析「男人」或「女人」之情態時,可以透過Syntactic Parsing,篩選與這兩個概念在句法上相關的鄰近詞來做詞向量分析。例如:我們可以將歌詞中與「男人」相關的修飾語(形容詞)、或「動詞」(即「男人」作為主語或賓語時)納入詞向量鄰近詞的計算。

整個研究當中,花費最多時間是在collect information前處理的部分嗎?如果是的話,對於增加搜集資料的效率有什麼建議。

: 通常資料分析研究中,確實「資料收集」以及「資料前處理」是最花費時間的步驟。如果要增加資料量,必定要朝向「自動化」的方式走。就歌詞集來說,相對是容易的。目前網路上提供的流行歌曲資料庫非常多,如果透過網路爬蟲(Web Crawling)技術,要爬取上萬首歌曲都不成問題。(但可能要注意版權問題!)因此,我的建議是,同學能夠多學習一些數位文本分析的技能,讓自己能夠在資料蒐集以及文字前處理的每一個步驟,利用既有的自動化工具和程式技能,將許多重複性的步驟效率化。

這個研究實在是太有趣了。學生覺得情感分析也會因為文化而有所不同,不知是否有針對英語歌曲來分析男女情感連結不同的相關研究。 如果有的話,有沒有辦法用數據來做比對,比較出文化的不同確實造成在男女情感連結在歌詞顯現上的差異。

: 我的答案絕對是肯定的!:)流行歌曲也是語言一種表現,因此,在每一個文化的情感偏好,我相信是有很大的差異。透過這次演講所介紹的Computational Sentiment Analysis,我們可以蒐集華語與西洋流行歌曲來做比較研究,我相信會是很有趣的題目喔!

老師有提到在蒐集資料時,會把英文詞彙刪除,那會不會因為歌曲的英文詞彙太多,而決定不把它加入分析的曲庫?例如:高爾宣-without you

: 是有可能喔!在做完資料前處理後(如:刪除不相關字符),如果歌詞文字長度低於某個數值,我們可以考慮刪除該歌詞文本,因為,當歌詞文本長度過短,可能涵蓋的訊息也不完全,能夠讓系統學習到的詞彙語意訊息也相對有限。

我有點好奇就是當歌手的風格不同時,應該是統一納入考量,或是盡量挑相同曲風的歌?像是張惠妹也以「阿密特」這個名稱發行專輯,但是歌曲的風格或是用詞都很強烈黑暗,這不知道會不會衝突到那個個手的分析。

: 這是一定會的喔!就「阿密特」這個例子,我也認為或許可以考慮將她與「張惠妹」視為兩個不同的歌手。當然,同一位歌手也有可能因為不同時期的創作,風格截然不同。在分析上,如果同學認為風格轉變是一個潛在的影響因子,可以將每一首歌曲的發行日期納入後續的量化分析囉!(統計上,這是合理且可行的:))

有些歌手如果出道20年,那他20年前發行的歌曲,是不是和現在華語歌曲對男女概念的情感分析會有稍微的不同?

: 這是一定會的喔!如前一個問題的答覆,同一位歌手也有可能因為不同時期的創作,風格截然不同。在分析上,如果同學認為風格轉變是一個潛在的影響因子,可以將每一首歌曲的發行日期納入後續的量化分析囉!(統計上,這是合理且可行的:))

老師好,想請問您,假設在收集歌曲時,是否會設定一個年份,避免歌手風格轉變,或是當時社會對於性別風氣改變(例如:近幾年同性意識抬頭,或是男/女性獨立自主意識增強),造成詞彙的變化。

: 是的,沒錯!資料收集的方式,會隨著研究問題的不同而做調整。如果同學的研究問題是針對特定時期的流行歌曲文化,那麼,則建議在資料收集上就要注意歌曲發行時間,可能在資料爬取時,須同時紀錄歌曲出版時間,以利後續分析。(甚至可以將每一首歌曲出版時,該歌手的出道時間納為其中一個分析因子。)

請問老師,在歌詞裡面,是否會碰到有些詞明明是正向,但其實是諷刺語氣,例如:你真「勤勞」耶,也可能非完全正面的語氣,這時候該如何去判斷屬於positive或是negative呢?

: 目前在情感分析研究中,「諷刺」是相當棘手的問題喔!諷刺偵測牽涉很多前後文語境,因此,如果有諷刺的標記語料,或許可以透過深度學習中的RNN或是LSTM對於Context記憶的優勢,學習諷刺偵測。要取決研究者的研究問題為何,設定學習目標。諷刺偵測,也是情感分析中的一環。

這次研究中有沒有什麼詞彙是位在模糊地帶的,例如介於男人和女人之間的?

: 這是個有趣的問題!在這次研究中,對於「目標概念詞」的選擇(如:男人,女人),是由研究者(也就是我)設定的,決定過程確實花了些功夫。目前我們是利用「男人」與「男孩」的詞向量平均值作為尋找MALE的概念鄰近詞基礎,換言之,在這個分析中,我們並沒有完整考量「年紀」的影響。此外,其實還有許多與MALE相關的詞彙,包括:男子,王子,國王等,這些詞彙是否應該納入MALE的一部分,這可能跟就跟研究者設立的「研究問題」有比較大的關係了!還有很多發揮空間喔!

男人和男孩、女人和女孩,在年齡上是不太相同的、意義也有不同,或許在詞彙使用上也會有不同,只是有辦法分類出用於男人、男孩、女人、女孩上的詞彙嗎?

: 如果要看「男人」、「男孩」、「女人」、「女孩」分別在流行歌曲中鄰近的詞彙有哪些,也是可行的喔!只要針對每一個前述詞彙,分別找出概念最相近的前N個詞彙,做情感分析即可。

像是公主在英文裡面可能偏正面,但在中文裡面有時候偏向負面。歌詞裡面可能會形容女人是驕傲公主、公主脾氣,或是公主病。我們在操作時有什麼方法用code去歸納這類詞類大多是負面的詞彙嗎?

: 這個觀察是很有意思的!透過我們這邊介紹的Computational Sentiment Analysis的方法,我們可以透過資料分析分法來驗證看看是否我們的假設是對的。做法其實很類似,我們只要透過訓練好的詞向量模型,將與「公主」相關的前N個的概念鄰近詞擷取出來,做後續的情感分析即可。我嘗試利用一樣的方法,將我們訓練的Base Word Embedding作為基本模型,擷取前400個「公主」鄰近詞,做初步的情感分析,確實,偏向負面喔!:)

如果歌詞中的整個歌詞都沒有提到男人女人相關詞彙,但整體的語氣指的就是男人或女人,那這個部分需要被納入考慮Male與Female的概念情感分析範圍嗎?或是其實skip-gram就會把這個部分考慮進去了

: 這是個很有挑戰的方向!就目前的分析方式,仍然必須仰賴「詞彙」,即便我們透過詞向量的學習,能夠將詞彙轉型成帶有語意成分的「詞向量」,整個分析方法仍然是以詞彙為本。或許可以透過「代名詞」作為分析手段?比方說,歌詞中如果不斷出現「你,他」,或許代表著是從「女人」出發的角度?反之,如果歌詞中不斷出現「妳、她」,或許代表著是從「男人」出發的角度?這倒是給了我一些分析的靈感喔!感謝!

怎麼確定結果沒有受否定詞影響?比如不快樂被斷詞成快樂,最後的結果會被影響。

: 目前我們的做法是透過詞向量學習而來的模型,來尋找MALE的概念鄰近詞,這個「鄰近」的定義,是依據詞向量模型中的Cosine Similarity。因此,「鄰近詞」是一個機率概念。如果MALE在文本中,經常與「快樂」一起出現,則很有可能在詞向量學習裡,這兩個詞彙的語意距離自然會很相近。至於同學提到否定詞是否會有影響,在一個前提下是會有影響的:如果在歌詞文本中,大部分與MALE一起出現的「快樂」前面剛好都是否定詞的話,那麼「快樂」與MALE之間,詞向量模型所學習到的高度相關「語意距離」,就會有誤差。所以,分析者可能要對自己的資料做初步分析,進一步判斷否定詞是否會造成顯著影響。

深度學習系統是怎麼分析情感是positive or negative呢?還是這部分是需要人工分辨的?

: 是的,需要人工標記。目前情感分析仍是個「監督式學習(Supervised Learning)」,必須先要有「一定數量」的人工標記資料,針對每一個文本(或詞彙)有情感標記。接者,才能透過機器學習的方法學習模型,或擴增情感標記。


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

  2. 此範例是根據中央研究院漢語對話語料庫計算。↩︎

  3. https://mojim.com/↩︎

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

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

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

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

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

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

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

  11. 如:(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.↩︎