解析搜狗實驗室精簡版數據

一、要預處理xml文件,解決docs,url,content標籤問題。主要代碼是deal_label.py 存入數據文件夾是sougou_label_after

SogouCS.reduced:存放原始的txt;
sougou_label_after:解決docs,url,content標籤問題
import os
# 預處理xml文件,解決docs,url,content標籤問題
def file_fill(file_dir,half_dir):
    # 查看half_dir文件夾下的文件夾和文件目錄
    for root, dirs,files in os.walk(file_dir):
        # 判斷是否存在half_dir,若是沒有則建立
        if not os.path.exists(half_dir):
            os.makedirs(half_dir)
        for f in files:
            tmp_dir = half_dir+'\\'+f
            text_init_dir = file_dir+'\\'+f
            # 遍歷文件夾下的每一篇xml文件
            with open(text_init_dir, 'r', encoding='gb18030') as source_file:
                start,end = '<docs>\n', '</docs>'
                line_content = source_file.readlines()
                # 在目標文件夾中建立新文件保存預處理後的文件
                with open(tmp_dir, 'w+', encoding='utf-8') as handle_file:
                    # 添加'<docs>'頭標籤
                    handle_file.write(start)
                    for line in line_content:
                        # 處理url中的‘&’符號
                        text = line.replace('&', '&amp;')
                        # 添加'</docs>'頭標籤
                        handle_file.write(text)
                    handle_file.write(end)
if __name__ == '__main__':
    file_dir = r'E:\sssss\SogouCS.reduced'     #原始文件夾
    half_dir = r'E:\sssss\sougou_label_after'  # 修改格式和符號生成的文件夾   無需本身手動建文件夾
    file_fill(file_dir, half_dir)     #將選好的文件進行加上<docs>和</docs>,並修改&這個符號

二、部分樣本函數獲取,同時隨機取去訓練數據和測試數據。主要代碼是data_train_test.py 存入數據文件夾分別爲train_choice , test_choice

import os, random

# 部分樣本獲取函數
def choice_files(half_dir,choice_dir_train,choice_dir_test,n,m):
    if not os.path.exists(choice_dir_train):
        os.makedirs(choice_dir_train)
    if not os.path.exists(choice_dir_test):
        os.makedirs(choice_dir_test)

    for _,_,files in os.walk(half_dir):
        file_list_train = random.sample(files, n)   #訓練數據去隨機的n個文件
        for file_choice in file_list_train:
            files.remove(file_choice)
        file_list_test = random.sample(files, m)    #測試數據取隨機的m個文件
        for file in file_list_train:
            with open(half_dir+'\\'+file, 'r', encoding='utf-8') as f1_train:
                doc_train = f1_train.read()
                path = choice_dir_train+'\\'+file
                with open(path, 'w+', encoding='utf-8') as f2_train:
                    f2_train.write(doc_train)
        for file in file_list_test:
            with open(half_dir+'\\'+file, 'r', encoding='utf-8')as f1_test:
                doc_test = f1_test.read()
                path = choice_dir_test +'\\'+file
                with open(path, 'w+', encoding='utf-8') as f2_test:
                    f2_test.write(doc_test)
        # print(file_list_train)
        # print(file_list_test)
    return file_list_train, file_list_test

if __name__ == '__main__':
    # 隨機抽取10個文件進行深加工
    half_dir = r'E:\sssss\sougou_label_after'
    choice_dir_train = r'E:\sssss\train_choice'
    choice_dir_test = r'E:\sssss\test_choice'
    file_list_train, file_list_test = choice_files(half_dir, choice_dir_train, choice_dir_test, 10, 5)

三、提取文檔文本內容,而且根據url將文本分好類.主要代碼是data_content.py 存入數據文件夾是data

import os
from xml.dom import minidom
from urllib.parse import urlparse

# 檢查url對應的文章是否在分類字典中
def check_class(url_lb,labels):
    if url_lb in labels:
        return True
    return False

def file_read(half_dir, labels, path):
    for _, _, files in os.walk(half_dir):
        for f in files:
            filename = half_dir + '\\' + f
            doc = minidom.parse(filename)      #加載讀取xml文件
            root = doc.documentElement         #獲取xml節點屬性值
            claimtext = root.getElementsByTagName('content')   #獲取xml節點對象集合
            claimurl = root.getElementsByTagName('url')
            for ind in range(len(claimurl)):
                if claimtext[ind].firstChild == None:
                    continue
                url = urlparse(claimurl[ind].firstChild.data)
                url_lb = url.hostname.strip().split('.')[0]
                # 創建url和類別的映射字典
                if check_class(url_lb, labels):
                    if not os.path.exists(path):
                        os.makedirs(path)
                    if not os.path.exists(path + './' + labels[url_lb]):
                        os.makedirs(path + './' + labels[url_lb])
                    file_name = path + './' + labels[url_lb] + './' + "{}.txt".format(labels[url_lb])
                    with open(file_name, "a+", encoding='utf-8') as file_in:
                        file_in.write(claimtext[ind].firstChild.data + '\n')

if __name__ == '__main__':
    labels = {'auto': '汽車', 'it': '互聯網', 'health': '健康',
              'sports': '體育','travel': '旅遊', 'learning': '教育', 'career': '職業',
              'cul': '文化','mil': '軍事', 'house': '房產', 'yule': '娛樂',
              'women': '女人','media': '媒體', '2008': '奧運',
              'business': '商業'
              }
    half_dir = r'E:\sssss\train_choice'
    path = r'E:\sssss\data\data_train'  # 新建立的文件夾,主要是放分好類的文件
    file_read(half_dir, labels, path)  # 將選好的文件進行純文本提取和分類存儲

    half_dir = r'E:\sssss\test_choice'
    path = r'E:\sssss\data\data_test'    #新建立的文件夾,主要是放分好類的文件
    file_read(half_dir, labels, path)     # 將選好的文件進行純文本提取和分類存儲
相關文章
相關標籤/搜索