创建 HuggingFace 数据集来训练 BIO 标记器

2023-12-10

我有一个字典列表:

sentences = [ 
{'text': ['I live in Madrid'], 'labels':[O, O, O, B-LOC]},
{'text': ['Peter lives in Spain'], 'labels':[B-PER, O, O, B-LOC]},
{'text': ['He likes pasta'], 'labels':[O, O, B-FOOD]},
...
]

我想从这些数据创建一个 HuggingFace 数据集对象,以便稍后可以对其进行预处理并更轻松地馈送到变压器模型,但到目前为止我还没有找到可行的方法来做到这一点。


首先,您需要一些额外的库来使用指标和数据集功能。

pip install -U transformers datasets evaluate seqeval

将 dict 列表转换为 Dataset 对象

import pandas as pd
from datasets import Dataset

sentences = [ 
{'text': 'I live in Madrid', 'labels':['O', 'O', 'O', 'B-LOC']},
{'text': 'Peter lives in Spain', 'labels':['B-PER', 'O', 'O', 'B-LOC']},
{'text': 'He likes pasta', 'labels':['O', 'O', 'B-FOOD']},
]


ds = Dataset.from_pandas(pd.DataFrame(data=sentences))

将数据集转换为“Trainer-able”数据集对象

from datasets import Dataset
from datasets import ClassLabel

# Define a Classlabel object to use to map string labels to integers.
classmap = ClassLabel(num_classes=4, names=['B-LOC', 'B-PER', 'B-FOOD', 'O'])


train_sentences = [ 
{'text': 'I live in Madrid', 'labels':['O', 'O', 'O', 'B-LOC']},
{'text': 'Peter lives in Spain', 'labels':['B-PER', 'O', 'O', 'B-LOC']},
{'text': 'He likes pasta', 'labels':['O', 'O', 'B-FOOD']},
]

# Map text to tokenizer ids.
ds = ds.map(lambda x: tokenizer(x["text"], truncation=True))

# Map labels to label ids.
ds = ds.map(lambda y: {"labels": classmap.str2int(y["labels"])})

要使用您拥有的标记输入计算指标:

import evaluate

metric = evaluate.load("seqeval")


def compute_metrics(p):
    predictions, labels = p
    predictions = predictions.argmax(axis=2)
    # Remove ignored index (special tokens)
    true_predictions = [
        [label_list[p] for (p, l) in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels)
    ]
    true_labels = [
        [label_list[l] for (p, l) in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels)
    ]
    results = metric.compute(predictions=true_predictions, references=true_labels)
    return {
        "precision": results["overall_precision"],
        "recall": results["overall_recall"],
        "f1": results["overall_f1"],
        "accuracy": results["overall_accuracy"],
    }

与使用Trainer object

import pandas as pd
import evaluate

from datasets import Dataset
from datasets import ClassLabel

from transformers import AutoModelForTokenClassification, Trainer, AutoTokenizer, DataCollatorForTokenClassification

# Define a Classlabel object to use to map string labels to integers.
classmap = ClassLabel(num_classes=4, names=['B-LOC', 'B-PER', 'B-FOOD', 'O'])

train_sentences = [ 
{'text': 'I live in Madrid', 'labels':['O', 'O', 'O', 'B-LOC']},
{'text': 'Peter lives in Spain', 'labels':['B-PER', 'O', 'O', 'B-LOC']},
{'text': 'He likes pasta', 'labels':['O', 'O', 'B-FOOD']},
]

eval_sentences = [
    {"text": "I like pasta from Madrid , Spain", 'labels': ['O', 'O', 'B-FOOD', 'O', 'B-LOC', 'O', 'B-LOC']}
]

ds_train = Dataset.from_pandas(pd.DataFrame(data=train_sentences))
ds_eval = Dataset.from_pandas(pd.DataFrame(data=eval_sentences))

model = AutoModelForTokenClassification.from_pretrained("distilbert-base-multilingual-cased",
                                                        id2label={i:classmap.int2str(i) for i in range(classmap.num_classes)},
                                                        label2id={c:classmap.str2int(c) for c in classmap.names},
                                                        finetuning_task="ner")
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-multilingual-cased")
data_collator = DataCollatorForTokenClassification(tokenizer)


ds_train = ds_train.map(lambda x: tokenizer(x["text"], truncation=True))
ds_eval = ds_eval.map(lambda x: tokenizer(x["text"], truncation=True))

ds_train = ds_train.map(lambda y: {"labels": classmap.str2int(y["labels"])})
ds_eval = ds_eval.map(lambda y: {"labels": classmap.str2int(y["labels"])})


metric = evaluate.load("seqeval")


def compute_metrics(p):
    predictions, labels = p
    predictions = predictions.argmax(axis=2)
    # Remove ignored index (special tokens)
    true_predictions = [
        [label_list[p] for (p, l) in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels)
    ]
    true_labels = [
        [label_list[l] for (p, l) in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels)
    ]
    results = metric.compute(predictions=true_predictions, references=true_labels)
    return {
        "precision": results["overall_precision"],
        "recall": results["overall_recall"],
        "f1": results["overall_f1"],
        "accuracy": results["overall_accuracy"],
    }

# Initialize our Trainer
trainer = Trainer(
    model=model,
    train_dataset=ds_train,
    eval_dataset=ds_eval,
    data_collator=data_collator,
    tokenizer=tokenizer,
    compute_metrics=compute_metrics,
)


trainer.train()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建 HuggingFace 数据集来训练 BIO 标记器 的相关文章

