使用文本標(biāo)注工具-doccano

doccano是documment anotation的縮寫(xiě),是一個(gè)開(kāi)源的文本標(biāo)注工具闯睹,我們可以用它為NLP任務(wù)的語(yǔ)料庫(kù)進(jìn)行打標(biāo)。它支持情感分析担神,命名實(shí)體識(shí)別楼吃,文本摘要,關(guān)系抽取等任務(wù)妄讯。

它的操作非常便捷孩锡,在小型語(yǔ)料庫(kù)上,只要數(shù)小時(shí)就能完成全部的打標(biāo)工作亥贸。

下面介紹一下如何安裝躬窜、配置和使用doccano。

1. 安裝

本文是基于anaconda來(lái)進(jìn)行安裝炕置。

首先荣挨,在anaconda下創(chuàng)建虛擬環(huán)境:

conda create -n doccano python=3.9

注:建議python版本為3.9+

然后溜族,激活doccano環(huán)境:

conda activate doccano

在doccano環(huán)境下安裝doccano:

pip install doccano

2. 運(yùn)行

在doccano環(huán)境下執(zhí)行:

# 初始化數(shù)據(jù)庫(kù)
doccano init

# 創(chuàng)建一個(gè)super user。這里要把pass改成你需要的密碼垦沉。當(dāng)然煌抒,用戶名也可以改成別的。
doccano createuser --username admin --password pass

啟動(dòng)doccano

首先厕倍,在終端中運(yùn)行下面的代碼來(lái)啟動(dòng)WebServer

# 啟動(dòng)webserver
doccano webserver --port 8000

然后寡壮,打開(kāi)另一個(gè)終端,運(yùn)行下面的代碼啟動(dòng)任務(wù)隊(duì)列:

# 啟動(dòng)任務(wù)隊(duì)列
doccano task

此時(shí)讹弯,我們就完成了doccano的啟動(dòng)况既。

3. 文本標(biāo)注

運(yùn)行doccano與創(chuàng)建新的文本打標(biāo)項(xiàng)目

首先,打開(kāi)瀏覽器(最好是Chrome)组民,在地址欄中輸入http://localhost:8000/并回車棒仍。

此時(shí),我們會(huì)看到這樣的界面


點(diǎn)擊右上角進(jìn)行登錄

3.1 項(xiàng)目創(chuàng)建

以江河數(shù)據(jù)標(biāo)注任務(wù)為例:

UIE支持抽取與分類兩種類型的任務(wù)臭胜,根據(jù)實(shí)際需要?jiǎng)?chuàng)建一個(gè)新的項(xiàng)目:

  • 抽取式任務(wù)項(xiàng)目創(chuàng)建

創(chuàng)建項(xiàng)目時(shí)選擇序列標(biāo)注任務(wù)莫其,并勾選Allow overlapping entityUse relation Labeling。適配命名實(shí)體識(shí)別耸三、關(guān)系抽取乱陡、事件抽取、評(píng)價(jià)觀點(diǎn)抽取等任務(wù)仪壮。

  • 分類式任務(wù)項(xiàng)目創(chuàng)建

