中文斷句模型-模型訓練和建置

題目

這次的專案是要協助沒有斷句(標點符號)的文章,找出適合斷句點,範例案例如下

原句:我大學畢業就到澳洲打工度假一年多工作經歷是在果園採果工廠包裝蔬菜雖然很辛苦但月薪換算成台幣是很不錯的今年初打工簽證結束後回台準備考公職中同時也在想如果明年公職還是沒考上要不要回鄉下跟親戚一起種田還蠻懷念在澳洲大自然環境工作的感覺但擔心爸媽會反彈都念到大學了還去做田在網路上搜尋看了很多青年返鄉務農的成功和失敗經歷真的很猶疑想問問大家的意見

產出:我大學畢業就到澳洲打工度假一年多 | 工作經歷是在果園採果工廠包裝蔬菜 | 雖然很辛苦 | 但月薪換算成台幣是很不錯的 | 今年初打工簽證結束後回台準備考公職中 | 同時也在想如果明年公職還是沒考上 | 要不要回鄉下跟親戚一起種田 | 還蠻懷念在澳洲大自然環境工作的感覺 | 但擔心爸媽會反彈 | 都念到大學了還去做田 | 在網路上搜尋 | 看了很多青年返鄉務農的成功和失敗經歷 | 真的很猶疑 | 想問問大家的意見

模型前處理概念

由於我這邊只想要得到適合斷句的節點,我並不在乎是哪一種節點分類,因此這次我只會標注該字是不是節點,並不會依照類型不同有不一樣的標註。以下範例:

原句:太祖坚持邀请照烈和自己同宿,凡是留下来的,全都让他们又吃又喝。
文字:太祖坚持邀请照烈和自己同宿凡是留下来的全都让他们又吃又喝
標註:0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1

訓練資料

這邊我們使用 BangBOOM/Classical-Chinese 專案裡面提供的資料集。

['那年轻人回答说:没有。',
 '就像先前一样,编造谎言问那些孩子。',
 '太祖坚持邀请照烈和自己同宿,凡是留下来的,全都让他们又吃又喝。',
 '我儿应当记住啊。',
 '您要是能够增援我的右翼,我就能够取代他的地位。',
 '太祖很高兴地说:凭着这样的部下去作战,还担心不能取胜么?',
 '现在我看他们的气势,恐怕再不是从前的他们了。',
 '第二天,剩下的残部全都投降了。',
 '皇上病愈。',
 '拔都就向大家宣布这个决定,大家都同意他,立蒙哥为帝就这样决定下来了。']

資料前處理

保留斷句的標點符號,並清除以外所有不合規定的資料。

spacialToken = "。"
def replace_symbol(sent):
    # cop = re.compile("[^\u4e00-\u9fa5^a-z^A-Z^0-9]")  # 保留中英數
    cop = re.compile("[。,,: ~!!?? ]")  
    sent = cop.sub(spacialToken, sent)  

    cop = re.compile(f"[^\u4e00-\u9fa5^a-z^A-Z^0-9^{spacialToken}]")  
    sent = cop.sub('', sent)  
    return sent

模型架構與訓練參數

架構我使用 AutoModelForTokenClassification

參數如下:

training_args = TrainingArguments(
    evaluation_strategy="steps",
    logging_steps=50,
    save_strategy="steps",
    save_steps=50,
    learning_rate=5e-5,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=16,
    num_train_epochs=5,
    weight_decay=0.05,
    load_best_model_at_end=True,
    save_total_limit=1
)

成果

後面overfit,所以可以不用跑那麼多次。

Step	Training Loss	Validation Loss
100	0.028500	0.137976
200	0.029900	0.087191
300	0.070400	0.082461
400	0.067000	0.076366
500	0.059500	0.084755
600	0.065600	0.072914
700	0.060200	0.065739
800	0.061800	0.070972
900	0.056200	0.065347
1000	0.057900	0.075387
1100	0.057800	0.074218
1200	0.056900	0.064672
1300	0.057300	0.071091
1400	0.034500	0.078264
1500	0.032200	0.078497
1600	0.034500	0.079563
1700	0.032000	0.074016
1800	0.034000	0.086084
1900	0.035600	0.080275
2000	0.030900	0.080736
2100	0.034400	0.083435
2200	0.035000	0.090095
2300	0.034100	0.081803
2400	0.036500	0.076348
2500	0.032900	0.084999

評估

              precision    recall  f1-score   support

           0       0.98      0.98      0.98      2860
           1       0.88      0.88      0.88       387

   micro avg       0.97      0.97      0.97      3247
   macro avg       0.93      0.93      0.93      3247
weighted avg       0.97      0.97      0.97      3247
 samples avg       0.97      0.97      0.97      3247

COLAB

提供我的腳本: Google Colaboratory


以下是我的參考資料

參考文獻

這是別人完成的模型,是以文言文斷句作為題目進行建制,雖然沒有使用白話文的訓練材料,但依然能在白話文測試時也有相當好的成果。

相關研究

Add a Comment

發佈留言必須填寫的電子郵件地址不會公開。