在16.1 節中,我們討論了情感分析的問題。該任務旨在將單個文本序列分類為預定義的類別,例如一組情感極性。然而,當需要決定一個句子是否可以從另一個句子推斷出來,或者通過識別語義等同的句子來消除冗余時,知道如何對一個文本序列進行分類是不夠的。相反,我們需要能夠對成對的文本序列進行推理。
16.4.1。自然語言推理
自然語言推理研究是否可以從前提中推斷出假設,其中兩者都是文本序列。換句話說,自然語言推理決定了一對文本序列之間的邏輯關系。這種關系通常分為三種類型:
-
蘊涵:假設可以從前提中推導出來。
-
矛盾:可以從前提推導出假設的否定。
-
中性:所有其他情況。
自然語言推理也稱為識別文本蘊含任務。例如,下面的一對將被標記為 蘊涵,因為假設中的“示愛”可以從前提中的“互相擁抱”中推導出來。
前提:兩個女人互相擁抱。
假設:兩個女人正在秀恩愛。
下面是一個矛盾的例子,因為“running the coding example”表示“not sleeping”而不是“sleeping”。
前提:一個人正在運行來自 Dive into Deep Learning 的編碼示例。
假設:這個人正在睡覺。
第三個例子顯示了一種中立關系,因為“為我們表演”這一事實不能推斷出“著名”或“不著名”。
前提:音樂家正在為我們表演。
假設:音樂家很有名。
自然語言推理一直是理解自然語言的中心話題。它享有從信息檢索到開放域問答的廣泛應用。為了研究這個問題,我們將從調查一個流行的自然語言推理基準數據集開始。
16.4.2。斯坦福自然語言推理 (SNLI) 數據集
斯坦福自然語言推理 (SNLI) 語料庫是超過 500000 個帶標簽的英語句子對的集合 (Bowman等人,2015 年)。我們將提取的 SNLI 數據集下載并存儲在路徑中../data/snli_1.0
。
Downloading ../data/snli_1.0.zip from https://nlp.stanford.edu/projects/snli/snli_1.0.zip...
16.4.2.1。讀取數據集
原始 SNLI 數據集包含的信息比我們在實驗中真正需要的信息豐富得多。因此,我們定義了一個函數read_snli
來僅提取部分數據集,然后返回前提、假設及其標簽的列表。
#@save
def read_snli(data_dir, is_train):
"""Read the SNLI dataset into premises, hypotheses, and labels."""
def extract_text(s):
# Remove information that will not be used by us
s = re.sub('\\(', '', s)
s = re.sub('\\)', '', s)
# Substitute two or more consecutive whitespace with space
s = re.sub('\\s{2,}', ' ', s)
return s.strip()
label_set = {'entailment': 0, 'contradiction': 1, 'neutral': 2}
file_name = os.path.join(data_dir, 'snli_1.0_train.txt'
if is_train else 'snli_1.0_test.txt')
with open(file_name, 'r') as f:
rows = [row.split('\t') for row in f.readlines()[1:]]
premises = [extract_text(row[1]) for row in rows if row[0] in label_set]
hypotheses = [extract_text(row[2]) for row in rows if row[0] in label_set]
labels = [label_set[row[0]] for row in rows if row[0] in label_set]
return premises, hypotheses, labels
#@save
def read_snli(data_dir, is_train):
"""Read the SNLI dataset into premises, hypotheses, and labels."""
def extract_text(s):
# Remove information that will not be used by us
s = re.sub('\\(', '', s)
s = re.sub('\\)', '', s)
# Substitute two or more consecutive whitespace with space
s = re.sub('\\s{2,}', ' ', s)
return s.strip()
label_set = {'entailment': 0, 'contradiction': 1, 'neutral': 2}
file_name = os.path.join(data_dir, 'snli_1.0_train.txt'
if is_train else 'snli_1.0_test.txt')
with open(file_name, 'r') as f:
rows = [row.split('\t') for row in f.readlines()[1:]]
premises = [extract_text(row[1]) for row in rows if row[0] in label_set]
hypotheses = [extract_text(row[2]) for row in rows if row[0] in label_set]
labels = [label_set[row[0]] for row in rows if row[0] in label_set]
return premises, hypotheses, labels
現在讓我們打印前 3 對前提和假設,以及它們的標簽(“0”、“1”和“2”分別對應“蘊含”、“矛盾”和“中性”)。
premise: A person on a horse jumps over a broken down airplane .
hypothesis: A person is training his horse for a competition .
label: 2
premise: A person on a horse jumps over a broken down airplane .
hypothesis: A person is at a diner , ordering an omelette .
label: 1
premise: A person on a horse jumps over a broken down airplane .
hypothesis: A person is outdoors , on a horse .
label: 0
premise: A person on a horse jumps over a broken down airplane .
hypothesis: A person is training his horse for a competition .
label: 2
premise: A person on a horse jumps over a broken down airplane .
hypothesis: A person is at a diner , ordering an omelette .
label: 1
premise: A person on a horse jumps over a broken down airplane .
hypothesis: A person is outdoors , on a horse .
label: 0
訓練集約550000對,測試集約10000對。下圖表明“蘊含”、“矛盾”、“中性”這三個標簽在訓練集和測試集上都是均衡的。
[183416, 183187, 182764]
[3368, 3237, 3219]
評論