到对面了 2024-04-29 09:52 采纳率: 0%
浏览 78

蓝桥杯人工智能赛道模拟赛—文本数据处理

假设你们研发小组正在进行新媒体平台某场景的文本分析,为了提升模型的泛化能力,在做了技术调研后,你们决定通过同义词替换的方法来增加训练数据的多样性,这样可以创造出各种已有训练样本的变体,这不仅扩大了训练集,还增强了模型对新颖表达方式的理解能力,从而提升模型在实际应用中的泛化能力。具体地,同义词替换通过使用同义词典替换训练数据中对应的词汇,以生成语义相似但表达不同的训练样本。在本任务中,你们需要借助提供的同义词典,实现同义词替换功能。
准备开始答题前,请确认 /home/project 目录下包含以下文件:
task.py
data.csv
loc.txt
per.txt
其中:
task.py,是你后续答题过程中编写代码的地方。
data.csv,是本任务提供的训练数据,包含 160 条样本,其中text 列表示文本内容,text_id 列表示文本对应的 id。
loc.txt 和 per.txt,是本任务提供的地名和家庭称谓词典,共包含了 273 个地名和 66 个家庭称谓。
目标请在 task.py 文件中根据以下要求编写代码。
augment 函数
功能
对输入的文本进行同义词替换。
从地名/称谓词典中,找出所有出现在输入文本中的地名/称谓。
对于每个找到的地名/称谓,从词典中随机选择一个新的地名/称谓作为替代,并将文本中的原地名/称谓替换为这个新地名/称谓。
将替换信息记录在 aug_info['locs'] 和 aug_info['pers'] 列表中,包括原始地名/称谓和替换后的地名/称谓。
参数
text(字符串),原始文本。
返回值
text(字符串),经过同义词替换后的文本。
aug_info(字典),替换信息。
aug_info['locs'] 和 aug_info['pers'] 均为一个列表,列表中每个实体的替换信息以字典形式保存,具体说明见下表。
Key 名称释义Value 类型original原始实体字符串replacement替换后的实体字符串
基于以下代码补充 #TODO 处的函数代码,并运行代码块,确保能够实现以下目标:
正确地返回经过同义词替换后的文本和替换信息。
在输入文本中只对出现在替换词典中的字段进行替换,其他文本保持不变。
提示 1:点击代码块右上方的 copy 按钮,将代码完整复制到右侧环境中后开始编码。
#task-start
importrandomimportpandasaspdfromtorch.utils.dataimportDatasetclassMakeDataset(Dataset):def__init__(self):self.data = pd.read_csv('data.csv')[['text_id','text']].values self.locs =open('loc.txt','r').read().split('\n') self.pers =open('per.txt','r').read().split('\n')def__getitem__(self, item):text_id, text = self.data[item] text, aug_info = self.augment(text)returntext_id, text, aug_infodef__len__(self):returnlen(self.data)defaugment(self, text):aug_info = {'locs': [],'pers': []}# TODOreturntext, aug_infodefmain():dataset = MakeDataset()fordataindataset:print(data)if__name__ =='main': main()#task-end
提示 2:当实现以上目标后,考生可以通过执行 main 函数自行测试对应功能。

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-29 09:52
    关注

    引自免费微信小程序:皆我百晓生

    首先,我们需要导入所需的库并定义MakeDataset类。然后,我们将在augment函数中实现同义词替换逻辑。接下来,我会提供完整的task.py代码,你可以直接复制粘贴到右侧环境中执行。

    import random
    import pandas as pd
    from torch.utils.data import Dataset
    
    class MakeDataset(Dataset):
        def __init__(self):
            self.data = pd.read_csv('data.csv')[['text_id', 'text']].values
            with open('loc.txt', 'r') as f:
                self.locs = f.read().splitlines()
            with open('per.txt', 'r') as f:
                self.pers = f.read().splitlines()
    
        def __getitem__(self, item):
            text_id, text = self.data[item]
            text, aug_info = self.augment(text)
            return text_id, text, aug_info
    
        def __len__(self):
            return len(self.data)
    
        def augment(self, text):
            aug_info = {'locs': [], 'pers': []}
    
            # 地名替换
            for loc in self.locs:
                if loc in text:
                    replacement = random.choice(self.locs)
                    while replacement == loc or replacement in aug_info['locs']:
                        replacement = random.choice(self.locs)
                    text = text.replace(loc, replacement)
                    aug_info['locs'].append({'original': loc, 'replacement': replacement})
    
            # 称谓替换
            for per in self.pers:
                if per in text:
                    replacement = random.choice(self.pers)
                    while replacement == per or replacement in aug_info['pers']:
                        replacement = random.choice(self.pers)
                    text = text.replace(per, replacement)
                    aug_info['pers'].append({'original': per, 'replacement': replacement})
    
            return text, aug_info
    
    def main():
        dataset = MakeDataset()
        for data in dataset:
            print(data)
    
    if __name__ == '__main__':
        main()
    

    这段代码实现了MakeDataset类,其中包含__init__, __getitem__, __len__augment方法。augment函数负责替换地名和称谓,同时收集替换信息。在主函数main中,我们将遍历数据集并打印结果。

    注意,这段代码假设loc.txtper.txt文件中没有重复的地名和称谓。如果有重复项,你需要稍微修改代码以避免无限循环。在实际应用中,建议先清理词典,确保没有重复的条目。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月29日