随机推荐

  • JavaScript 关键字“with”真的被弃用了吗?

    使用JavaScriptwith长期以来 语句一直被认为是不好的编码实践 并被建议不要这样做 这一页表明with已被弃用 并且在严格模式下会抛出错误 我的浏览器在使用时会抛出错误with在严格模式下 Google Closure Compi
  • 动态创建的脚本不会阻止渲染?

    在本文中 https www html5rocks com en tutorials speed script loading 他们在说 动态创建并添加到文档中的脚本默认是异步的 它们不会阻止渲染 但 执行javascript 总是阻塞渲染
  • 如何对 URL 的西里尔字符进行编码然后解码?

    我在一页上有一个表格
  • 根据 Java 中的 Swagger 定义验证 JSON 消息

    我使用 Swagger 定义创建了一个 REST API 现在我需要使用该 swagger 架构验证传入消息 我找到了几种解决方案 但它们都依赖于某些特定的用例 最接近我需要的是this正如它的描述所示 它与提供的 json 模式配合得很好
  • 无法上传 apk:READ_EXTERNAL_STORAGE 具有不同的 maxSdkVersions

    这是我第一次在这里提问 不管怎样 正如标题所说 我正在尝试将我的应用程序推向市场 当我尝试上传签名的 apk 时 出现错误 上传失败具有不同 maxSdkVersions 的重复权限声明 android permission READ EX
  • Facebook App Invites iOS v4 SDK 错误

    我已经仔细检查了所有内容 根据我的理解 这就是我需要做的 self inviteContent FBSDKAppInviteContent alloc initWithAppLinkURL NSURL URLWithString http
  • Asterisk-如何使用 ChanSpy() 或任何替代方法“耳语”音乐? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我打算向其中一位会议参与者 耳语 音乐 消息文件 而不让其他会议参与者听到此消息 我浏览了 Asterisk Cookbook 中的音频操作章节 http ofps oreill
  • 如何在 Objective-C iphone sdk 中迭代嵌套字典

    您好 我有一个 json 字符串 已通过 JSON 框架转换为字典 我需要提取其内容 我怎样才能迭代到嵌套字典 我已经有了这段代码 可以让我查看字典 NSDictionary results responseString JSONValue
  • 如何使用 nav.popTo() (ionic 2)?

    我正在使用导航控制器 要返回 我可以使用 nav pop 但是如果我需要转到其他页面 不是最后一个页面 如何使用 nav popTo constructor nav NavController this nav nav this nav p
  • Numpy int 位长度

    我想找到以二进制表示无符号 numpy 整数 或整数数组中的每个元素 所需的位数 就像 python 的int bit length 确实如此 但 numpy 似乎没有等效的功能 例如 gt gt gt int 0b1000 bit len
  • 如何防止 Dockerfile 缓存 git clone

    我有一个 Dockerfile 试图将 Web 应用程序打包并部署到容器中 应用程序的代码在 Docker 镜像构建期间从 git 存储库获取 这是 Dockerfile 快照 RUN git clone depth 1 git repos
  • 在 openpyxl 中格式化图表数据标签

    我正在使用 Python 3 6 3 使用 openpyxl 2 4 9 编写一些 Excel 工作表 在图表数据上获取数据标签并不明显 但当我尝试格式化所述数据标签时 事情开始变得糟糕 我想要做的是改变他们的位置并改变他们的轮换 有人有什
  • PDO Mysql 语法错误 1064 [已关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我运行以下代码 conn new PDO pdo at
  • PyQt 中的 QKeyPress 事件

    我的软件有问题 在我的钢琴软件中 如果我一直按下键盘上的某个键 那么它就会发出该特定键的多个重复的相同音调 但实际上我需要一个单一的音调 直到释放该特定的键 我提供了检测 keyPress 事件并调用相应方法的代码的一部分 那么我应该对我的
  • 用于 HTTPS 抓取的 Jsoup Cookie

    我正在尝试使用此网站在欢迎页面上收集我的用户名来学习 Jsoup 和 Android 使用以下代码 Connection Response res Jsoup connect http www mikeportnoy com forum l
  • 如何将 Spinner 默认值设置为 null?

    我正在尝试加载一个没有选定值的微调器 一旦用户选择了一个值 它就会将他们带到另一个页面 事实证明这是一个问题 因为目前页面只是在用户做出选择之前立即加载 我的 spinner 类的设置方式与 Google 的相同 http develope
  • 使用 document.body.innerHTML.replace 有多安全?

    正在运行类似的东西 document body innerHTML document body innerHTML replace 旧值 新值 危险的 我担心某些浏览器可能会搞乱整个页面 而且由于这是 JS 代码 这些代码将被放置在我无法控
  • 如何获取当前 .exe 的哈希值?

    SOLVED 我复制了该文件并在该副本上运行了哈希器 我需要我的应用程序来查找 EXE 当前的 MD5 我可以获取任何文件的MD5 但是 无论我做什么 我都无法获得 FileStream 来读取打开的 EXE 我尝试使用 FileOptio
  • 修改 google.translate.TranslateElement 结果中的元素

    我正在尝试将非常方便的 Google Translate 翻译元素嵌入到网页中 这非常简单并且效果很好 但我需要更改在生成的 HTML 中显示的默认文本 在使用过许多 Google API 和 js 库后 我认为这不会有问题 因为它几乎肯定
  • 创建 HuggingFace 数据集来训练 BIO 标记器

    我有一个字典列表 sentences text I live in Madrid labels O O O B LOC text Peter lives in Spain labels B PER O O B LOC text He lik