中文文字預處理--主題模型
去掉低頻詞、分詞、繁簡轉化、替換奇異詞等是中文文字資料處理中的重要步驟。
低頻詞
如在主題模型中,資料預處理的要求很簡單,只需要去掉低頻詞,大多數文章設定的門限都是5或者6.
分詞
中文文字相比於英文,需要首先進行分詞處理。類似地還有日文、韓文等。因而自然預言處理中一個重要的研究問題就是文字分詞技術。
國內常用的分詞工具有北理工張華平老師的NLPIR分詞包和百度工程師開發的jieba分詞,名字很有意思。
兩者都有Python版本,下面以jieba分詞為例:
import jieba
seg_list = jieba.cut("我來到北京清華大學" , cut_all=True)
需要注意的是,分詞模型中比較重要的兩個點,是上下文和詞典。兩者都能極大地影響分詞效果,簡單來講,就是需要輸入文字內容較長,和詞典較全面。上例中的文字輸入對於初學者具有較強的誤導性,就是對一篇文章,可以分成一句一句來分詞,這是錯誤的。最好的情況是把所有需要被分詞的文字都拼接成一個長文字,然後輸入。如果有段落分隔需要的,可以用’\n’等特殊字元進行分割,在得到輸出的時候直接用str.split(‘\n’)分開就好。詞典就不用說了,我整理了一個比較全面的超大詞典,共享在github上,歡迎選用。只是詞的詞頻賦權還不夠全面,不過影響不大。連結:out link
詞幹化
英文論文中,常見到會對文字進行詞幹化處理(stemming), 就是吧把具有相同詞幹的單詞整理成一個單詞,也有點去掉低頻詞的意味,可以明顯改善詞頻較低的問題。主要原因還是因為在自然預言理解的時候,一個詞被替換成其詞幹不會影響理解,而能夠改善詞頻較低的問題。是統計建模前的必要處理過程。如:
tall, taller, tallest
good, better, best
分別具有相同的詞幹。python中有package可以處理這個問題,如stemming等,實現了若干知名演算法。具體的包演算法沒看,但是最簡單的一個方法是利用英文百科詞典,如word net這個語法資料庫,直接mapping就好了。
提取中文
當然了,中文資料集中包括很多數字、英文單詞、表情符號等。因而需要用正則表示式將他們全部提取出來。有很多文章研究了中文字元、中亞字元等的unicode範圍,下面是一個自測滿足中文字元提取的程式碼,直接copy用就好了。
def Chinese_word_extraction(content_raw):
chinese_pattern = u"([\u4e00-\u9fa5]+)"
re_data = chi_pattern.findall(content_raw)
content_clean = ' '.join(re_data)
混淆對映
我處理的網易新聞資料集中有一個問題,就是網民在提到自認為的敏感詞的時候,會採用同音字、典故等方法進行替換。或者在敏感詞中加入一些特殊符號進行間隔。這些方法都太naive了,利用同音字對映、聯絡上下文和正則提取等方法就能解決這些問題。以後有時間了可以研究一下,挺有意思,而且已有的頂會論文好像就專門研究了這個問題。下面是我根據觀察發現的若干常用替換:
replace_dict = {
u'吻腚':u'穩定',
u'弓雖':u'強',
u'女幹':u'奸',
u'示土':u'社',
u'禾口':u'和',
u'言皆':u'諧',
u'釋永性':u'釋永信',
u'大菊觀':u'大局觀',
u'yl':u'一樓',
u'cnm':u'草泥馬',
u'CCTV':u'中央電視臺',
u'CCAV':u'中央電視臺',
u'ccav':u'中央電視臺',
u'cctv':u'中央電視臺',
u'qq':u'騰訊聊天賬號',
u'QQ':u'騰訊聊天賬號',
u'cctv':u'中央電視臺',
u'CEO':u'執行長',
u'克宮':u'克里姆林宮',
u'PM2.5':u'細顆粒物',
u'pm2.5':u'細顆粒物',
u'SDR':u'特別提款權',
u'裝13':u'裝逼',
u'213':u'二逼',
u'13億':u'十三億',
u'巭':u'功夫',
u'孬':u'不好',
u'嫑':u'不要',
u'夯':u'大力',
u'芘':u'操逼',
u'烎':u'開火',
u'菌堆':u'軍隊',
u'sb':u'傻逼',
u'SB':u'傻逼',
u'Sb':u'傻逼',
u'sB':u'傻逼',
u'is':u'伊斯蘭國',
u'isis':u'伊斯蘭國',
u'ISIS':u'伊斯蘭國',
u'ko':u'打暈',
u'你M':u'你妹',
u'你m':u'你妹',
u'震精':u'震驚',
u'返工分子':u'反共',
u'黃皮鵝狗':u'黃面板俄羅斯狗腿',
u'蘇禍姨':u'蘇霍伊',
u'混球屎報':u'環球時報',
u'屎報':u'時報',
u'jb':u'雞巴',
u'j巴':u'雞巴',
u'j8':u'雞巴',
u'J8':u'雞巴',
u'JB':u'雞巴',
u'瞎BB':u'瞎說',
u'nb':u'牛逼',
u'牛b':u'牛逼',
u'牛B':u'牛逼',
u'牛bi':u'牛逼',
u'牛掰':u'牛逼',
u'蘇24':u'蘇兩四',
u'蘇27':u'蘇兩七',
u'痰腐集團':u'貪腐集團',
u'痰腐':u'貪腐',
u'反hua':u'反華',
u'<br>':u' ',
u'屋貓':u'五毛',
u'5毛':u'五毛',
u'傻大姆':u'薩達姆',
u'黴狗':u'美狗',
u'TMD':u'他媽的',
u'tmd':u'他媽的',
u'japan':u'日本',
u'P民':u'屁民',
u'八離開燴':u'巴黎開會',
u'傻比':u'傻逼',
u'潶鬼':u'黑鬼',
u'cao':u'操',
u'愛龜':u'愛國',
u'天草':u'天朝',
u'灰機':u'飛機',
u'張將軍':u'張召忠',
u'大褲衩':u'中央電視臺總部大樓',
u'槍畢':u'槍斃',
u'環球屎報':u'環球時報',
u'環球屎包':u'環球時報',
u'混球報':u'環球時報',
u'還球時報':u'環球時報',
u'人X日報':u'人民日報',
u'人x日報':u'人民日報',
u'清只縣':u'清知縣',
u'PM值':u'顆粒物值',
u'TM':u'他媽',
u'首毒':u'首都',
u'gdp':u'國內生產總值',
u'GDP':u'國內生產總值',
u'雞的屁':u'國內生產總值',
u'999':u'紅十字會',
u'黴裡賤':u'美利堅',
u'毛子':u'俄羅斯人',
u'ZF':u'政府',
u'zf':u'政府',
u'蒸腐':u'政府',
u'黴國':u'美國',
u'狗熊':u'俄羅斯',
u'惡羅斯':u'俄羅斯',
u'我x':u'我操',
u'x你媽':u'操你媽',
u'p用':u'屁用',
u'胎毒':u'臺獨',
u'DT':u'蛋疼',
u'dt':u'蛋疼',
u'IT':u'資訊科技',
u'1樓':u'一樓',
u'2樓':u'二樓',
u'2逼':u'二逼',
u'二b':u'二逼',
u'二B':u'二逼',
u'晚9':u'晚九',
u'朝5':u'朝五',
u'黃易':u'黃色網易',
u'艹':u'操',
u'滾下擡':u'滾下臺',
u'靈道':u'領導',
u'煳':u'糊',
u'跟貼被火星網友帶走啦':u'',
u'猿們':u'公務員們',
u'棺猿':u'官員',
u'貫猿':u'官員',
u'每隻猿':u'每個公務員',
u'巢縣':u'朝鮮',
u'死大林':u'斯大林',
u'無毛們':u'五毛們',
u'天巢':u'天朝',
u'普特勒':u'普京',
u'依拉克':u'伊拉克',
u'殲20':u'殲二零',
u'殲10':u'殲十',
u'殲8':u'殲八',
u'f22':u'猛禽',
u'p民':u'屁民',
u'鍾殃':u'中央'
}
還非常不全面,也不是長久之計,下面搞一搞這個問題說不定還能水一篇論文,哈哈。