解析搜狗新聞語料庫


最近收到很多要語料的,我把關於這個的都放在百度雲盤了。鏈接: https://pan.baidu.com/s/1tZj8MDiPfCT2SYBvClQbew 提取碼: krbd ;大家有需要就從里面找吧!不零碎得回復大家了。

我的天,清明節三天假期,我竟然除了逛街閑游,只做了一件事兒,不過還是很開心,終於把待用的訓練文本解析出來了。在這里,非常感謝參考文章的作者們,你們的經驗給了我極大的幫助。[捂臉]

1.下載語料資源並轉換編碼格式

所用的文本是搜狗實驗室數據資源,新聞資源中的搜狐新聞數據。下載的是壓縮后的完整版(648MB),解壓縮之后是一個.dat文件,差不多是2.02GB。同時也下載了精簡版,精簡版解壓縮后是很多的.txt文件。

 下載好待用的資源,后面就是解析了,可是問題來了,這個.dat文件太大了,想用記事本什么的打開根本是不可能的,但是我們必須打開,因為我們在用精簡版的.txt做解析時,需要首先將.txt文本的編碼格式從ASCII轉換為UTF-8,同樣這個.dat文件的編碼格式一定也是ASCII怎么辦呢?只能用vimVim是一個強大的文本編輯器,我們的目的是改變.dat的編碼格式。所以打開VIM,執行下面的操作:

:e (用鼠標把文件拖進來就可以)
:set encoding
返回encoding = cp936
:set fileencoding=UTF-8
:w!

 到這里我們就完成了第一步,轉換文本編碼格式。下一步我們要用Python寫個小腳本把.dat分解成幾個.txt,這樣便於后面的統一操作,就可以按照解析精簡版的方法解析這個大文件了。第三步就是將xml文件轉換為分類后的.txt文件。

2.分割.dat為幾個.txt

#! /usr/bin/env Python3
# -*- coding:utf8 -*- 
import re       #正則表達式

def split():
    p = re.compile('</doc>',re.S)
    end = '</doc>'
    fileContent = open('./news.dat','r',encoding='utf8').read();  #讀文件內容
    paraList = p.split(fileContent)     #根據</doc>對文本進行切片
    #print(len(paraList))

    fileWriter = open('./files/0.txt','a',encoding='utf8')  #創建一個寫文件的句柄
    #遍歷切片后的文本列表
    for paraIndex in range(len(paraList)):
        #print(paraList[paraIndex])
        fileWriter.write(paraList[paraIndex])   #先將列表中第一個元素寫入文件中
        if(paraIndex != len(paraList)):         #不加if這兩行的運行結果是所有的</doc>都沒有了,除了最后分割的文本
            fileWriter.write(end)
        if((paraIndex+1)%5000==0):              #5000個切片合成一個.txt文本
            fileWriter.close()
            fileWriter = open('./files/'+str((paraIndex+1)/5000)+'.txt','a',encoding='utf8'); #重新創建一個新的句柄,等待寫入下一個切片元素。注意這里文件名的處理技巧。
    fileWriter.close()          #關閉最后創建的那個寫文件句柄
    print('finished')

 3.xml文本解析 

#! /usr/bin/env Python3
# -*- encoding:utf-8 -*-  
import os
from xml.dom import minidom  
from urllib.parse import urlparse

def file_fill(file_dir):
    for root, dirs, files in os.walk(file_dir):      #掃描該目錄下的文件夾和文件,返回根目錄路徑,文件夾列表,文件列表
        print(root)
        print(dirs)
        print(files)
        for f in files:
            tmp_dir = '.\sougou_after2' + '\\' + f  # 加上標簽后的文本  
            text_init_dir = file_dir + '\\' + f     #原始文本  
            print(text_init_dir)
            print(tmp_dir)
            file_source = open(text_init_dir, 'r', encoding='utf-8') #打開文件,並將字符按照utf-8編碼,返回unicode字節流
            print(file_source)
            ok_file = open(tmp_dir, 'a+', encoding='utf-8')  
            start = '<docs>\n'  
            end = '</docs>'  
            line_content = file_source.readlines()  #按行讀取
            ok_file.write(start)  
            for lines in line_content:  
                text_temp = lines.replace('&', '.')    #替換:replace(old,new,[max]) max最多替換的次數
                text = text_temp.replace('', '')
                ok_file.write(text)  
            ok_file.write('\n' + end)  
  
            file_source.close()  
            ok_file.close()
    print('finished!')