創(chuàng)建項(xiàng)目時(shí)選擇文本分類任務(wù)憨颠。適配文本分類、句子級(jí)情感傾向分類等任務(wù)积锅。

  • 創(chuàng)建項(xiàng)目爽彤。點(diǎn)擊左上角的CREATE,跳轉(zhuǎn)至以下界面缚陷。

  • 選擇序列標(biāo)注模塊

  • 勾選序列標(biāo)注(Sequence Labeling

  • 填寫(xiě)項(xiàng)目名稱(Project name)等必要信息

  • 勾選允許實(shí)體重疊(Allow overlapping entity)适篙、使用關(guān)系標(biāo)注(Use relation labeling

  • 創(chuàng)建完成后,項(xiàng)目首頁(yè)視頻提供了從數(shù)據(jù)導(dǎo)入到導(dǎo)出的七個(gè)步驟的詳細(xì)說(shuō)明蹬跃。


3.2 數(shù)據(jù)上傳

doccano總共支持4種格式的文本匙瘪,他們的區(qū)別如下:

  • Textfile:要求上傳的文件為txt格式,并且在打標(biāo)的時(shí)候蝶缀,一整個(gè)txt文件在打標(biāo)的時(shí)候顯示為一頁(yè)內(nèi)容;
  • Textline:要求上傳的文件為txt格式薄货,并且在打標(biāo)的時(shí)候翁都,該txt文件的一行文字會(huì)在打標(biāo)的時(shí)候顯示為一頁(yè)內(nèi)容;
  • JSONL:是JSON Lines的簡(jiǎn)寫(xiě)谅猾,每行是一個(gè)有效的JSON值柄慰。
  • CoNLL:是“中文依存語(yǔ)料庫(kù)”鳍悠,是根據(jù)句子的依存結(jié)構(gòu)而建立的樹(shù)庫(kù)。其中坐搔,依存結(jié)構(gòu)描述的是句子中詞與詞之間直接的句法關(guān)系藏研。具體介紹看漢語(yǔ)樹(shù)庫(kù)

注意:

  • doccano官方推薦的文檔編碼格式為UTF-8概行。
  • 在使用JSONL格式的時(shí)候蠢挡,文字?jǐn)?shù)據(jù)本身要符合JSON格式的規(guī)范。
  • 數(shù)據(jù)集中不要包含空行凳忙。

選擇Textline

3.3 添加標(biāo)簽

構(gòu)建抽取式任務(wù)標(biāo)簽

抽取式任務(wù)包含SpanRelation兩種標(biāo)簽類型业踏,Span指原文本中的目標(biāo)信息片段,如實(shí)體識(shí)別中某個(gè)類型的實(shí)體涧卵,事件抽取中的觸發(fā)詞和論元勤家;Relation指原文本中Span之間的關(guān)系,如關(guān)系抽取中兩個(gè)實(shí)體(Subject&Object)之間的關(guān)系柳恐,事件抽取中論元和觸發(fā)詞之間的關(guān)系伐脖。

注意,這里只是添加將來(lái)可供選擇的標(biāo)簽乐设,是項(xiàng)目配置的過(guò)程晓殊,而不是進(jìn)行文本標(biāo)注。

3.4 關(guān)系標(biāo)注

標(biāo)注數(shù)據(jù)伤提。點(diǎn)擊每條數(shù)據(jù)最右邊的Annotate按鈕開(kāi)始標(biāo)記巫俺。標(biāo)記頁(yè)面右側(cè)的標(biāo)簽類型(Label Types)開(kāi)關(guān)可在實(shí)體標(biāo)簽和關(guān)系標(biāo)簽之間切換。

  • 實(shí)體標(biāo)注:直接用鼠標(biāo)選取文本即可標(biāo)注實(shí)體肿男。
  • 關(guān)系標(biāo)注:首先點(diǎn)擊待標(biāo)注的關(guān)系標(biāo)簽介汹,接著依次點(diǎn)擊相應(yīng)的頭尾實(shí)體可完成關(guān)系標(biāo)注。

關(guān)系抽炔芭妗(Relation Extraction嘹承,簡(jiǎn)稱RE),是指從文本中識(shí)別實(shí)體并抽取實(shí)體之間的語(yǔ)義關(guān)系如庭,即抽取三元組(實(shí)體一叹卷,關(guān)系類型,實(shí)體二)坪它。

標(biāo)注示例:


示例中定義了作品名骤竹、人物名時(shí)間三種Span類型標(biāo)簽,以及歌手往毡、發(fā)行時(shí)間所屬專輯三種Relation標(biāo)簽蒙揣。Relation標(biāo)簽由Subject對(duì)應(yīng)實(shí)體指向Object對(duì)應(yīng)實(shí)體

