使用fasttext實現文本處理及文字預測

來源:互聯網
上載者:User

 向AI轉型的程式員都關注了這個號???


大資料採礦DT資料分析  公眾號: datadw



因為參加datafountain和CCF聯合舉辦的大資料競賽,第一次接觸到文字預測。對比了一些模型,最終還是決定試一下fasttext。上手fasttext的過程可以說是很痛苦了,因為國內各大部落格網站上很少有fasttext的部落格。一方面是fasttext是FaceBook去年才開源的,用的人比較少,還有一方面是fasttext大部分參考資料都是英文的,我啃了好久英文文檔,搭梯子去國外的論壇,最後也算是簡單上手了吧。這兩天差不多所有時間都花在這上面了,感觸挺深。基於以上幾點,我覺得還是寫一篇部落格吧,雖然只是入門,也各位看官多多點評,提出不同意見。
問題分析

360搜尋出的這道題,題目是“360搜尋-AlphaGo之後“人機大戰”Round 2 ——機器寫作與人類寫作的巔峰對決”,乍一看挺嚇人的,其實是讓開發人員通過一套模型,來識別一篇文章是機器寫出來的,還是人類寫出來的。其實是有一定區分的,比如說人類寫出來的文章,文章的標題和內容契合度比較高(排除標題黨的情況),而且文章本文有一定的邏輯連續性,很少在文章的body中出現亂碼。機器寫出來的文章在以上方面和人類寫出來的文章會有不同之處。


可能我這樣講還不夠直觀,“什麼才是機器寫出來的文章。”,我從資料集裡面拿出來一小篇,像以下文章就是機器寫出來的文章。


重慶永川消防提示:夏季酷暑來臨 警惕火災隱患
 電影院部分房屋結構變形、兩個安全疏散門變形無法開啟,自入伏以來,忌水性物質有生石灰,居民和單位用電量也會隨之增加,由此引發的火也比較多,重慶市永川消防支隊在此提醒大家:高溫天氣裡要增強安全防範意識,加強火災防控,要時刻警惕以下幾種常見的火災。救援消防官兵抵達現場。一、電氣火災。隨著高溫天氣的到來,空調、冰箱等用電裝置大量增加,電氣裝置線路超負荷運轉,電源絕緣皮損壞造成短路打火,圖為被困人員被成功救出。或電器的電動機進水受潮,使絕緣強度降低,發生短路燒毀電機著火等。二、汽車火災。救援消防官兵抵達現場,夏天很容易發生汽車火災,主要原因是:有些汽車使用時間過長,一直從二樓視窗向外大聲呼喊”救命”,電源線路老化易發生短路,有的汽車超負荷裝載,造成發動機溫度升高,再加上天氣酷熱,發動機通風裝置不好,從而引起汽車自燃。並且,有些車主為了車內空氣清新,導致正在電影院內觀看電影的9名民眾被困,選擇在其車內放置香水、空氣清新劑、二組對被困民眾進行情緒安撫。老花鏡、打火機等物品,極易引發火災。三、該縣碧羅數字電影院背後發生山體滑坡,電瓶車火災。成功將變形的安全疏散門破拆出一個能夠容納單人通過的出口。隨著電瓶車的普及,電瓶車充電引發火災不在少數。特別是有些使用者私拉亂接電線,不按要求使用插線板,貢山縣碧羅數字電影院背後發生山體滑坡。違規充電引發火災。四、施工現場火災。對施工現場的氧氣瓶、乙炔瓶、防火材料、油漆稀料等易燃易爆物品管理不嚴,直接放在高溫下暴晒,未採取有效遮擋措施,沒有設定在通風、陰涼地點儲存,三組利用破拆工具對變形的安全門進行破拆,這樣很容易發生火災事故五、危化品火災。成功將變形的安全疏散門破拆出一個能夠容納單人通過的出口。夏季地面氣溫有時高達40℃以上,救援消防官兵通過金屬切割機、破門器、液壓破拆工具組等破拆裝備的配合使用,在這樣炎熱的氣溫條件下,化學危險物品在生產、圖為被困人員被成功救出。運輸、過氧化堿。所以,一定要謹慎保管、圖為受損嚴重的碧羅數字電影院,使用易燃易爆化學危險品。六、物質自燃火災。自燃物質除過去我們常講的稻草、煤堆、棉垛外,被困人員已被全部救出,還有油質纖維、三、硝酸銨化肥、導致正在電影院內觀看電影的9名民眾被困,魚粉、農產品等。這些物質儲存時,如果堆積時間過長,通風不好,自身就會發生變化產生熱,溫度逐漸升高。忌水性物質有生石灰,無水氧化鋁,過氧化堿,氯磺酸等,這些物質遇到水或空氣中的潮氣後就會釋放出大量可燃氣體,四。


