穆穆13 2024-04-12 19:39 采纳率: 100%
浏览 26
已结题

基于bert-base-chinese的中文文本处理

基于bert-base-chinese的中文文本处理
python程序,要求:可以批量处理txt里面的内容,用bert库来处理文件内容,按{姓名,年龄,性别,生源地,病史,病史症状,初诊,处方,二诊,处方,三诊,结果,按语}等类别来整理,然后excel表格的形式导出。
如果有其他的中文分类方法的也可以。

import pandas as pd
from transformers import BertTokenizer, BertForTokenClassification
from torch.utils.data import DataLoader

# 读取txt文档
with open('medical_records.txt', 'r', encoding='utf-8') as f:
    text = f.read()

# 加载预训练的BERT模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertForTokenClassification.from_pretrained('bert-base-chinese')

# 对文本进行分词
inputs = tokenizer(text, return_tensors="pt")

# 使用BERT模型进行预测
outputs = model(**inputs)

# 提取预测结果中的信息
predictions = outputs.logits.argmax(dim=-1)

# 将预测结果转换为标签
labels = [tokenizer.convert_ids_to_tokens(idx) for idx in predictions[0].tolist()]

# 将标签转换为信息
info = {'姓名': [], '年龄': [], '性别': [], '病名': [], '第一次诊断': [], '第二次诊断': [], '处方': []}
for label in labels:
    if label == 'B-NAME':
        info['姓名'].append(label)
    elif label == 'B-AGE':
        info['年龄'].append(label)
    elif label == 'B-GENDER':
        info['性别'].append(label)
    elif label == 'B-DISEASE':
        info['病名'].append(label)
    elif label == 'B-DIAGNOSIS1':
        info['第一次诊断'].append(label)
    elif label == 'B-DIAGNOSIS2':
        info['第二次诊断'].append(label)
    elif label == 'B-PRESCRIPTION':
        info['处方'].append(label)

# 将信息写入Excel文件
df = pd.DataFrame(info)
df.to_excel('medical_info.xlsx', index=False)

大概代码就这些,运行时出现bert-base-chinese模型加载不了,想本地运行可是下载模型后还是不知道怎么调用,希望给位可以解决问题,谢谢

  • 写回答

10条回答 默认 最新

  • m0_71308920 2024-04-14 13:05
    关注

    要实现这个任务,你需要安装transformers库(包含BERT模型)和pandas库来处理Excel。首先安装这些库:

    pip install transformers pandas
    

    然后,你可以使用以下Python代码来实现你的需求。这里我使用transformers库的AutoTokenizer来分词和编码文本,然后使用pandas库来组织数据并导出到Excel。请注意,BERT模型通常用于文本分类,但在这个例子中,我们不会直接使用BERT进行分类,而是简单地将文本内容整理到Excel中。

    import os
    import pandas as pd
    from transformers import AutoTokenizer
    
    # 定义类别和对应的BERT分词器
    categories = {
        "姓名": None,
        "年龄": None,
        "性别": None,
        "生源地": None,
        "病史": None,
        "病史症状": None,
        "初诊": None,
        "处方": None,
        "二诊": None,
        "处方": None,
        "三诊": None,
        "结果": None,
        "按语": None
    }
    
    # 读取文本文件
    def read_text_file(file_path):
        with open(file_path, 'r', encoding='utf-8') as f:
            content = f.read()
        return content
    
    # 分割文本
    def process_text(content):
        lines = content.split('\n')
        data = {}
        for i, line in enumerate(lines):
            if ':' in line:
                category, value = line.split(':', maxsplit=1)
                categories[category] = value.strip()
        return data
    
    # 使用BERT分词器处理文本
    def bert_tokenize(text, tokenizer):
        encoded_text = tokenizer.encode_plus(
            text,
            add_special_tokens=True,
            return_token_type_ids=False,
            padding='max_length',
            truncation=True,
            max_length=512,
            return_attention_mask=True,
            return_tensors='pt'
        )
        return encoded_text['input_ids'][0].tolist()
    
    # 读取txt文件,处理内容并保存到DataFrame
    def process_files(directory, file_extension, tokenizer):
        data = []
        for filename in os.listdir(directory):
            if filename.endswith(file_extension):
                file_path = os.path.join(directory, filename)
                content = read_text_file(file_path)
                processed_data = process_text(content)
                for category, value in processed_data.items():
                    data.append({category: bert_tokenize(value, tokenizer)})
        return pd.DataFrame(data)
    
    # 使用BERT分词器
    tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
    
    # 定义输入和输出文件夹
    input_folder = "path_to_your_input_folder"
    output_file = "output.xlsx"
    
    # 处理所有txt文件
    all_data = process_files(input_folder, ".txt", tokenizer)
    
    # 合并所有处理后的数据
    all_data = pd.concat(all_data, ignore_index=True)
    
    # 将DataFrame写入Excel
    all_data.to_excel(output_file, index=False)
    

    请将input_folder变量替换为你的输入文件夹路径。这个脚本会遍历指定目录下的所有.txt文件,逐行处理并用BERT分词器编码,然后将结果保存到Excel文件中。

    注意:由于BERT模型主要用于处理序列数据,这里我们仅使用了每个句子作为独立的输入进行编码。如果你希望根据上下文关系来处理连续的文本,可能需要修改代码以适应你的具体需求。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月14日
  • 已采纳回答 4月14日
  • 修改了问题 4月13日
  • 创建了问题 4月12日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见