在处理字符串列表后删除逗号,当 ' '.join(x) 不起作用时
Removing commas after processing lists of strings, when ' '.join(x) does not work
所以我在 BERT 中输入了一个句子数据框用于标记预测,我收到了作为输出的句子和预测,句子分成了单词。
现在我想将 split/tokenized 个句子和预测的数据框恢复为原始句子。(当然我有原始句子,但我需要执行此过程以便预测与句子标记一致)
original sentence
You 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 z
a_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 ,...
逗号没有消失,文字反而被扭曲了。我肯定错过了什么。那会是什么?
结果字符串真的非常像一个完全正常的列表的字符串表示,所以让我们Python将它安全地转换回列表,Convert string representation of list to list:
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]']
让我们再次检查您的步骤。首先,"remove the quote marks"。但是没有任何(过时的)引号,因为这是一个字符串列表;您在表示中看到的额外引号只是因为 string 在 Python.
中的表示方式
接下来,"remove the beginning and end markers"。由于这是一个列表,它们只是第一个和最后一个元素,不需要进一步计算:
result_as_list = result_as_list[1:-1]
接下来,"remove the commas"。与第一步一样,没有(过时的)逗号;它们是 Python 显示 列表的一部分,但在实际数据中并不存在。
所以我们最终得到
['You', 'couldn', "'", 't', 'have', 'done', 'any', 'better', 'because', 'if', 'you', 'could', 'have', ',', 'you', 'would', 'have', '.']
可以使用
将其连接回原始字符串
result_as_string = ' '.join(result_as_list)
剩下的唯一问题是 BERT 显然将撇号、逗号和句号视为单独的 'words':
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.
我看到的唯一问题是是否有不属于缩略语的前导引号或结束引号。如果有必要,您可以将 space-quote-space 替换为更专注的替换,具体针对 "couldn't"、"can't"、"aren't" 等
所以我在 BERT 中输入了一个句子数据框用于标记预测,我收到了作为输出的句子和预测,句子分成了单词。 现在我想将 split/tokenized 个句子和预测的数据框恢复为原始句子。(当然我有原始句子,但我需要执行此过程以便预测与句子标记一致)
original sentence
You 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 z
a_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 ,...
逗号没有消失,文字反而被扭曲了。我肯定错过了什么。那会是什么?
结果字符串真的非常像一个完全正常的列表的字符串表示,所以让我们Python将它安全地转换回列表,Convert string representation of list to list:
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]']
让我们再次检查您的步骤。首先,"remove the quote marks"。但是没有任何(过时的)引号,因为这是一个字符串列表;您在表示中看到的额外引号只是因为 string 在 Python.
中的表示方式接下来,"remove the beginning and end markers"。由于这是一个列表,它们只是第一个和最后一个元素,不需要进一步计算:
result_as_list = result_as_list[1:-1]
接下来,"remove the commas"。与第一步一样,没有(过时的)逗号;它们是 Python 显示 列表的一部分,但在实际数据中并不存在。
所以我们最终得到
['You', 'couldn', "'", 't', 'have', 'done', 'any', 'better', 'because', 'if', 'you', 'could', 'have', ',', 'you', 'would', 'have', '.']
可以使用
将其连接回原始字符串result_as_string = ' '.join(result_as_list)
剩下的唯一问题是 BERT 显然将撇号、逗号和句号视为单独的 'words':
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.
我看到的唯一问题是是否有不属于缩略语的前导引号或结束引号。如果有必要,您可以将 space-quote-space 替换为更专注的替换,具体针对 "couldn't"、"can't"、"aren't" 等