Удаление запятых после обработки списков строк, когда '' .join (x) не работает - PullRequest
0 голосов
/ 27 апреля 2020

Таким образом, я ввел информационный кадр предложений для предсказания токена в BERT, и я получил в качестве вывода вместе с предсказаниями предложения, разбитые на слова. Теперь я хочу вернуть свой фрейм данных разделенных / токенизированных предложений и предсказаний обратно к исходному предложению (конечно, у меня есть исходное предложение, но мне нужно сделать этот процесс так, чтобы предсказания находились в гармонии с токенами предложения)

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 ,...

Запятые не были go, и вместо этого текст искажался. Я определенно что-то упускаю. что бы это могло быть?

1 Ответ

1 голос
/ 28 апреля 2020

Строка результата действительно, действительно выглядит как строковое представление в противном случае совершенно нормального списка, поэтому давайте 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]']

давайте go снова по вашим шагам. Сначала «удалите кавычки». Но нет никаких (устаревших) кавычек, потому что это список строк; дополнительные кавычки, которые вы видите в представлении, только потому, что именно так строка представлена ​​в 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 .

, которые требуют немного o'relacing:

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 на более сфокусированную, нацеленную на «не могу», «не могу», «нет» и т. Д. c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...