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 entity及Use 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ù)包含Span與Relation兩種標(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ǔ)言,可選有ch
和en
飞主。默認(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_prefix
和options
參數(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)注