范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

实体关系标注工具最佳实践

  "  如果你有机会采访一下 AI 算法工程师,什么是机器学习中最重要的事儿?
  他们大概率会咆哮着告诉你:数据!数据!数据!
  如何获得高质量的标注数据?如何提高标注同学的工作效率?是每个 AI 团队最重要的思考之一。
  本文向大家详细阐述了来也科技 AI 研发中心在实现 "实体关系标注工具" 上的最佳实践。
  "
  首先,为了您能顺利理解本文内容,对常见的技术名词说明如下:
  NLP :Natural Language Processing 自然语言处理
  实体关系 :见下图
  数据标注 :数据标注即通过分类、画框、标注、注释等,对图片、语音、文本等数据进行处理,标记对象的特征,以作为机器学习的基础素材。
  标注数据的流转 :见下图
  背景
  对话机器人是来也科技的当家产品之一。对话机器人的核心能力之一就是自然语言处理(NLP),而标明实体关系的数据则是提升 NLP 能力的重要输入。
  来也科技在标注实例关系数据上,历经了 3 个阶段:  借助 Excel 标注数据  使用市面上现有的标注工具  自主研发标注工具
  Excel 标注
  Excel 标注的缺点是显而易见的:
  操作、协同不便  所有关系维护在一个表格中,需要手动查找及复制  不方便多人操作统一数据集,且容易误操作  共享表格,权限无法细化  标注状态、审核状态等不方便维护
  市面上的标注工具(我们以百度大脑举例)
  这个工具相较 Excel 有很明显的优点:  通过刷选文本取代过去复制粘贴文本的标注方式  通过共享实体和实体类型取代过去靠成员间约定的维护方式  通过高亮文本并添加指示线取代在原文档中大海捞针的审核方式  各实体持有关系数展示  点击标注结果时会用虚线指向2个实体
  但也有不满足我们需求的地方:  同一段文本不能被标为多种实体:实际业务场景中同段文本可能需要被拆分成多个实体,彼此之间创建实体关系。如图:
  跨行标注时会扰乱原本的文本结构,影响标注体验。如图:
  查看实体关系的实体高亮不明显,实体间的虚线可能会被文本遮盖,实际作用不大  标注时不能创建实体类型和关系类型,需要到另一个页面编辑,但我们希望可以不要切换
  自主研发
  在此背景下,我们决定研发自己的实体关系标注工具。除了基本的标注需求外,我们还抽象出以下几点重点需求:
  标注页面可以实时维护类型信息  同段文本可标注为多个实体  分行排版  获取字符位置  跨行实体不会被拆成单独的一行
  来也科技实体关系标注工具实践
  通过对需求的反复分析,我们确定了实体关系标注工具的目标使用方式:
  标注页面可以实时维护类型信息
  这是比较简单的需求,我们只需要在标注页面添加类型维护,并且使其在更新后可以立刻投入使用即可。
  同段文本可标注为多个实体
  我们的需求是,同一段文字可被多次标注。如下图:
  这个需求比较具有挑战性,且当前业内并没有一套可参照的方案满足我们的业务场景。
  通过调研分析,我们发现:一段文本之所以无法被标注为多个实体,是因为现有的标注方式是在已有的文本元素上添加样式,不论是背景色、下划线,其本质都是在利用原本的文本元素。
  因为 DOM 元素的固有限制,一段文本最多只能对应一种背景色,以及一种下划线。
  要想让一段文本可以被标注为多个实体,那么文本和标注肯定不是 一个  DOM 元素。所以,我们采取"引入额外线段"的方式来表示标注,并通过"绝对定位"定位到文本下方。这样,一段文本就可以对应多个标注了。
  我们需要准确的获取标注文本的位置信息。可并没有现成的组件,能够返回指定字符在给定文本中的具体位置。
  所以,我们就自己实现了一个文字排版容器:  把文本逐字填入容器,当超过容器宽度时,就将文本放入下一行。  选中的文本宽度可以通过 DOM 属性 offsetWidth 直接获取。
  ,时长 00:08
  伪代码如下:  function breakIntoLines(str, width) {     // 获取测试宽度的span,该span继承标注工具的文字样式     const span = getTestSpanInstance();       // 分行信息     const lines = [];       // 当前行的文本     let tokens = "";     // 当前行行首在str中的index     let stIndex = 0;       // 遍历字符串     while (str.length) {         // 判断当前文本再加一个字符会不会超宽         span.innerText = tokens + str[0];           // 如果超宽,就将之前的文本放入分行信息中,超出部分单起一行         if(span.offsetWidth >= width) {             lines.push({                 stIndex,                 tokens,             });             stIndex += tokens.length;             tokens = str[0];         }         // 如果未超宽,则将该字符添加到当前行         else {             tokens += str[0];         }           // 吐出被插入的字符         str = str.slice(1);     }       // 插入最后一行     if(tokens) {         lines.push({             stIndex,             tokens,         })     }       return lines; }
  获取字符位置
  如何对标注的数据进行展示呢?  横向偏移量计算:每行分完,通过计算文字的宽度即可获取标注的横向偏移量  纵向偏移量计算:判断是否与已处理完成的标注重叠,计算纵向偏移量
  function injectMarksIntoLines (lines, marks) {     for(let line of lines) {         // 获取每行内的标注         for(let mark of marks) {             if(isMarkInLine(mark, line) {                 line.marks = line.marks ? line.marks.concat(mark) : [mark]             }         }           // 根据重叠数量,确定每个标注的垂直偏移量         line.marks = line.marks.map((mark, i, arr) => {             let y = 0;             for(let j = 0; j < i; j++) {                 if(isOverlap(mark, arr[j])) {                     y++;                 }             }             return {                 ...mark,                 y,             }         })     } }
  跨行实体不会被拆成单独的一行
  市面上的工具在标注跨行文本时,会因为标注不能拆分为多行,而将标注的文字机械化的放在同一行,这就造成了两个问题:
  不必要的分行  文本一行展示不下时,超宽内容不可见
  这样的处理方式,会使得文本难以阅读。如下图所示:
  来也科技自主研发的标注工具,已经摆脱通过文本样式实现标注这种枷锁,我们可以将一个标注拆成多个 DOM 元素。
  只要标注的全部或部分内容在当前行,就可以在本行标注文本下展示标注组件,彻底解决跨行文本被拆分的这个问题。
  function injectMarksIntoLines(str, width) {     // ...             if(isMarkInLine(mark, line) {                 mark.stIndex = Math.max(line.stIndex, mark.stIndex);                 mark.endIndex = Math.min(line.endIndex, mark.endIndex);                   line.marks = line.marks ? line.marks.concat(mark) : [mark]             }     // ... }
  优化
  渲染时间过长
  当标注文本较多时,首屏渲染时会出现较长的白屏时间。且文本字数、标注数量越多,白屏时间越长。
  我们以一段500字左右的文本为例,获取其性能数据:
  结合performance和代码进行分析,我们发现耗能主要在以下两方面:
  分行算法会频繁获取   offsetWidth   :每调用一次,都会导致页面重排,严重耗时;  计算标注纵向偏移量时,会先遍历全部标注,过滤出在当前行的标注,然后进行遍历,得到重叠高度信息,遍历次数过高;
  我们来逐一优化。
  分行算法优化
  按照上文描述,初版的分行算法时间复杂度为 O(n) ,n 为文本字数。我们着重考虑通过减少调用次数来实现性能优化。通过实际观察实际应用场景,我们得出以下结论:  每行文本的字数相差不多,因为中文字的宽度相同,导致字数差异的是数字、字母等;  中文业务场景中数字和字母远没有中文字数多;  即使在最小的屏幕上展示,每行最少也有30个字符;
  基于这些信息,我们做出如下优化:
  处理第一行时,我们不再逐字测宽,而是直接截取前30个字符测宽,多退少补直至宽度正确;  记录第一行的字数,作为下一行期望的字数 except,多退少补直至正确;  记录新的一行的字数 n,修正except = ( except + n ) / 2 。重复此步骤,直至文本分行结束
  结果对比:
  优化前
  优化后
  渲染 500 字  233.29 ms
  79.5 ms
  渲染 2 万字  11232ms
  91ms
  可见优化效果显著。
  获取标注位置算法优化
  在展示标注结果时,初版获取标注纵向偏移的算法为:检查所有标注数据后,过滤出本行标注进行展示,复杂度为 O(l * n * n),其中 l 为行数,n 为标注数。
  此方式引入了很多不必要的计算。其实,要获取每个标注的垂直偏移量,只需要对比当前行的标注即可。
  针对这个问题,优化思路如下:
  将标注按起始位置升序排列。假设第一行有30个字,那么我们就从升序数组中拿出起始位置小于30的,这就是本行要添加的标注。  判断这些标注是否重叠。假设用户添加了两个标注:  如果二者不重叠,那二者应该展示在一行;  如果二者重叠,那么就要将后处理的标注放在前者的下一行;  遍历数组,把在本行结束的标注剔除。保证每行展示的标注,要么是上一行没有结束的,要么是在本行开始的。
  伪代码如下:  function getMarkPosition(lines, marks) {     // 起始位置升序     const stIndexArr  = marks.sort((a, b) => a.stIndex  - b.stIndex);     const st = 0;       // 本行需要添加的标注     let current = [];       for (let line of lines) {         // 获取当前行的标注         while(stIndexArr[st].stIndex <= line.endIndex) {             current.push(stIndexArr[st]);             st++;         }           // 获取标注         mark.offsetX = getTextLength(line.text.slice(0, mark.stIndex - line.stIndex))         // 添加标注行         addMarkLines(line, current);           // 剔除本行结束的标注         current = current.filter(oldMark => oldMark.endIndex > line.endIndex);     } }   // 添加标注行 function addMarkLines (line, marks) {     const markLines = [[]];     let inserted = false;       // 遍历所有标注         marks.forEach(mark => {         // 遍历所有行         for(let i = 0; i < markLines.length; i++) {             // 如果本行没有和新标注重叠的,则放入本行             if(!markLines[i].find(oldMark => isOverlap(oldMark, mark))) {                 mark.offsetY = i;                 markLines.push(mark);                 inserted = true;                 break;             }         }           // 如果所有行都重叠,则单开一行                 if(!inserted) {             mark.offsetY = markLines.length;             markLines.push([mark]);         }     })       line.markLines = markLines; }
  总结
  实体关系标注工具在来也科技内部已经上线半年。至今日,公司内部全部的 NLP 标注需求已全部接入。标注文档超过 3 万篇,标注效率提升 35%,标注准确率提升至 96.8% 。
  本文作者:贾思齐
  来源:微信公众号: 来也技术团队
  出处:https://mp.weixin.qq.com/s/mXfGtyTtbbjq-v2KB5ryHw

看着时髦穿起来辣眼,这些服饰个个都假,中年妈妈少碰为妙虽然在当下,时尚早就与年龄无关了,很多中年妈妈们都靠出众衣品走在时尚前沿,成为普通大众的穿衣榜样。不过我们也无法否认,依旧有不少中年妈妈在追求时髦这一点上用力过猛了,导致时尚灾难。这5个短裤显瘦配衬技巧快记下!今夏要凉快地上班去短裤是炎炎夏日的穿搭好选择,别以为短裤不能成上班服,其实只要配衬得宜,短裤造型也是非常得体的smartcasual上班造型!以下为大家介绍5个短裤显瘦配衬技巧,让各位OL今夏都能够夏天有3种茶可以多喝健康营养师茶茶饮很多台湾人都喜欢喝茶,茶的滋味丰富又有层次,还含有多种对身体好的营养成份,喝茶时也能让身心感到放松。有营养师就介绍了很适合夏天喝的3种茶,不仅可以让我们消消暑,还可走进这个漫画般的夏天春至花如锦,夏近叶成帷。李爽芳树喜欢春天繁花似锦的模样也热爱盛夏枝叶繁茂如同帷幕低垂般夏日好天气让人充满无限期待天气晴朗,万物可爱一同徜徉在这片绿意里走进这个漫画般的夏天万里晴空总看着时髦穿起来辣眼,这些服饰个个都假,中年妈妈少碰为妙虽然在当下,时尚早就与年龄无关了,很多中年妈妈们都靠出众衣品走在时尚前沿,成为普通大众的穿衣榜样。不过我们也无法否认,依旧有不少中年妈妈在追求时髦这一点上用力过猛了,导致时尚灾难。这5个短裤显瘦配衬技巧快记下!今夏要凉快地上班去短裤是炎炎夏日的穿搭好选择,别以为短裤不能成上班服,其实只要配衬得宜,短裤造型也是非常得体的smartcasual上班造型!以下为大家介绍5个短裤显瘦配衬技巧,让各位OL今夏都能够夏天有3种茶可以多喝健康营养师茶茶饮很多台湾人都喜欢喝茶,茶的滋味丰富又有层次,还含有多种对身体好的营养成份,喝茶时也能让身心感到放松。有营养师就介绍了很适合夏天喝的3种茶,不仅可以让我们消消暑,还可祝贺朱婷恩师!女排头号种子31逆转搭上4强末班车现场陷入狂欢世界女排联赛第四场14决赛,土耳其女排对阵泰国女排,最终,土耳其队先输一局后连赢三局31逆转,搭上了4强的末班车(此前巴西等已经晋级),祝贺古德利!而现场也是陷入到了狂欢,球迷非常女排总决赛爆大冷门,世界第一美国23爆冷出局,中国女排有希望北京时间7月14日凌晨,世界女排连胜联赛总决赛结束了下半区两场比赛的争夺,比赛爆出了大冷门。世界排名第一新科奥运冠军美国女排23不敌博斯科维奇缺阵的塞尔维亚队,令人十分惊讶。另一场世界第一爆冷出局,中国女排夺冠加码,蔡斌变阵195cm新星入选中国女排夺冠加码!蔡斌决赛变阵,195cm新星压哨入选北京时间7月14日,世界女排联赛总决赛打响,中国女排经过多日的休整已经通过训练把全员状态调整到最佳,蔡斌主教练非常有信心,在针蔡6人到底还要占位中国女排多久?今天晚上继续进行的女排世联赛14决赛中,中国女排13意大利女排。结果没有任何意外,我们可以接受。但最让中国广大喜爱中国女排的球迷无法接受甚至愤怒无比的是现在的中国女排主教练蔡斌从执
天路?天路!我的草原天路历险记看到阿喵汽车为何很多司机宁愿在高速路堵车,都不愿走国道的视频,让我不由得想起我2015年自驾去张家口草原天路旅游,回程时被迫走省道国道,被夹在钢铁洪流中危险历程,真可谓是惊心动魄。琐事乳山银滩旅居日志20220224昨天看阜新群聊,有北京的朋友在知乎写的文章,不论是观点或者文风和我都蛮像的。感觉还挺有意思。晚上睡得很香,早上起来,看打工仔的群聊。有朋友推荐东莞高埗,不少工作2527每小时。20新学期家长宣言(建议收藏,每天过目)新学期家长宣言,建议您收藏,每天朗读!1)从此刻起我要多鼓励赞美孩子,而不是批评指责埋怨孩子。因为我知道只有鼓励和赞美才能带给孩子自信和力量,批评指责埋怨只是在发泄我的情绪,伤害孩去柬埔寨游玩,给当地姑娘300元钱,接下来会发生什么?提到柬埔寨,相信很多人都会联想到电信诈骗,因为柬埔寨的社会治安比较混乱,所以在一些偏远的地区。经常出现电信诈骗或者拐卖等不良现象。(此处已添加小程序,请到今日头条客户端查看)但是如什么时候喝蜂蜜水比较好?这2个时间段,二选一即可人每天都要喝水,通过喝水可以让身体的各大器官组织得到滋润,身体在不缺水的情况下才能使机能正常运转,保持健康。在喝水的时候,有的人喜欢加入一些蜂蜜,喝起来口味香甜,还可滋养身体。但是金盏花伴随印度人每个重要时刻环球时报特约记者宇同元宵节看花展逛花市已经成为中国许多城市的新春保留节目。而在邻国印度,几乎所有的节日和重大场合中,印度人都离不开一种金黄色或橘红色的小花金盏花。图为印度花市上卖金即将迎来签证到期高峰月,几种好方案推荐!你,续签安排好了吗?即将迎来签证到期高峰月,几种好方案推荐!你,续签安排好了吗?每年的3月15日与8月30日是大部分同学学生签证到期的日子。提醒同学们千万要在这两个日期前关注一下自己的签证时间,不要错想要少生病?可以参考以下几点,希望可以帮到你,健康才是根本健康2022大家好,我是知识辞海。人这辈子要想不生大病,少生大病,请记住以下七点。第一个不生气,不过度伤心,第二个,不要熬夜,第三个,别乱吃。吃饭,饮食结构很重要,鱼肉蛋奶豆制品,春季补钙黄金期春季补钙黄金期,高钙菜品已上线!不容错过!!迟日江上丽,春风花草香,载着春风,春天已经悄然而至。在初春温暖过度之际,依然伴有春寒,湿气夹面而来的感觉。随着气温升高,大地复苏,天气渐教育部下发新公告,幼儿园将有大改变,家长的福气在后头学前教育是学生接受教育过程中最不可或缺的一个环节。每个适龄儿童都避免不了接受学前教育,这也是为了以后更好的适应小学生活,在幼儿园阶段,学生不需要学习文化知识,不过掌握生活技能和常识长期喝茶与坚持喝水,哪个更有益健康呢?研究结果公布,快来瞧瞧中国居民膳食指南(2016)中指出,成年人每天要喝1500毫升至1700毫升水,这里面既包括直接喝进去的水,也包括摄入食物中所含的水。中国地大物博,每个地方都有自己的文化风俗,但在国产新能源车崛起,大脑却来自美企,华为的教训如何避免?文谛林审核子扬校对知秋近年来,国内新能源汽车产业迅速发展,不少造车新势力应运而生,且取得了出色的成绩。例如蔚来小鹏理想等已经成为中国市场热度颇高的造车新势力,还计划将产品远销海外。柯洁的哀叹说明了什么号称中国围棋第一高手的柯洁也被韩国的申真諝赢了,事后柯洁哀叹这棋没法下了,申的棋与AI的吻合度高达71,整盘棋没有一个问题手,这个差距让柯洁感觉他是与AI在下,因此没办法赢棋。这样西班牙人3大罪人!中国球迷急了,围攻官博质问武磊有意思吗西甲第25轮,西班牙人没有在塞维利亚身上拿到胜利,虽然1分的结果可以接受。但是很多中国球迷却不开心,毕竟,他们等了90分钟,也没有看到武磊出场,这让他们围攻西班牙人官博,怒斥西班牙40岁还能打首发的5大球星,乔丹巨星水准,司机下滑明显NBA一场比赛的时间只有48分钟,每支球队的首发球员,都会占据大量的出场时间。所以一场比赛的输赢,5名首发球员至关重要。这也是为什么NBA的首发,个个实力了得,那些表现一般的球员,3年9000万!4年8000万!勇士为了夺冠拼了,如此高薪真的值吗?勇士目前43胜17负战绩,仅次于太阳排名西部第二,夺得三座总冠军奖杯后,勇士依然保留夺冠主力阵容,还招募来了维金斯加盟,汤普森也复出比赛,本赛季勇士依然是夺冠大热门球队,不过仔细想中国生育成本2022版报告出炉,年轻人不愿意生娃的原因找到了中国2022版生育成本报告新鲜出炉,年轻人不愿意生娃的原因找到了推荐语近年来,有关我国出生人口不断下降的话题总能引发大众热议,那么现如今我国具体的人口发展情况是怎样的呢?根据官方公排列五22046期规律走势图记录2月25号开奖温馨提示个人图规记录,参观者不可作为投注依据。。。。。。。助力杜兰特夺冠,拒绝加盟雄鹿联手字母哥,联盟4212后卫示好篮网NBA联盟在上周举行了一年一度的全明星周末,之后也是休整了一周时间,这也给各支球队迎来了一个难得的喘息机会。在休赛期间,不少球队还在抓紧时间进行补强,常规赛只剩下二十多场比赛,对那交易失败了吧?哈登耍赖了吧?现在哈登活蹦乱跳了吧?篮网交易失败了吧?哈登是真的耍赖了吧?现在哈登又回来了吧?换来个西蒙,别说与哈登差距有多大,你得上场啊!现在是遥遥无期,你哪儿伤了也好说?养好伤就上场了,现在弄个精神有问题,抑郁了一年集训321天,男足练了啥?成果逗乐日本梅西,球迷严查退钱随着时间的前移,当耻辱输球的骂声没有此前那样的猛烈,男足这边似乎开始有了刷同情分的感觉。比如说根据媒体统计的在过去的一年,中国男足的集训长达321天,在这个超长的集训期间,球员无法顶薪60万年,球迷的反映,中国足球是没人踢还是另有问题呢?有足球业内人士说顶薪一年60万,这工资水平,更没人踢球了。球迷说在中国月入五万的人还真不多。再牛逼的人,博士毕业也得二十六岁了,其中大多数人也到不了一年六十万到了的,也得是在996