1. 程式人生 > >中文文字蘊含計算專案(88萬中文文字蘊含資料集+中文文字蘊含模型)

中文文字蘊含計算專案(88萬中文文字蘊含資料集+中文文字蘊含模型)

ChineseTextualInference

ChineseTextualInference project including chinese corpus build and inferecence model, 中文文字推斷專案,包括88萬文字蘊含中文文字蘊含資料集的翻譯與構建,基於深度學習的文字蘊含判定模型構建.
專案地址:https://github.com/liuhuanyong/ChineseTextualInference

專案介紹

文字間的推理關係,又稱為文字蘊含關係 (TextualEntailment),作為一種基本的文字間語義聯絡,廣泛存在於自然語言文字中。簡單的來說文字蘊含關係描述的是兩個文字之間的推理關係,其中一個文字作為前提(premise),另一個文字作為假設(hypothesis),如果根據前提P能夠推理得出假設H,那麼就說P蘊含H,記做P->H,這跟一階邏輯中的蘊含關係是類似的。
目前關於文字蘊含還存在兩個問題:
一,中文文字蘊含資料集嚴重匱乏
目前,關於文字蘊含的研究主要還是集中在英文,如評測中常常使用的SNLI資料集與MultiNIL:
1) The Stanford Natural Language Inference (SNLI) 是斯坦福大學NLP組釋出的文字蘊含識別的資料集。SNLI由人工標註的,一共包含570K個文字對,其中訓練集550K,驗證集10K,測試集10K,一共包含三類entailment,contradiction,neutra,上節提到的例子就是出自此資料集
2) The Multi-Genre Natural Language Inference (MultiNLI)是一個眾包資料集,包含433k個文字對。

然而,在中文中,還沒有出現大規模的文字蘊含資料集, CCL2018有一個文字蘊含的評測,由北京語言大學於東老師團隊組織的,釋出了一個數量級為10W的評測集,這是目前最大的一個文字蘊含資料集,與英文還有很大的差距。
二,語言之間存在根本性差異
在英文SNIL資料集中,準確率已經達到將近90%,這個準確率是在50W+資料集上得到的,而中文與英文有實質性差異,英文的文字蘊含模型無法直接應用到中文的文字蘊含當中,我們需要在中文上做技術上的PK,做本土化的創新.

因此,本專案將嘗試完成兩個任務:
一, 完成與SNIL規模相當的中文文字蘊含資料集
二, 基於構建起的中文文字蘊含資料集, 嘗試完成模型實驗

專案架構

image

中文文字蘊含資料集構建

1,英文文字蘊含資料

A snowboarder on a wide plain of snow	A snow field with a snowboarder on it	entailment
A snowboarder on a wide plain of snow	A snowboarder gliding over a field of snow	neutral
A snowboarder on a wide plain of snow	A snowmobile in a blizzard	neutral
An older women tending to a garden.	The lady is cooking dinner	contradiction
An older women tending to a garden.	The lady is weeding her garden	neutral
An older women tending to a garden.	The lady has a garden	entailment
A man in a black shirt overlooking bike maintenance.	A man destroys a bike.	contradiction
A man in a black shirt overlooking bike maintenance.	A man watches bike repairs.	entailment
A man in a black shirt overlooking bike maintenance.	A man learns bike maintenance.	neutral
A man in a black shirt is looking at a bike in a workshop.	A man is wearing a red shirt	contradiction
A man in a black shirt is looking at a bike in a workshop.	A man is in a black shirt	entailment
A man in a black shirt is looking at a bike in a workshop.	A man is deciding which bike to buy	neutral

2,中英文文字語料翻譯
translate_duba.py

class Translate:
    def __init__(self):
        return

    '''獲取html'''
    def get_html(self, url):
        headers = {
            'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
            'Connection': 'keep-alive'
        }
        req = request.Request(url, headers=headers)
        page = request.urlopen(req).read()
        page = page.decode('utf-8')
        return page

    '''解析翻譯答案'''
    def extract_answers(self, content):
        selector = etree.HTML(content)
        answer = selector.xpath('//div[@class="in-base"]/div/div/text()')[0]
        return answer

    '''翻譯主函式'''
    def translate(self, query):
        url = 'http://www.iciba.com/{}'.format(query)
        html = self.get_html(url)
        try:
            answer = self.extract_answers(html)
        except Exception as e:
            answer = query
        return answer

