因此,我在 BERT 中輸入了用于標記預測的句子數據幀,并與預測一起作為輸出接收到,句子分成單詞?,F在我想將拆分/標記化的句子和預測的數據框恢復為原始句子。(當然我有原始句子,但我需要執行此過程,以使預測與句子標記一致)original sentenceYou couldn't have done any better because if you could have, you would have.Post processing['[CLS]', 'You', 'couldn', "'", 't', 'have', 'done', 'any', 'better', 'because', 'if', 'you', 'could', 'have', ',', 'you', 'would', 'have', '.', '[SEP]']我確定了三個必要的過程。1. 刪除引號 2. 刪除 CLS ,SEP 及其多余的引號和逗號, 3. 刪除分隔單詞的逗號并將它們合并。def fix_df(row): sentences = row['t_words'] return remove_edges(sentences)def remove_edges(sentences): x = sentences[9:-9] return remove_qmarks(x)def remove_qmarks(x): y = x.replace("'", "") return join(y)def join(y): z = ' '.join(y) return za_df['sents'] = a_df.apply(fix_df, axis=1) 前兩個功能在很大程度上可以正常工作,但最后一個沒有。相反,我得到了一個看起來像這樣的結果。Y o u , c o u l d n , " " , t , h a v e, d o n e ,...逗號并沒有消失,而是文字被扭曲了。我肯定錯過了一些東西。那會是什么?
1 回答

慕田峪4524236
TA貢獻1875條經驗 獲得超5個贊
結果字符串真的,真的看起來像一個完全正常的列表的字符串表示,所以讓 Python 將它安全地轉換回列表,按照將列表的字符串表示形式轉換為列表:
import ast result = """['[CLS]', 'You', 'couldn', "'", 't', 'have', 'done', 'any', 'better', 'because', 'if', 'you', 'could', 'have', ',', 'you', 'would', 'have', '.', '[SEP]']""" result_as_list = ast.literal_eval(result)
現在我們有了這個
['[CLS]', 'You', 'couldn', "'", 't', 'have', 'done', 'any', 'better', 'because', 'if', 'you', 'could', 'have', ',', 'you', 'would', 'have', '.', '[SEP]']
讓我們再看看你的步驟。首先,“刪除引號”。但是沒有任何(過時的)引號,因為這是一個字符串列表;您在表示中看到的額外引號只是因為這就是Python 中字符串的表示方式。
接下來,“刪除開始和結束標記”。由于這是一個列表,它們只是第一個和最后一個元素,無需進一步計算:
result_as_list = result_as_list[1:-1]
接下來,“刪除逗號”。與第一步一樣,沒有(過時的)逗號;它們是 Python顯示列表的一部分,但在實際數據中并不存在。
所以我們最終得到
['You', 'couldn', "'", 't', 'have', 'done', 'any', 'better', 'because', 'if', 'you', 'could', 'have', ',', 'you', 'would', 'have', '.']
可以使用以下方法將其連接回原始字符串
result_as_string = ' '.join(result_as_list)
剩下的唯一問題是 BERT 顯然將撇號、逗號和句號視為單獨的“單詞”:
You couldn ' t have done any better because if you could have , you would have .
需要一點替換:
result_as_string = result_as_string.replace(' ,', ',').replace(' .','.').replace(" ' ", "'")
你的句子回來了:
You couldn't have done any better because if you could have, you would have.
我看到的唯一問題是是否存在不屬于收縮的前導引號或結束引號。如果有必要,您可以將空格-引號-空格替換為更集中的替換,特別針對“不能”、“不能”、“不是”等。
添加回答
舉報
0/150
提交
取消