Python 当'';。join(x)不起作用

Python 当'';。join(x)不起作用,python,nlp,spacy,bert-language-model,re,Python,Nlp,Spacy,Bert Language Model,Re,因此,我输入了一个句子数据帧,用于在BERT中进行标记预测,我将其与预测一起作为输出接收,这些句子被拆分为单词。 现在,我想将拆分/标记化句子和预测的数据帧恢复到原始句子。(当然,我有原始句子,但我需要执行此过程,以便预测与句子标记保持一致) 我确定了三个必要的过程。 1.删除引号2。删除CLS、SEP及其额外的引号和逗号3。删除分隔单词的逗号并合并它们 def fix_df(row): sentences = row['t_words'] return remove_edge

因此,我输入了一个句子数据帧,用于在BERT中进行标记预测,我将其与预测一起作为输出接收,这些句子被拆分为单词。 现在,我想将拆分/标记化句子和预测的数据帧恢复到原始句子。(当然,我有原始句子,但我需要执行此过程,以便预测与句子标记保持一致)

我确定了三个必要的过程。 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安全地将其转换回列表,根据:

导入ast
结果=“”[”[CLS]、“你”、“不能”、“已经”、“做过”、“任何”、“更好”、“因为”、“如果”、“你”、“可以”、“已经”、“已经”、“已经”、“你”、“将会”、“已经”、“已经”、“已经”和“[SEP]””
结果作为列表=ast.literal评估(结果)
现在我们有了这个

['[CLS]', 'You', 'couldn', "'", 't', 'have', 'done', 'any', 'better', 'because', 'if', 'you', 'could', 'have', ',', 'you', 'would', 'have', '.', '[SEP]']
让我们再看一遍你的步骤。首先,“删除引号”。但是没有任何(过时的)引号,因为这是一个字符串列表;您在表示中看到的额外引号只是因为在Python中字符串就是这样表示的

接下来,“删除开始和结束标记”。因为这是一个列表,它们只是第一个和最后一个元素,不需要进一步计算:

result\u as\u list=result\u as\u list[1:-1]
接下来,“删除逗号”。与第一步一样,没有(过时的)逗号;它们是Python显示列表的一部分,而不在实际数据中

因此,我们以

['You', 'couldn', "'", 't', 'have', 'done', 'any', 'better', 'because', 'if', 'you', 'could', 'have', ',', 'you', 'would', 'have', '.']
可以使用

result\u as\u string=''.join(result\u as\u列表)
剩下的唯一问题是,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(“,”)。replace(“,”)”
你的话又回来了:

You couldn't have done any better because if you could have, you would have.

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

您能否提供一个
行['t_words']
的示例?首先,您没有删除逗号的代码。第二,你的处理函数有信息丢失——空格。如果不明确空格的位置,就无法重新建立句子。@Anwarvic。我在上面做了。post_处理是行[t_words]的一个示例,original就是originalsentence@vitalolious我该如何解决这两个问题?@usr2564301让我提供更多的上下文。伯特使用了词条标记化,它将一个句子分解成子词,而不是单词(例如,汉语=man#da#rin#或类似的词)。然而,即使在为预测做准备时,它也会对单词执行相同的操作,但它会输出与单词匹配的标记。从本质上讲,标记分类与单词有关,而不是句子。稍加修改,这个答案就完美了。
You couldn't have done any better because if you could have, you would have.