3.5 數(shù)據(jù)導(dǎo)出

3.5.1 導(dǎo)出抽取式任務(wù)數(shù)據(jù)

導(dǎo)出數(shù)據(jù)开瞭。在Datasets一欄點(diǎn)擊Actions懒震、Export Dataset導(dǎo)出已標(biāo)注的數(shù)據(jù)罩息。

選擇導(dǎo)出的文件類型為JSONL(relation),導(dǎo)出數(shù)據(jù)示例:

{
    "id": 38,
    "text": "百科名片你知道我要什么个扰,是歌手高明駿演唱的一首歌曲瓷炮,1989年發(fā)行,收錄于個(gè)人專輯《叢林男孩》中",
    "relations": [
        {
            "id": 20,
            "from_id": 51,
            "to_id": 53,
            "type": "歌手"
        },
        {
            "id": 21,
            "from_id": 51,
            "to_id": 55,
            "type": "發(fā)行時(shí)間"
        },
        {
            "id": 22,
            "from_id": 51,
            "to_id": 54,
            "type": "所屬專輯"
        }
    ],
    "entities": [
        {
            "id": 51,
            "start_offset": 4,
            "end_offset": 11,
            "label": "作品名"
        },
        {
            "id": 53,
            "start_offset": 15,
            "end_offset": 18,
            "label": "人物名"
        },
        {
            "id": 54,
            "start_offset": 42,
            "end_offset": 46,
            "label": "作品名"
        },
        {
            "id": 55,
            "start_offset": 26,
            "end_offset": 31,
            "label": "時(shí)間"
        }
    ]
}

標(biāo)注數(shù)據(jù)保存在同一個(gè)文本文件中递宅,每條樣例占一行且存儲(chǔ)為json格式娘香,其包含以下字段

  • id: 樣本在數(shù)據(jù)集中的唯一標(biāo)識(shí)ID。

  • text: 原始文本數(shù)據(jù)恐锣。

  • entities
    

    : 數(shù)據(jù)中包含的Span標(biāo)簽茅主,每個(gè)Span標(biāo)簽包含四個(gè)字段:

    • id: Span在數(shù)據(jù)集中的唯一標(biāo)識(shí)ID。
    • start_offset: Span的起始token在文本中的下標(biāo)土榴。
    • end_offset: Span的結(jié)束token在文本中下標(biāo)的下一個(gè)位置诀姚。
    • label: Span類型。
  • relations
    

    : 數(shù)據(jù)中包含的Relation標(biāo)簽玷禽,每個(gè)Relation標(biāo)簽包含四個(gè)字段:

    • id: (Span1, Relation, Span2)三元組在數(shù)據(jù)集中的唯一標(biāo)識(shí)ID赫段,不同樣本中的相同三元組對(duì)應(yīng)同一個(gè)ID。
    • from_id: Span1對(duì)應(yīng)的標(biāo)識(shí)ID矢赁。
    • to_id: Span2對(duì)應(yīng)的標(biāo)識(shí)ID糯笙。
    • type: Relation類型。

3.5.2 導(dǎo)出句子級(jí)分類任務(wù)數(shù)據(jù)

選擇導(dǎo)出的文件類型為JSONL撩银,導(dǎo)出數(shù)據(jù)示例:

{
    "id": 41,
    "data": "大年初一就把車前保險(xiǎn)杠給碰壞了给涕,保險(xiǎn)杠和保險(xiǎn)公司 真夠倒霉的,我決定步行反省额获。",
    "label": [
        "負(fù)向"
    ]
}

標(biāo)注數(shù)據(jù)保存在同一個(gè)文本文件中够庙,每條樣例占一行且存儲(chǔ)為json格式,其包含以下字段

  • id: 樣本在數(shù)據(jù)集中的唯一標(biāo)識(shí)ID抄邀。
  • data: 原始文本數(shù)據(jù)耘眨。
  • label: 文本對(duì)應(yīng)類別標(biāo)簽。

3.6 標(biāo)注完數(shù)據(jù)轉(zhuǎn)化:

該章節(jié)詳細(xì)說(shuō)明如何通過(guò)doccano.py腳本對(duì)doccano平臺(tái)導(dǎo)出的標(biāo)注數(shù)據(jù)進(jìn)行轉(zhuǎn)換境肾,一鍵生成訓(xùn)練/驗(yàn)證/測(cè)試集剔难。

3.6.1 抽取式任務(wù)數(shù)據(jù)轉(zhuǎn)換

  • 當(dāng)標(biāo)注完成后,在 doccano 平臺(tái)上導(dǎo)出 JSONL(relation) 形式的文件奥喻,并將其重命名為 doccano_ext.json 后偶宫,放入 ./data 目錄下。
  • 通過(guò) doccano.py 腳本進(jìn)行數(shù)據(jù)形式轉(zhuǎn)換衫嵌,然后便可以開(kāi)始進(jìn)行相應(yīng)模型訓(xùn)練读宙。
python doccano.py \
    --doccano_file ./data/doccano_ext.json \
    --task_type ext \
    --save_dir ./data \
    --splits 0.8 0.2 0 \
    --schema_lang ch

可配置參數(shù)說(shuō)明:

  • doccano_file: 從doccano導(dǎo)出的數(shù)據(jù)標(biāo)注文件。
  • save_dir: 訓(xùn)練數(shù)據(jù)的保存目錄楔绞,默認(rèn)存儲(chǔ)在data目錄下结闸。
  • negative_ratio: 最大負(fù)例比例,該參數(shù)只對(duì)抽取類型任務(wù)有效酒朵,適當(dāng)構(gòu)造負(fù)例可提升模型效果桦锄。負(fù)例數(shù)量和實(shí)際的標(biāo)簽數(shù)量有關(guān),最大負(fù)例數(shù)量 = negative_ratio * 正例數(shù)量蔫耽。該參數(shù)只對(duì)訓(xùn)練集有效结耀,默認(rèn)為5。為了保證評(píng)估指標(biāo)的準(zhǔn)確性匙铡,驗(yàn)證集和測(cè)試集默認(rèn)構(gòu)造全負(fù)例图甜。
  • splits: 劃分?jǐn)?shù)據(jù)集時(shí)訓(xùn)練集、驗(yàn)證集所占的比例鳖眼。默認(rèn)為[0.8, 0.1, 0.1]表示按照8:1:1的比例將數(shù)據(jù)劃分為訓(xùn)練集黑毅、驗(yàn)證集和測(cè)試集。
  • task_type: 選擇任務(wù)類型钦讳,可選有抽取和分類兩種類型的任務(wù)矿瘦。
  • options: 指定分類任務(wù)的類別標(biāo)簽,該參數(shù)只對(duì)分類類型任務(wù)有效愿卒。默認(rèn)為["正向", "負(fù)向"]缚去。
  • prompt_prefix: 聲明分類任務(wù)的prompt前綴信息,該參數(shù)只對(duì)分類類型任務(wù)有效琼开。默認(rèn)為"情感傾向"易结。
  • is_shuffle: 是否對(duì)數(shù)據(jù)集進(jìn)行隨機(jī)打散,默認(rèn)為True柜候。
  • seed: 隨機(jī)種子搞动,默認(rèn)為1000.
  • separator: 實(shí)體類別/評(píng)價(jià)維度與分類標(biāo)簽的分隔符,該參數(shù)只對(duì)實(shí)體/評(píng)價(jià)維度級(jí)分類任務(wù)有效改橘。默認(rèn)為"##"滋尉。
  • schema_lang: 選擇schema的語(yǔ)言,可選有chen飞主。默認(rèn)為ch狮惜,英文數(shù)據(jù)集請(qǐng)選擇en