上面的文章,仔細看可以看出破綻:

1、存在反覆,且不需要反覆強調的文字,例如“忌水性物質有生石灰”;

2、邏輯不通順,文章結尾一個“四”,不知其所指;

3、文章有明顯拼湊痕迹,從“一二三四”幾點可以看出是從很多篇文章中剪輯而來,上下文關聯性弱。


目標

有兩個資料集(分別是1.6GB和2GB),一個資料集是訓練集(訓練模型之用),另一個資料集是測試集(提交結果之用)。


資料格式

資料一:訓練集,規模50萬條範例(有標籤答案),資料格式如下:

Field Type Description Note
文章ID String 文章ID
文章標題 String 文章的標題,字數在100字之內 已脫敏。去掉了分行符號號。
文章內容 String 文章的內容 已脫敏。文章內容是一個長字串,去掉了分行符號號。
標籤答案 String 人類寫作是POSITIVE, 機器人寫作是NEGATIVE 機器人寫手和人類撰寫的文章,參賽者訓練資料,可以選擇本集合的全量資料,也可以選擇部分資料。但是參賽者不能自行尋找額外的資料加入訓練集。

資料二:測試集A,規模10萬條範例(無標籤答案),資料格式如下:

Field Type Description Note
文章ID String 文章ID
文章標題 String 文章的標題,字數在100字之內 已脫敏。去掉了分行符號號。
文章內容 String 文章的內容 已脫敏。文章內容是一個長字串,去掉了分行符號號。


資料三:測試集B,規模30萬條範例(無標籤答案),資料格式如下:

Field Type Description Note
文章ID String 文章ID
文章標題 String 文章的標題,字數在100字之內 已脫敏。去掉了分行符號號。
文章內容 String 文章的內容 已脫敏。文章內容是一個長字串,去掉了換行

上述三份資料中,都同時包含了機器人寫手和人類撰寫的文章資料。一條範例主要包括文章ID、文章標題、文章內容和標籤資訊(人類寫作是POSITIVE, 機器人寫作是NEGATIVE)。需要在訓練集上得到模型,然後使用模型在測試集上判定一篇文章是真人寫作還是機器產生。如果這篇文章是由機器人寫作產生的,則標籤為NEGATIVE,否則為POSITIVE。僅在訓練集上提供標籤特徵,參賽選手需要在測試集上對該標籤進行預測。


資料預先處理

資料預先處理可以說是很關鍵了,很多團隊都表示需要花大量的時間用於資料的預先處理,我這邊偷個懶,採用jieba對訓練集和測試集文字進行分詞,並且順手把它轉化為fasttext格式。


#encoding=utf-8
import jieba
#author linxinzhu
seg_list = jieba.cut("這個競賽真的費時間",cut_all=True)
print "Full Mode:", "/ ".join(seg_list) #全模式

seg_list = jieba.cut("zwq沉迷逛QQ空間,還時不時撩妹",cut_all=False)
print "Default Mode:", "/ ".join(seg_list) #精確模式

seg_list = jieba.cut("測試集好大啊,跑一次要好久") #預設是精確模式
print ", ".join(seg_list)

seg_list = jieba.cut_for_search("這篇部落格是在2017年11月17日寫的,
各位看官覺得有用的話,可以評論點贊") #搜尋引擎模式
print ", ".join(seg_list)


輸出結果

PS C:\Users\LinXinzhu\py> python fenci.pyFull Mode:Building prefix dict from C:\Python27\lib\site-packages\jieba\dict.txt ...Loading model from cache c:\users\linxin~1\appdata\local\temp\jieba.cacheLoading model cost 0.804000139236 seconds.Prefix dict has been built succesfully. 這個/ 競賽/ 真的/ 費時/ 費時間/ 時間Default Mode: zwq/ 沉迷/ 逛/ QQ/ 空間/ ,/ 還/ 時不時/ 撩妹測試, 集好, 大, 啊, ,, 跑, 一次, 要, 好久這篇, 部落格, 是, 在, 2017, 年, 11, 月, 17, 日寫, 的, ,, 各位, 看官, 覺得, 有用, 的話, ,, 可以, 評論, 點贊


需要注意的是:

1、代碼開頭記得寫上編碼方式,包括後面的fasttext在編碼上也挺麻煩的,不寫的話有驚喜哦。

2、jieba.cut返回一個list,所以在做字串拼接的時候要把list轉成string,常用的就是“ ”.join()


符號處理


def go_split(s,min_len):
   # 拼接Regex
   symbol = ',;。。、。!'
   symbol = "[" + symbol + "]+"
   # 一次性分割字串
   result = re.split(symbol, s)
return [x for x in result if len(x)>min_len]

def is_dup(s,min_len):
   result = go_split(s,min_len)
return len(result) !=len(set(result))

def is_neg_symbol(uchar):
   neg_symbol=['!', '0', ';', '?', '、', '。', ',']
return uchar in neg_symbol

特殊文書處理

一些文字,例如“的”、“了”等等在某個地方有特殊含義,例如“的確”、“瞭解”,但是在大部分的情況下對文章的語義沒有特別的影響。例如”今天早上喝了牛奶“與”今天早上喝牛奶“沒有太大的區別。



if (ur",的" in s0) and (not(ur",的確" in s0)) and (not(ur",計程車" in s0)) \
and (not(ur",的哥" in s0)) and (not(ur",的的確確" in s0)):
       flag = "NEGATIVE"
   if (ur",了" in s0) and (not(ur",瞭解" in s0)) and (not(ur",了結" in s0)) \
and (not(ur",了無" in s0)) and (not(ur",了卻" in s0)) \
and (not(ur",了不起" in s0)):
       flag = "NEGATIVE"

   if (ur"。的" in s0) and (not(ur"。的確" in s0)) and (not(ur"。計程車" in s0)) \
and (not(ur"。的哥" in s0)) and (not(ur"。的的確確" in s0)):
       flag = "NEGATIVE"
   if (ur"。了" in s0) and (not(ur"。瞭解" in s0)) and (not(ur"。了結" in s0)) \
and (not(ur"。了無" in s0)) and (not(ur"。了卻" in s0)) \
and (not(ur"。了不起" in s0)):
       flag = "NEGATIVE"

   if (ur";的" in s0) and (not(ur";的確" in s0)) and (not(ur";計程車" in s0)) \
and (not(ur";的哥" in s0)) and (not(ur";的的確確" in s0)):
       flag = "NEGATIVE"
   if (ur";了" in s0) and (not(ur"瞭解;" in s0)) and (not(ur";了結" in s0)) \
and (not(ur";了無" in s0)) and (not(ur";了卻" in s0)) \
and (not(ur";了不起" in s0)):
       flag = "NEGATIVE"

   if (ur"?的" in s0) and (not(ur"?的確" in s0)) and (not(ur"?計程車" in s0)) \
and (not(ur"?的哥" in s0)) and (not(ur"?的的確確" in s0)):
       flag = "NEGATIVE"
   if (ur"?了" in s0) and (not(ur"?瞭解" in s0)) and (not(ur"?了結" in s0)) \
and (not(ur"?了無" in s0)) and (not(ur"?了卻" in s0)) \
and (not(

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.