为了账号安全,请及时绑定邮箱和手机立即绑定

当 ' '.join(x) 不起作用时,在处理字符串列表后删除逗号

当 ' '.join(x) 不起作用时,在处理字符串列表后删除逗号

皈依舞 2022-10-25 16:15:25
因此,我在 BERT 中输入了用于标记预测的句子数据帧,并与预测一起作为输出接收到,句子分成单词。现在我想将拆分/标记化的句子和预测的数据框恢复为原始句子。(当然我有原始句子,但我需要执行此过程,以使预测与句子标记一致)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.

我看到的唯一问题是是否存在不属于收缩的前导引号或结束引号。如果有必要,您可以将空格-引号-空格替换为更集中的替换,特别针对“不能”、“不能”、“不是”等。


查看完整回答
反对 回复 2022-10-25
  • 1 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号