備注:

  • 默認(rèn)情況下 doccano.py 腳本會(huì)按照比例將數(shù)據(jù)劃分為 train/dev/test 數(shù)據(jù)集
  • 每次執(zhí)行 doccano.py 腳本碌识,將會(huì)覆蓋已有的同名數(shù)據(jù)文件
  • 在模型訓(xùn)練階段我們推薦構(gòu)造一些負(fù)例以提升模型效果碾篡,在數(shù)據(jù)轉(zhuǎn)換階段我們內(nèi)置了這一功能》げ停可通過(guò)negative_ratio控制自動(dòng)構(gòu)造的負(fù)樣本比例开泽;負(fù)樣本數(shù)量 = negative_ratio * 正樣本數(shù)量。
  • 對(duì)于從doccano導(dǎo)出的文件魁瞪,默認(rèn)文件中的每條數(shù)據(jù)都是經(jīng)過(guò)人工正確標(biāo)注的穆律。

更多不同類型任務(wù)(關(guān)系抽取惠呼、事件抽取、評(píng)價(jià)觀點(diǎn)抽取等)的標(biāo)注規(guī)則及參數(shù)說(shuō)明峦耘,請(qǐng)參考doccano數(shù)據(jù)標(biāo)注指南剔蹋。

3.6.2 句子級(jí)分類任務(wù)數(shù)據(jù)轉(zhuǎn)換

  • 當(dāng)標(biāo)注完成后,在 doccano 平臺(tái)上導(dǎo)出 JSON 形式的文件辅髓,并將其重命名為 doccano_cls.json 后泣崩,放入 ./data 目錄下。
  • 在數(shù)據(jù)轉(zhuǎn)換階段洛口,我們會(huì)自動(dòng)構(gòu)造用于模型訓(xùn)練的prompt信息矫付。例如句子級(jí)情感分類中,prompt為情感傾向[正向,負(fù)向]第焰,可以通過(guò)prompt_prefixoptions參數(shù)進(jìn)行聲明买优。
  • 通過(guò) doccano.py 腳本進(jìn)行數(shù)據(jù)形式轉(zhuǎn)換,然后便可以開(kāi)始進(jìn)行相應(yīng)模型訓(xùn)練樟遣。
python doccano.py \
    --doccano_file ./data/doccano_cls.json \
    --task_type "cls" \
    --save_dir ./data \
    --splits 0.8 0.1 0.1 \
    --prompt_prefix "情感傾向" \
    --options "正向" "負(fù)向"

參考文章:doccano標(biāo)注

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末而叼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子豹悬,更是在濱河造成了極大的恐慌葵陵,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞻佛,死亡現(xiàn)場(chǎng)離奇詭異脱篙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)伤柄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門绊困,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人适刀,你說(shuō)我怎么就攤上這事秤朗。” “怎么了笔喉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵取视,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我常挚,道長(zhǎng)作谭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任奄毡,我火速辦了婚禮折欠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己锐秦,他們只是感情好咪奖,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著农猬,像睡著了一般赡艰。 火紅的嫁衣襯著肌膚如雪售淡。 梳的紋絲不亂的頭發(fā)上斤葱,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音揖闸,去河邊找鬼揍堕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛汤纸,可吹牛的內(nèi)容都是我干的衩茸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼贮泞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼楞慈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起啃擦,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤囊蓝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后令蛉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體聚霜,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年珠叔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝎宇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祷安,死狀恐怖姥芥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情汇鞭,我是刑警寧澤凉唐,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站虱咧,受9級(jí)特大地震影響熊榛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腕巡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一玄坦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦煎楣、人聲如沸豺总。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)喻喳。三九已至,卻和暖如春困曙,著一層夾襖步出監(jiān)牢的瞬間表伦,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工慷丽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹦哼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓要糊,卻偏偏與公主長(zhǎng)得像纲熏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锄俄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359