上节课给大家详细介绍了模型结构,这节课,我们就开始做数据预处理了。数据预处理阶段,我们需要完成两个任务,一个是将样本文件处理成一句一行的形式,方便读取,另一个是,剔除异常数据。
原样本格式
英 O -1 寸 O -1 液 B-ASP 2 晶 I-ASP 2 屏 I-ASP 2 显 O -1 示 O -1 效 O -1 果 O -1 出 O -1 色 O -1
合并成单行
英 寸 液 晶 屏 显 示 效 果 出 色,O O B-ASP I-ASP I-ASP O O O O O O,-1 -1 1 1 1 -1 -1 -1 -1 -1 -1
异常数据
其 他 功 能 也 很 实 用,O B-ASP I-ASP I-ASP I-ASP O O O,-1 -1 1 1 -1 -1 -1 -1
代码示例
1、添加配置项
# config.py TRAIN_FILE_PATH = './output/process/atepc.train.csv' TEST_FILE_PATH = './output/process/atepc.test.csv'
2、合并样本数据
按空行切分后,合并句子,每行一句,再把不同多个样本文件合并成一个,方便读取。
# process.py
from config import *
import pandas as pd
def format_sample(file_paths, output_path):
text = bio = pola = ''
items = []
for file_path in file_paths:
with open(file_path) as f:
for line in f.readlines():
# 单独的空行,表示句子间隔
if line == '\n':
items.append({'text': text.strip(), 'bio': bio.strip(), 'pola': pola.strip()})
text = bio = pola = ''
continue
# 文本、bio标记、情感极性
t, b, p = line.split(' ')
text += t + ' '
bio += b + ' '
# 情感极性修正,2表示好评,改为1
p = str(1) if p.strip() == str(2) else p.strip()
pola += p + ' '
df = pd.DataFrame(items)
df.to_csv(output_path, index=None)
if __name__ == '__main__':
format_sample([
'./input/origin/camera/camera.atepc.train.dat',
'./input/origin/car/car.atepc.train.dat',
'./input/origin/notebook/notebook.atepc.train.dat',
'./input/origin/phone/phone.atepc.train.dat',
], TRAIN_FILE_PATH)
format_sample([
'./input/origin/camera/camera.atepc.test.dat',
'./input/origin/car/car.atepc.test.dat',
'./input/origin/notebook/notebook.atepc.test.dat',
'./input/origin/phone/phone.atepc.test.dat',
], TEST_FILE_PATH)
3、异常值剔除
正常来说,标记为实体的文字,对应情感数值,要么好评要么差评,不应该为-1。
def check_label():
df = pd.read_csv(TRAIN_FILE_PATH)
dct = {}
for index, row in df.iterrows():
for b, p in zip(row['bio'].split(), row['pola'].split()):
# 删除异常值
if b == 'B-ASP' and p == '-1':
print(index, row)
# df.drop(index=index, inplace=True)
cnt = dct.get((b,p), 0)
dct[(b,p)] = cnt+1
print(dct)
# df.to_csv(TRAIN_FILE_PATH, index=None)
本文为 陈华 原创,欢迎转载,但请注明出处:http://www.chenhuax.com/read/448