def file_read(file_dir):
    #建立url和類別的映射詞典,可以參考搜狗實驗室的對照.txt,有18類,這里增加了奧運,減少了社會、國內和國際新聞
    dicurl = {'auto.sohu.com':'qiche','it.sohu.com':'hulianwang','health.sohu.com':'jiankang','sports.sohu.com':'tiyu',
    'travel.sohu.com':'lvyou','learning.sohu.com':'jiaoyu','career.sohu.com':'zhaopin','cul.sohu.com':'wenhua',
    'mil.news.sohu.com':'junshi','house.sohu.com':'fangchan','yule.sohu.com':'yule','women.sohu.com':'shishang',
    'media.sohu.com':'chuanmei','gongyi.sohu.com':'gongyi','2008.sohu.com':'aoyun', 'business.sohu.com': 'shangye'} 
    path = ".\sougou_all\\"     
    for root, dirs, files in os.walk(file_dir):  
        for f in files:
            print(f)
            doc = minidom.parse(file_dir + "\\" + f)  
            root = doc.documentElement  
            claimtext = root.getElementsByTagName("content")  
            claimurl = root.getElementsByTagName("url")  
            for index in range(0, len(claimurl)):  
                if (claimtext[index].firstChild == None):  
                    continue  
                url = urlparse(claimurl[index].firstChild.data)  
                if url.hostname in dicurl:  
                    if not os.path.exists(path + dicurl[url.hostname]):  
                        os.makedirs(path + dicurl[url.hostname])  
                    fp_in = open(path + dicurl[url.hostname] + "\%d.txt" % (len(os.listdir(path + dicurl[url.hostname])) + 1),"w")  
                    temp_bytescontent = (claimtext[index].firstChild.data).encode('GBK','ignore')   #這里的ignore是說,如果編碼過程中有GBK不認識的字符可以忽略
                    fp_in.write(temp_bytescontent.decode('GBK','ignore'))
    print('finished!')

def test():
    file_fill('.\sougou_before2')
    file_read(".\sougou_after2")

 #!/usr/bin/python3 的作用

這是腳本語言共同遵守的規則:當第一行為 #!/path/to/script/interpreter時,指定了用來執行本腳本的解釋器。注意:

1、必須是文件的第一行

2#!開頭的,說明是腳本

3/path/to/script/interpreter是腳本解釋器的全路徑名。

例如:

#!/bin/sh           shell腳本

#!/usr/bin/perl     perl腳本

#!/usr/bin/python   python腳本

#!/usr/bin/python2  python2腳本

#!/usr/bin/python3  python3腳本

而有時不太清楚腳本解釋器的具體全路徑名;或者開發環境與運行環境的安裝路徑不同。為了保證兼容性,也可以寫作:

#!/usr/bin/env python3

這樣運行時會自動搜索腳本解釋器的絕對路徑

4.關於字符串以及編碼的學習

在這一次的文本解析中,真是體會到了不同編碼帶來的巨大影響,各種編碼和解碼錯誤,所以在這里記錄一下學習大神們的筆記的一點點心得。

任何東西要存儲在計算機中都要編碼,視頻,音頻,文本,所以有時候,我們在打開一個視頻的時候會遇到解碼錯誤,不能播放,就是因為我們要將存儲在計算機中的東西解碼還原成我們開始存儲時它的形式,但是中間出現了解碼失敗的錯誤,自然就不能還原播放了。

 Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案。UTF-8UTF-16UTF-32都是將數字轉換到程序數據的編碼方案。這是什么意思呢?每一個字符都對應一個數字,這個數字再轉成電腦中要存儲的編碼格式。

UTF-8 8-bit Unicode Transformation Format)是最流行的一種對 Unicode 進行傳播和存儲的編碼方式。它用不同的 bytes 來表示每一個代碼點。ASCII 字符每個只需要用一個 byte,與 ASCII 的編碼是一樣的。所以說 ASCII UTF-8 的一個子集。

字符——>數字——>電腦中存儲的程序數據

Unicode            UTF-8/ UTF-16 /UTF-32

我們看到的上面這個過程就是編碼encode,與之相對應的就是解碼,decode

Encode:將“文本”轉換成“字節流”

Decode:將“字節流”轉換成“文本”

python內部使用的是unicode編碼,在python3中:

bytes ——> str (Unicode字符數組) ——> bytes

     Decode                   encode

# -*- coding: utf-8 -*-

這就是告知python我這個文件里的文本是用utf-8編碼的,這樣,python就會依照utf-8的編碼形式解讀其中的字符,然后轉換成unicode編碼內部處理使用。在這里,python作為一門語言,它能理解的就是Unicode,就像我們人看英文和中文一樣,或者通俗一點說,Python也看不懂字節流,只能看懂Unicode,我們人只能看懂解碼出來的視頻,看不懂字節流里面演的是什么情節。這都是一個道理。

有時候,在Windows控制台下運行python程序,還是會遇到編碼錯誤。這是由於python編碼與控制台編碼的不一致造成的。Windows下控制台中的編碼使用的是gbk,而在代碼中使用的utf-8python按照utf-8編碼打印到gbk編碼的控制台下自然就會不一致而不能打印出正確的漢字。所以這時候要用GBK編碼。

5.撿拾小知識

5.1 怎么判斷TXT文件內容的編碼類型?

打開記事本  文件>另存為—>看彈出的對話框最下面,有個編碼類型。

5.2 Python3.4及以上版本

Import一個模塊后,如果調試bug,改動了一些地方,怎么辦呢?重新加載:

import importlib

importlib.reload(module)

5.3 open()中的參數

路徑+文件名

Moder,w,a,+,b

encoding表示的是返回的數據采用何種編碼,一般采用utf8或者gbk

 

參考文章:

http://blog.csdn.net/sgfmby1994/article/details/53436228

http://blog.csdn.net/laoyaotask/article/details/46797717

http://www.cnblogs.com/fnng/p/5008884.html

http://www.crifan.com/unicodeencodeerror_gbk_codec_can_not_encode_character_in_position_illegal_multibyte_sequence/

http://blog.csdn.net/gexiaobaohelloworld/article/details/7963646

http://blog.csdn.net/shenjie12345678/article/details/43228159

http://blog.csdn.net/fym0121/article/details/7578016

還有一些忘記記錄網址了,謝謝你們,愛心~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM