作为BERT模型命名实体识别任务的输入,对于IBO标注数据进行检测判断标注正确性

探讨BERT模型训练中语料标注的重要性,介绍三种规则确保标签正确性、IBO标注原则及数据集混洗方法,提升标注效率与准确性。

从2018年google提出bert后,一直在使用bert模型作为训练基础

经常会需要标注语料数据

在数据量极大的情况下,数万标注后头晕眼花,如何快速差错也是一个问题

于是设置了3条规则作为检查的基本属性,后续欢迎补充

前置:

我们有一个充满label的标签

还有一个已经做好标注的语料

 

1.标签的正确性:

首先我们要保证每个字后面的标签不会因为我们的手误或者复制粘贴出错

# rule 1 判定正确性,保证语料标注中每行“一个字+空格+对应标签”,语料之中句子与句子之前单独使用一个回车\n来隔断
    # 无遗漏,无错误标签
    # label.txt 文件包含标签目录,同时最后一行无回车\n
    with open("label.txt", 'r', encoding='utf-8') as fd:
        content = fd.read()
    label = content.split("\n")
    print(label)

    with open("corpus_2.txt", 'r', encoding='utf-8') as f4:
        content = f4.read()
    word_vector = content.split("\n")
    # word_vector = [i for i in word_vector if(len(str(i)) != 0)]
    print(word_vector)

    num = 0
    for word in word_vector:
        num = num + 1
        if word != "":
            if word[0] == " ":
                print(num)
                print("wrong")
            chinese = word.split(" ")
            if chinese[1] not in label:
                print(num)
                print(chinese[1])
                print("有标错的标签")
                break
    # print("标签正确性检测通过")

2.rule2:IBO的标注原则,B-X,I-X,,,不会出现以I-x作为开头的标注词,同时,在一组标注词中后缀标签应该保持一致

 # rule 2 test IBO 标准原则
 # 我的数据语料标注了43k行
    num = 43042
    logo = []
    # 把标签组取出
    for word in word_vector:
        if word != "":
            chinese = word.split(" ")
            logo.append(chinese[1])
        else:
            logo.append(word)
    #
    for i in range(0, len(logo))[::-1]:
        num = num - 1
        temp = i
        lab = logo[temp]
        if len(lab) > 0 and logo[temp][0] == "I":
            label_word = logo[temp][2:]
            str_test = 'B-' + label_word
            str_test_2 = 'I-' + label_word
            # 设定报错阈值 100
            length = 1
            while logo[temp] != str_test:
                if logo[temp] != str_test_2:
                    print(num)
                    print("wrong")
                    return -1
                temp = temp - 1
                length = length + 1
    print("IBO规则通过")

3rule3:在进行检测结束后,我们在生成train.txt,dev,test等文件的时候应该将句子作为整体进行打混,(爬虫爬下来的时候会出现领域句子大部分聚在一起的情况)

# rule 3 按句子 将顺序打混 并切分文件
    with open("corpus_2.txt", 'r', encoding='utf-8') as fa:
        content = fa.read()
    # for w in range(0, len(content)):
    #     if content[w] == "\n":
    #         num = num + 1
    #     if content[w] == "\n" and content[w+1] == "\n" and content[w+2] == "\n":
    #         print(num)
    #     break
    # if "\n\n\n" in content:
    #     print("aaaaa")
    sentence_vector = content.split("\n\n")
    print(sentence_vector)
    random.shuffle(sentence_vector)
    print(sentence_vector)
    with open("corpus_1.txt", 'w', encoding='utf-8') as fw:
        for sentence in sentence_vector:
            fw.write(sentence)
            fw.write("\n\n")
    # 按比例拆分成文件后最终保证dev.txt,train.txt等以两个\n结束作为模型训练的输入
    # 43000 * 8/10
    print(len(sentence_vector))
    with open("train.txt", 'w', encoding='utf-8') as ftr:
        for ss in range(0, 1250):
            ftr.write(sentence)
            ftr.write("\n\n")
    with open("dev.txt", 'w', encoding='utf-8') as ftr:
        for ss in range(1250, 1850):
            ftr.write(sentence)
            ftr.write("\n\n")
    with open("test.txt", 'w', encoding='utf-8') as ftr:
        for ss in range(1850, len(sentence_vector)):
            ftr.write(sentence)
            ftr.write("\n\n")
   

这里我遇到了一个问题,那是打乱后生成的corpus_1.txt长度与corpus_2.txt

原文不一致,我先后检查了标签和实体字长度,没有发现问题,直到最后检测出来是因为我是以“\n\n”作为切分条件的,而当时我

corpus_2.txt的最后一句话是以\n作为结尾的,就会造成在生成新文件的时候新文件中有一句话自带一个\n,所以会使新语料文件多一行,所以在切分之前一定要考虑好最后一句话的回车

以下图为例

a = "a\n\nb\n\nO"
b = a.split("\n\n")
random.shuffle(b)
print(b)

a = "a\n\nb\n\nO\n"
b = a.split("\n\n")
random.shuffle(b)
print(b)

a = "a\n\nb\n\nO\n\n"
b = a.split("\n\n")
random.shuffle(b)
print(b)

result:
['a', 'b', 'O']
['a', 'O\n', 'b']
['O', 'a', '', 'b']

目前考虑到的加速检测就是这些,如果还有遗漏欢迎大家提醒分享

<think>根据用户的问题,用户希望在天地图三维服务中使用 `new Cesium.Map` 创建自定义图片标注点。但需要注意的是,在Cesium中,创建点(也称为实体)通常使用 `Cesium.Entity` 或者 `Cesium.Billboard`,而不是 `Cesium.Map`(Cesium中并没有名为`Map`的类用于创建标注点)。因此,我猜测用户可能是指创建一个自定义图片的标注点(即Billboard)并添加到场景中。 在Cesium中,添加自定义图片标注点的常用方法是: 1. 使用 `Cesium.Entity` 结合 `billboard` 属性。 2. 直接使用 `Cesium.BillboardCollection` 创建并添加。 通常,我们更倾向于使用实体(Entity)方式,因为它更易于管理。 下面将介绍如何使用 `Cesium.Entity` 来创建自定义图片标注点。 ### 步骤 1. **创建Viewer实例**:首先需要有一个Cesium Viewer实例。 2. **添加实体**:使用 `viewer.entities.add` 方法添加一个实体,并设置其 `billboard` 属性。 ### 示例代码 ```javascript // 假设已经创建了viewer const viewer = new Cesium.Viewer('cesiumContainer'); // 添加自定义图片标注点 const entity = viewer.entities.add({ name: '自定义标注点', position: Cesium.Cartesian3.fromDegrees(116.39, 39.9), // 经度、纬度(这里是北京的位置) billboard: { image: 'path/to/your/image.png', // 自定义图片的路径 width: 50, // 可选,图片宽度(像素) height: 50, // 可选,图片高度(像素) scale: 1.0, // 可选,缩放比例 color: Cesium.Color.WHITE, // 可选,颜色,可以调整图片颜色 rotation: 0, // 可选,旋转角度(弧度) verticalOrigin: Cesium.VerticalOrigin.BOTTOM // 可选,垂直对齐方式,通常设置为底部,这样位置点就在图片底部中心 } }); ``` ### 在天地图三维服务中的使用 用户提到使用天地图三维服务,那么在上面的代码中,`viewer` 的创建应该已经按照天地图的要求进行了设置(如叠加天地图影像服务等)。因此,只需要在创建完`viewer`后,再添加上述实体即可。 ### 注意事项 1. **图片路径**:确保图片路径正确,如果图片来自网络,需要确保跨域设置正确(或使用CORS支持的图片服务器)。如果使用本地图片,需要放在public目录或通过vite等工具处理。 2. **位置坐标**:`Cesium.Cartesian3.fromDegrees` 方法将经纬度转换为Cesium中的笛卡尔坐标。 3. **尺寸调整**:通过 `width` `height` 可以调整图片显示的大小,也可以使用 `scale` 统一缩放。 4. **垂直对齐**:`verticalOrigin` 设置为 `Cesium.VerticalOrigin.BOTTOM` 可以使得标注点的位置在图片的底部中心,这样更符合地图标注的习惯(即图片底部中心点对应位置)。 ### 完整示例(结合天地图) 参考用户提供的引用[2]中叠加影像服务的代码,我们可以整合起来: ```javascript // 创建Viewer const viewer = new Cesium.Viewer('cesiumContainer', { // 可以在这里配置一些Viewer选项 }); // 叠加天地图影像服务(如引用[2]中的代码) function setupImageryLayers() { // 这里使用引用[2]中的代码,注意替换tokensubdomains const tdtUrl = "https://t{s}.tianditu.gov.cn/"; const token = "你的天地图密钥"; const subdomains = ['0','1','2','3','4','5','6','7']; // 叠加影像服务 const imgMap = new Cesium.UrlTemplateImageryProvider({ url: tdtUrl + "DataServer?T=img_w&x={x}&y={y}&l={z}&tk=" + token, subdomains: subdomains, tilingScheme: new Cesium.WebMercatorTilingScheme(), maximumLevel: 18, }); viewer.imageryLayers.addImageryProvider(imgMap); // 叠加国界服务 const iboMap = new Cesium.UrlTemplateImageryProvider({ url: tdtUrl + "DataServer?T=ibo_w&x={x}&y={y}&l={z}&tk=" + token, subdomains: subdomains, tilingScheme: new Cesium.WebMercatorTilingScheme(), maximumLevel: 10, }); viewer.imageryLayers.addImageryProvider(iboMap); } setupImageryLayers(); // 添加自定义图片标注点 const entity = viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(116.39, 39.9), billboard: { image: 'path/to/your/icon.png', width: 50, height: 50, verticalOrigin: Cesium.VerticalOrigin.BOTTOM } }); // 也可以将标注点放在一个数组中,方便管理 ``` ### 相关问题 1. 如何调整自定义标注点的大小位置? 2. 如何实现多个自定义标注点的批量添加管理? 3. 如何实现标注点的点击事件? </think>### 在天地图三维服务中使用自定义图片标注点的方法 在Cesium中创建自定义图片标注点应使用`Cesium.Entity`结合`billboard`属性,而不是`new Cesium.Map`(Cesium中无此API)。以下是具体实现方法: #### 1. 基础实现代码 ```javascript // 创建自定义图片标注点 const customPin = viewer.entities.add({ name: '自定义标注点', position: Cesium.Cartesian3.fromDegrees(116.39, 39.9), // 经纬度坐标 billboard: { image: 'path/to/custom-icon.png', // 自定义图片路径 width: 64, // 宽度(像素) height: 64, // 高度(像素) scale: 1.0, // 缩放比例 color: Cesium.Color.WHITE, // 颜色滤镜 rotation: 0, // 旋转角度(弧度) verticalOrigin: Cesium.VerticalOrigin.BOTTOM // 锚点位置 } }); ``` #### 2. 结合天地图服务的完整示例 ```javascript // 初始化Viewer const viewer = new Cesium.Viewer('cesiumContainer'); // 添加天地图影像服务 [^2] const tdtUrl = "https://t{s}.tianditu.gov.cn/"; const token = "您的天地图密钥"; const subdomains = ['0','1','2','3','4','5','6','7']; const imgLayer = new Cesium.UrlTemplateImageryProvider({ url: `${tdtUrl}DataServer?T=img_w&x={x}&y={y}&l={z}&tk=${token}`, subdomains, tilingScheme: new Cesium.WebMercatorTilingScheme(), maximumLevel: 18 }); viewer.imageryLayers.addImageryProvider(imgLayer); // 添加自定义标注点 const beijingPin = viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(116.4, 39.9), billboard: { image: 'icons/custom-pin.png', // 支持PNG/SVG/JPG width: 48, height: 48, pixelOffset: new Cesium.Cartesian2(0, -24) // 调整位置 } }); // 添加上海标注点 const shanghaiPin = viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(121.47, 31.23), billboard: { image: 'icons/special-marker.svg', scale: 0.8, color: Cesium.Color.fromCssColorString('#FF5733') } }); ``` #### 3. 关键参数说明 1. **image路径**: - 支持绝对路径 `https://example.com/pin.png` - 相对路径 `assets/marker.png` - Base64编码 `data:image/png;base64,...` 2. **定位调整**: ```javascript pixelOffset: new Cesium.Cartesian2(0, -25) // X/Y像素偏移 verticalOrigin: Cesium.VerticalOrigin.BOTTOM // 锚点位置 ``` 3. **动态效果**(如闪烁[^3]): ```javascript color: new Cesium.CallbackProperty((time) => { const alpha = 0.5 + 0.5 * Math.sin(time.secondsOfDay); return Cesium.Color.RED.withAlpha(alpha); }, false) ``` #### 4. Vue+Vite项目注意事项 1. 静态图片需放在`public`目录或配置`vite`别名: ```javascript // vite.config.js export default defineConfig({ resolve: { alias: { '@icons': path.resolve(__dirname, 'src/assets/icons') } } }) ``` 2. 使用动态路径: ```javascript image: new URL('@icons/pin.png', import.meta.url).href ``` ### 相关问题 1. 如何在Cesium中批量添加管理自定义标注点? 2. 如何实现标注点的点击交互信息弹窗? 3. 自定义标注点如何适应不同地图缩放级别? 4. 在Vue项目中如何优化Cesium标注点的内存管理?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值