3,翻譯後中文文字蘊含資料集

一名身穿灰色T恤的男子站在一輛卡車和一棵小樹的停車收費表旁邊。	這輛卡車是綠色的。	neutral
摩托車排成一排,靠在一座建築物上。	停車場裡到處都是汽車。	contradiction
一男一女在街角接吻。	一對男女在接吻。	entailment
一名身穿綠色制服,手裡拿著球的足球運動員被他的一些隊友舉起,而另一名穿紅色球衣的球員則伸手去接球。	這位綠色球員受傷了,他的隊友正在幫助他。	neutral
一個男人坐在陽光下,坐在長凳上,彈著班卓琴,而一隻加拿大鵝看著。	有個人站著彈吉他。	contradiction
一個棕色頭髮的女人,對著麥克風唱歌。	一個女人唱歌。	entailment
一位穿著深色外套的女士正坐著,身邊有許多人。	一位女士正試圖在節日舉行飲食比賽。	neutral
一位水泥工人正在一家服裝店外的一條新人行道上工作。	一名工人在工作。	contradiction
巴爾從後板凳上扔出莫洛托夫雞尾酒,就像金裡奇曾經做過的那樣。	金裡奇和巴爾都把莫洛托夫雞尾酒從後排扔出去了。	entailment
一群兒童和成年人在樹林裡的一條土路上騎自行車。	一個家庭在鄉下騎自行車。	neutral
兩個人手拿著一根杆子在外面工作。	兩個男人在外面捕鯨。	contradiction
這是一張男人睡在牆上或冥想的照片。	一個人在牆附近。	entailment
當三個人經過時,人行道上有建築。	他們最近拆毀了那裡的一座建築物。	neutral
老太太坐在滿是鮮花的房間裡。	這位老太太正在廚房裡做蛋糕。	contradiction
游泳者潛入藍色游泳池水中。	有一個人在水裡。	entailment

4, 中英文文字蘊含資料集規模

語言型別 句子數 蘊含句子對數
中文 100W 88W
英文 116W 96W

中文文字蘊含模型實驗

本實驗採用兩個雙向LSTM對前提Premise和假設hypothsis進行編碼,最周將兩個句子表徵進行拼接,送入全連線層進行三分類
1, 網路層如下:

    embedding_layer = Embedding(self.VOCAB_SIZE + 1,
                                self.EMBEDDING_DIM,
                                weights=[self.embedding_matrix],
                                input_length=self.TIME_STAMPS,
                                trainable=False,
                                mask_zero=True)
    left_input = Input(shape=(self.TIME_STAMPS,), dtype='float32')
    right_input = Input(shape=(self.TIME_STAMPS,), dtype='float32')
    encoded_left = embedding_layer(left_input)
    encoded_right = embedding_layer(right_input)
    shared_lstm = self.create_base_network(input_shape=(self.TIME_STAMPS, self.EMBEDDING_DIM))
    left_output = shared_lstm(encoded_left)
    right_output = shared_lstm(encoded_right)
    merged = concatenate([left_output, right_output], axis=-1)
    merged = Dropout(0.3)(merged)
    merged = BatchNormalization()(merged)
    pred = Dense(self.NUM_CLASSES, activation='softmax', name='softmax_prediction')(merged)
    optimizer = SGD(lr=0.001, momentum=0.9)
    model = Model(inputs=[left_input, right_input], outputs=pred)
    model.compile(loss='categorical_crossentropy',
                  optimizer=optimizer,
                  metrics=['accuracy'])
    model.summary()

2, 實驗結果

模型 訓練集 測試集 訓練集準確率 測試集準確率
Bilstm 30w 10W 0.56 0.54

總結

1, 本專案針對中文文字蘊含資料集數量不足的問題,提出了一箇中文文字蘊含資料集,規模達到88W
2, 藉助翻譯方法進行英文中文轉換,前提是英文句子較為短小,短句的翻譯效果還是不錯的
3, 原先打算使用百度API進行翻譯,但是使用次數有限制,因此轉而以金山毒霸代之,使用線上翻譯結果
4, 本專案實現了一個以LSTM進行文字蘊含三分類的模型,準確率不是很高,只有0.54左右,後期還有很大的優化空間

any question? 請聯絡我:
郵箱:[email protected]
csdn:https://blog.csdn.net/lhy2014
我的自然語言處理專案: https://liuhuanyong.github.io/