如何打造高質量的NLP資料集

夕小瑤發表於2019-09-03

今天發燒睡了一天T^T,睡醒後刷了刷知乎,刷到了這個問題

知乎:如何打造高質量的機器學習資料集?
https://www.zhihu.com/question/333074061/answer/773825458

於是就有了暖暖賣萌屋的衝動( ̄∇ ̄)

無論是做研究還是解決業務問題,做資料集都是繞不開的問題。很多剛入行的同學覺得釋出一個資料集是最容易灌水的了,燃鵝如果你真的做過就會發現,隨意產生一個資料集很容易,但是若以解決實際問題或讓大家能在上面磕鹽玩耍為目的,來產生一個能用的、質量高的、難度適中的資料集一點都不容易,超級費時費腦子甚至費錢好不好(╯°□°)╯︵┻━┻

雖然並沒有刻意的研究資料集該怎麼做,不過因為專案或研究需要,已經被趕鴨子上架的做了近10個資料集了,不過只是在問答、對話和一些分類問題上做過,所以像私信箱裡“如何構建知識圖譜”這類問題就請放過小夕吧╮( ̄▽ ̄””)╭

由於沒有很刻意的研究過這個問題,所以就分享幾個個人覺得比較重要的點吧,分別是

  1. 什麼是高質量

  2. 基本工具

  3. 資料與標籤來源

  4. 適可而止的預處理

  5. 驗證可用性,儘早構造資料集迭代閉環

  6. 關於複雜NLP任務

什麼是高質量

剛入坑的一些小夥伴可能會以為“高質量”=“超級乾淨”,於是為了追求“高質量”而瘋狂的預處理,最後哭了╮(╯▽╰)╭。

做資料集一般有兩種動機。一種是為了research,也就是為了造福廣大研究人員以及推動領域的進步;

不得不說SQuAD的釋出對NLP這一波研究熱潮的推動作用還是蠻大的

另一種,就是為了使用資料驅動的方法來優化業務指標,或解決專案中實實在在存在的問題。

這兩個看似不太相關的目的背後對“高質量”的定義確是非常相近的,那就是:解決問題!

只不過,對後一種目的來說,問題一般來源於線上系統

一般來說,在做資料集之前一般已經存在一套系統了(為了讓系統冷啟動,一般先開發一套規則驅動的系統),系統上線後自然會產生日誌,分析其中的badcase便可以知道哪些問題是現有系統搞不定的,這些問題就可以考慮使用資料驅動的方法來解決,於是需要做資料集了。而解決這些問題就是你做資料集的第一目標啦。

而對於前一種目的來說,問題一般來源於學術界的研究現狀

現階段的NLP研究多為資料驅動的,甚至說資料集驅動的。雖然這不是一個好現象,不過也不得不承認很大程度上推動了NLP的發展和研究熱潮。當現有的資料集無法cover領域痛點,或無法發揮數學工具潛力,或已經被解決掉的時候,就需要一個新的資料集,更確切的說是新的benchmark了。

換句話說,還有哪些問題是行業痛點問題?或可以進一步挖掘現階段數學工具的潛力?或現有數學工具的現發展階段還沒法很好的解決該問題?這應該是做一個高質量資料集前首先要考慮的問題。

