中文內容夾雜英文,出現[UNK],該如何解決?

#2
by sfkuo - opened

中文內容夾雜英文,出現[UNK],該如何解決? 謝謝

輸入的內容為:為監測與防治此新興傳染病我國於2020年1月15日起公告COVID19為第五類法定傳染病並於2020年1月21日確診第一起境外移入確診個案另於1月28日確診第1例本土個案為境外移入造成之家庭群聚感染

輸出結果:為監測與防治此新興傳染病。我國於2020年1月15日起公告[UNK][UNK][UNK][UNK][UNK]19為第五類法定傳染病,並於2020年1月21日確診第一起境外移入確診個案,另於1月28日確診第1例本土個案,為境外移入造成之家庭群聚感染。

你好,我在原本的解碼實現方式較為簡單,是直接運用模型預測的 token id 轉換回文字,所以當文字中包含模型不認得的文字(即詞表外)就會出現 [UNK]。
然而我們可以透過文字與token的映射表來取回[UNK]範圍的文字,如此便可以修復這個問題。

我簡單的示範一下這部分如何進行,調整後應該就可以解決你的問題:
https://colab.research.google.com/drive/1dE5UtjNIlESEpJURF0mEcHt_FmyuySdD?usp=sharing

由於要調整到zhpr會牽涉到較大的重構,目前我並沒有計畫去更新原本的解碼策略,但是歡迎提出PR :)

請讓這個議題懸掛在這邊,直到zhpr更新為止。

看了下 https://colab.research.google.com/drive/1dE5UtjNIlESEpJURF0mEcHt_FmyuySdD?usp=sharing 的实现没太理解。我的解决方法是在后处理的时候稍微改一下。看下面的代码。试了我找的一段话,没问题,UNK都替换成原文了。

    model_pred_out = []
    for batch in tqdm(dataloader):
        batch_out = predict_step(batch,model,tokenizer)
        for out in batch_out:
            model_pred_out.append(out)
    merge_pred_result = merge_stride(model_pred_out,step)
    merge_pred_result_decode = decode_pred(merge_pred_result)

    # 不马上合并
    # merge_pred_result_decode = ''.join(merge_pred_result_decode)
    # print(merge_pred_result_decode)

    # 使用双指针和for循环取出UNK
    ptr_orig = 0
    merge_pred_result_decode_unk_removed = ""
    for ptr_restored in range(len(merge_pred_result_deocde)):
        curr = merge_pred_result_deocde[ptr_restored]
        if ptr_orig == len(text):
            assert curr != '[UNK]'
        if curr == '[UNK]':
            curr = text[ptr_orig]
            ptr_orig += 1
        elif ptr_orig < len(text) and curr == text[ptr_orig]:
            ptr_orig += 1
    merge_pred_result_decode_unk_removed += curr

    print(merge_pred_result_decode_unk_removed)

Sign up or log in to comment