一、要預處理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('&', '&')
# 添加'</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) # 將選好的文件進行純文本提取和分類存儲