想想2015年的SNLI[1]、2016年的SQuAD[2]、2018年的GLUE[3], CoQA[4],再到如今的SuperGLUE[5], MRQA(https://mrqa.github.io),都是問題驅動的,當現有資料集不足以cover問題痛點或無法滿足數學工具潛力,或上一個問題已經被解決的差不多的時候,就會有新的資料集冒出來解決下一個痛點問題。

在明確要解決的問題後,資料集的質量也就保障了一半,剩下的一半就要看這個資料集怎麼做啦。這裡面最關鍵的問題是資料與標籤來源的選擇,以及預處理程度的把握。除此之外,迭代閉環的構建以及對複雜NLP任務的處理也會對問題解決的效率和質量產生非常重要的影響。下面開始依次介紹(~ ̄∇ ̄)-☆

基本工具

所謂工欲善其事必先利其器,只要不是太著急,在做資料集之前先掌握一些好用的工具和tricks,可以大大減少無謂的重複和低效勞動,提高迭代效率。

  • github
    寫爬蟲和清洗最原始資料之前先在github找一下

  • 正規表示式
    文字清洗利器,不解釋

  • Hadoop/Spark
    千萬級以上的語料就別去為難你的小伺服器了

  • vim
    分析樣本專用。資料集只有幾萬或一二十萬的話,vim效能一般還是夠用的,不過預設的vim配置是比較雞肋和反人類的,需要事先熟悉和配置好。要是跟vim過不去,其他帶正則搜尋和高亮顯示的效能別太差的編輯器也ok

  • awk,grep,cut,wc等命令列工具

    分析樣本專用。資料集大了,你的vim就罷工了,當然你要是跟這些命令過不去也可以在ipython裡玩,只不過寫程式碼效率更低,而且分析結果儲存起來更麻煩一些,再就是別來open(file).readlines()這種神操作就好

  • ipython + screen/tmux
    在分析一些重要的資料集統計特性如樣本長度分佈時,開個vim寫python指令碼會很低效,資料集一大的話反覆IO更是讓人無法忍受的。因此開個ipython把資料集或取樣的一部分資料集load進記憶體裡,再進行各種分析會高效的多。
    另外為了避免ssh斷開後從頭重來,可以把ipython掛在screen或者tmux視窗裡。當然啦,load進來的資料比較多時,記得時不時的del一下無用的中間結果,以免把伺服器記憶體撐爆。哦對,記得了解一些常用的magic命令如%save,可以很方便的對複雜操作進行備份。

資料與標籤來源

對資料集質量產生第二關鍵影響的就是資料和標籤來源的選擇了。其中資料可以通過人工構造、撰寫的方式來產生,也可以從網際網路上爬取或對公開資料集進行二次加工得到;標籤同樣可以人工標註,也可以遠端監督的方式來獲取。

人工構造和標註

最容易想到的方式就是資料和標籤都來源於人工啦( ̄∇ ̄)可惜小夕並沒有資金去眾包平臺上幫你們積累經驗(。 ́︿ ̀。)對於很多相對簡單的NLP任務,資料一般在網際網路上總能找到合適的,但是也有一些任務的資料很難在網際網路上接觸到,一般情況下只能人工精心構造(比如自然語言推理,任務型對話中的大部分子任務,分詞、NER、抽取等一些序列標註任務)。如果有小夥伴想系統的學習標註,小夕推薦一本之前在圖書館刷過一半的一本書,叫《Natural Language Annotation》,中文名貌似叫《自然語言標註:用於機器學習》。這本書寫的挺讚的,還因此懟過一次不太會標註的PM小姐姐(//∇//)\(希望她不會看我知乎hhhh

還好對於大部分nlp任務而言,基本都能從網際網路上找到合適的資料來源,或在已有的公開資料集的基礎上加以改造就可以產生。

如果要自己爬,英文語料的話可以通過國外的twitter、quora、wiki、reddit等網站按需爬取甚至直接下載,官方提供的資料獲取指令碼滿足不了需求的話可以在github上自己搜下,基本總能找到一些奇奇怪怪的第三方爬蟲繞過限制(emmm怎麼有種教別人犯罪的感覺)。如果目標資料是中文,當然國內也會有微博、貼吧、豆瓣、百度百科、知乎等網站坐等被爬啦。

當然啦,Twitter、微博、貼吧這類網站的缺點就是灌水內容太多,爬完記得去github找相應的預處理指令碼瘦瘦身。注意別用那些太過浮誇的指令碼,處理的太乾淨可能會有問題,後面會講原因噢~

講真,自己爬資料真是dirty work超級超級多,尤其是你要爬的資料量灰常大或者去爬一些不那麼主流的網站的時候!所以小夕更加推薦的還是先從現有的資料集想辦法啦,拿來現成的然後一頓改改改絕對可以省不少力!

其實很多資料集都是這樣“偷懶”做成的,比如早期Socher把只有1萬樣本的情感分類資料集MR[16]用parser將MR裡的句子給分解為短語、子句等,再分別標註,於是就變成了20多萬樣本量、多粒度的SST[17]╮( ̄▽ ̄””)╭最近也恰好刷到一篇做文字風格控制的paper[18],同樣也是用了parser,將Yelp情感分類資料集[19]拆解後瘋狂加工,變成了結構->文字的風格化文字生成資料集(parser真是個造資料集的好東西)。總之,玩過一次就知道,改比爬方便多啦╮(╯▽╰)╭

遠端監督

在打標籤方面,最容易想到的當然還是花錢眾包,不用說了,下一個方法。

更加經濟可用的方法就是遠端監督了,這方面的可玩性就非常大啦,腦洞有多大,標註質量就會有多高!

做好遠端監督的前提就是提一個靠譜的假設,比如“給定一個query-answer pair,如果answer string在搜尋引擎召回的某document出現,那麼該document可以回答該query”,於是有了機器閱讀理解資料集TriviaQA[6]、searchQA[7];再比如“一條Twitter中包含的emoji可以反映這條Twitter的(細粒度)情感”,於是有了情感分類資料集TwitterSentiment[8]和情感可控對話生成資料集Mojitalk[9]。

如果不放心的話,自己取樣一些樣本,粗略統計一下你提出的假設成立的樣本佔比,只要大部分情況下成立就是有希望的,而後再對假設增加一些細節性的約束(比如TriviaQA裡的answer必須在doc中高頻出現;mojitalk裡的帶多媒體資訊的Twitter直接丟掉,多emoji時只看最高頻的emoji等),在一個靠譜的假設下,經過幾番小迭代往往就可以一個能用的資料集啦。

總之,玩好遠端監督也就是要掌握逆向思維,忘掉“標註”這個詞,把思維改成“握著標籤找資料“

好啦,先休息五秒,你懂滴(↓ ̄∇ ̄)↓

適可而止的預處理

其實在做資料集這個事情上,有“潔癖”並不是一件好事,尤其是當語料的lexical diversity & semantic richness比較強的時候,一條看似讓資料集更乾淨的正規表示式很可能

  1. 沙雕了一些跟類別標籤相關的有效模式,導致一些本來成立的X->Y的對映關係因此消失了

  2. 減少了模型對抗噪聲的學習機會,你無法消除所有噪聲,但是卻消除了很多模型識別噪聲適應噪聲的學習機會

這方面小夕一把辛酸淚呀,曾經花了半下午時間寫了幾十條清洗規則,結果model更難收斂以及開發集表現更差了。最終發現資料量和模型都不是太小的情況下,遵從最少預處理原則一般就夠了,除了一些常規操作(比如濾掉HTML標籤、URL、脫敏、去重、截斷等),小夕一般只對如下情況進行處理:

  1. 導致了“標籤洩漏”,這種情況容易發生在任務簡單、標籤典型的場合,資料來源比較多時尤其容易踩坑。比如你任務的目標是讓模型通過文字語義判斷情感,那就不要對emoji、顏文字手下留情了,嚴格控制它們在資料集中的比例。

  2. 導致了樣本過長,比如連續100個相同的emoji、哈、啊等

  3. 樣本中出現了預留的功能詞(比如BERT中的[UNK],[PAD],[CLS],[SEP]之類的)

當然,如果你的資料集是生成任務相關,記得濾掉黃反內容=,=。對於一些高頻錯別字,一堆點點點之類的讓你覺得dirty的東西,沒特殊需求的話就放過它們吧。。。(真想徹底消除它們的話就換資料來源啊喂,不要妄想以一人之力對抗廣大人民群眾產生的辣雞!!)

驗證可用性,儘早構造資料集迭代閉環

無論是人工標註的還是遠端監督標註的,資料集看起來做好了不代表就是可用的,如果標註的噪聲太大或者標籤邊界太過模糊(大量標註錯誤,或標註規則寫的太鬆、太模糊,導致人都分不清某幾個類別之間的區別),很可能再複雜的模型都在這份資料集上無法收斂;反之,如果資料集中有“標籤洩漏”(比如你用emoji遠端監督構造了情感分類資料集,最後卻忘了濾掉emoji)或標籤與內容有非常直接的對映關係(類別太過具體或標註規則寫的太死),那就會導致一個非常簡單的模型都會輕易的把這個資料集刷到近乎滿分,那這個模型學到的知識基本是沒有什麼實際意義的,換言之,這麼簡單直接的任務其實幾條規則幾行程式碼就搞定了,完全沒必要做資料驅動的模型訓練。

因此絕對不要抱著將資料集一次做成的心態,而是要儘早構造一個“生成資料集->跑baseline->badcase study->更新策略->重新生成資料集”的閉環。注意,baseline別選的太麻煩(那種對各種超參敏感的模型還是算了吧),最好是已被普遍驗證有效的、有開原始碼的、上手輕鬆的、基本不用調參就效果還可以的模型(比如BERT系列)。

這裡要注意側重點,在迭代的早期,讓baseline能在你的資料集上正常收斂是第一目標,中期則是關注baseline在開發集上的表現,表現太好要留意標籤洩漏或資料洩漏(X中出現了Y,或忘記去重),表現太差調調參,後期則是更多關注badcase了,看看badcase中更多的是樣本問題(標註噪聲)還是真的模型能力不夠。

關於複雜NLP任務

當然啦,上面其實都說的比較寬泛,其實在不同的NLP問題上做資料集可能會很不一樣。像一些簡單NLP任務如文字分類等基於上面的基本原則就差不多了,但是一些複雜NLP任務如任務型對話、知識圖譜相關,哪怕完全人工產生和標註都不好做的。

比如任務型對話相關的資料集,很難使用遠端監督這種偷懶的方式來構造,樣本和標籤的產生可能都很難脫離人力標註。有興趣的小夥伴可以參考MultiWOZ[10]這個資料集(cover了DST、act-to-text generation和context-to-text generation這三個任務型對話中的子任務)的paper,裡面對machine-machine(如M2M[11])、machine-human(如DSTC系列[12][13][14])、human-human(如ATIS[15],WOZ系列[10])這三種協同構造任務型對話資料集的方式總結的很到位,會讓你感受到產出一個高質量的任務完成型對話資料集是一個很有挑戰的工作,自己從頭摸索的話可能到頭來只會收穫一臉懵逼╮( ̄▽ ̄””)╭

所以面對一些比較複雜的NLP任務的時候,一定一定要記得先精讀一下最新最權威的資料集的paper,這類資料集的構建經驗可能整個微信和知乎也找不到幾篇的噢╮(╯▽╰)╭

參考文獻

[1] Bowman S R, Angeli G, Potts C, et al. A large annotated corpus for learning natural language inference[J]. arXiv preprint arXiv:1508.05326, 2015.

[2] Rajpurkar P, Zhang J, Lopyrev K, et al. Squad: 100,000+ questions for machine comprehension of text[J]. arXiv preprint arXiv:1606.05250, 2016.
[3] Wang A, Singh A, Michael J, et al. Glue: A multi-task benchmark and analysis platform for natural language understanding[J]. arXiv preprint arXiv:1804.07461, 2018.
[4] Reddy S, Chen D, Manning C D. Coqa: A conversational question answering challenge[J]. Transactions of the Association for Computational Linguistics, 2019, 7: 249-266.
[5] Wang A, Pruksachatkun Y, Nangia N, et al. Superglue: A stickier benchmark for general-purpose language understanding systems[J]. arXiv preprint arXiv:1905.00537, 2019.
[6] Joshi M, Choi E, Weld D S, et al. Triviaqa: A large scale distantly supervised challenge dataset for reading comprehension[J]. arXiv preprint arXiv:1705.03551, 2017.
[7] Dunn M, Sagun L, Higgins M, et al. Searchqa: A new q&a dataset augmented with context from a search engine[J]. arXiv preprint arXiv:1704.05179, 2017.
[8] Go A, Bhayani R, Huang L. Twitter sentiment classification using distant supervision[J]. CS224N Project Report, Stanford, 2009, 1(12): 2009.
[9] Zhou X, Wang W Y. Mojitalk: Generating emotional responses at scale[J]. arXiv preprint arXiv:1711.04090, 2017.
[10] Budzianowski P, Wen T H, Tseng B H, et al. Multiwoz-a large-scale multi-domain wizard-of-oz dataset for task-oriented dialogue modelling[J]. arXiv preprint arXiv:1810.00278, 2018.
[11] P Shah, D Hakkani-Tur, G Tur, A Rastogi, A Bapna, N Nayak, and L Heck. 2018. Building a conversational agent overnight with dialogue self-play. arXiv preprint arXiv:1801.04871.
[12] Jason Williams, Antoine Raux, Deepak Ramachan- dran, and Alan Black. 2013. The dialog state track- ing challenge. In Proceedings of the SIGDIAL 2013 Conference, pages 404–413.
[13] M. Henderson, B. Thomson, and S. J. Young. 2014b. Word-based Dialog State Tracking with Recurrent Neural Networks. In Proceedings of SIGdial.
[14] Matthew Henderson, Blaise Thomson, and Jason D Williams. 2014c. The third dialog state tracking challenge. In Spoken Language Technology Work- shop (SLT), 2014 IEEE, pages 324–329. IEEE.
[15] Charles T Hemphill, John J Godfrey, and George R Doddington. 1990. The atis spoken language sys- tems pilot corpus. In Speech and Natural Language: Proceedings of a Workshop Held at Hidden Valley, Pennsylvania
[16] B. Pang, L. Lee. 2005. Seeing stars: Exploiting class relationships for sentiment categorization with re- spect to rating scales. In Proceedings of ACL 2005.
[17] R. Socher, A. Perelygin, J. Wu, J. Chuang, C. Manning, A. Ng, C. Potts. 2013. Recursive Deep Models for Semantic Compositionality Over a Sentiment Tree- bank. In Proceedings of EMNLP 2013.
[18] Oraby S, Harrison V, Ebrahimi A, et al. Curate and Generate: A Corpus and Method for Joint Control of Semantics and Style in Neural NLG[J]. arXiv preprint arXiv:1906.01334, 2019.
[19] Zhang X, Zhao J, LeCun Y. Character-level convolutional networks for text classification[C]//Advances in neural information processing systems. 2015: 649-657.

相關文章