上节课给大家详细介绍了模型结构,这节课,我们就开始做数据预处理了。数据预处理阶段,我们需要完成两个任务,一个是将样本文件处理成一句一行的形式,方便读取,另一个是,剔除异常数据。

原样本格式

英 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.ichenhua.cn/read/448