Python переводит столбец с несколькими языками на английский

У меня есть набор данных, в котором есть несколько столбцов комментариев на нескольких языках, и я хочу перевести эти столбцы на английский язык и создать новые столбцы со всеми английскими переводами.

Accountability_COMMENT – это столбец с несколькими комментариями на разных языках в каждой строке. Я хочу создать новую колонку и перевести все такие комментарии на английский язык.

Я пробовал следующий код:

 from googletrans import Translator
 from textblob import TextBlob
 translator = Translator()
 data_merge['Accountability_COMMENT'] = data_merge['Accountability_COMMENT'].apply(lambda x: 
 TextBlob(x).translate(to='en'))

Ошибка, которую я получаю:

TypeError: аргумент text, передаваемый в __init__(text), должен быть строкой, а не классом 'float'

Мой столбец имеет правильный формат объекта


person Django12    schedule 13.01.2020    source источник
comment
Вы пробовали этот код... и? Вы получаете какую-либо ошибку? Вывод не похож на тот, который вы хотите?   -  person UJIN    schedule 13.01.2020
comment
Кроме того, мне непонятно, как выглядит ваш входной DataFrame и как должен выглядеть выходной. Есть ли один столбец с комментариями или есть много столбцов с комментариями?   -  person UJIN    schedule 13.01.2020
comment
есть один столбец, содержащий около 3000 комментариев на разных языках. Мне нужно перевести их все на английский и сохранить в новый столбец..   -  person Django12    schedule 13.01.2020
comment
Я проверил ваш код на тестовом DataFrame всего с тремя строками со строками на разных языках, и это сработало. Что на самом деле говорит сообщение об ошибке? TypeError: The text argument passed to __init__(text) must be a string, not что? Что после not?   -  person UJIN    schedule 13.01.2020
comment
TypeError: Аргумент text, передаваемый в __init__(text), должен быть строкой, а не ‹class 'float'›   -  person Django12    schedule 13.01.2020


Ответы (1)


Скорее всего, у вас есть некоторые комментарии, состоящие только из float (то есть десятичного числа), что даже если они type: object в соответствии с pandas, они все равно интерпретируются как float по TextBlob. Это приводит к ошибке:

TypeError: The text argument passed to __init__(text) must be a string, not <class 'float'>

Одно из решений — убедиться, что ввод x из TextBlob(x) является строкой. Вы можете сделать это, изменив строку apply следующим образом:

 data_merge['Accountability_COMMENT'] = data_merge['Accountability_COMMENT'].apply(lambda x: TextBlob(str(x)).translate(to='en'))

К сожалению, это, вероятно, также вызовет ошибку, например:

raise NotTranslated('Translation API returned the input string unchanged.')
textblob.exceptions.NotTranslated: Translation API returned the input string unchanged.

Это связано с тем, что при переводе номера перевод и исходный текст будут абсолютно одинаковыми, а это видимо TextBlob не нравится.

Что вы можете сделать, чтобы избежать этого, так это поймать это исключение NotTranslated и просто вернуть непереведенное TextBlob, например:

from textblob import TextBlob
from textblob.exceptions import NotTranslated    

def translate_comment(x):
    try:
        # Try to translate the string version of the comment
        return TextBlob(str(x)).translate(to='en')
    except NotTranslated:
        # If the output is the same as the input just return the TextBlob version of the input
        return TextBlob(str(x))

data_merge['Accountability_COMMENT'] = data_merge['Accountability_COMMENT'].apply(translate_comment)

EDIT: Если вы получаете ошибку HTTP Too Many Requests, возможно, это связано с тем, что Google Translate API выгнал вас. Вместо использования apply вы можете сделать свой перевод «очень медленным», используя цикл for с некоторым приостановкой между циклами. В этом случае вы должны импортировать другой пакет (time) и заменить последнюю строку:

from time import sleep
from textblob import TextBlob
from textblob.exceptions import NotTranslated    

def translate_comment(x):
    try:
        # Try to translate the string version of the comment
        return TextBlob(str(x)).translate(to='en')
    except NotTranslated:
        # If the output is the same as the input just return the TextBlob version of the input
        return TextBlob(str(x))

for i in range(len(data_merge['Accountability_COMMENT'])):
    # Translate one comment at a time
    data_merge['Accountability_COMMENT'].iloc[i] = translate_comment(data_merge['Accountability_COMMENT'].iloc[i])

    # Sleep for a quarter of second
    sleep(0.25)

Затем вы можете поэкспериментировать с различными значениями функции sleep. Конечно, чем дольше сон, тем медленнее перевод! Н.Б. Аргумент sleep указывается в секундах.

person UJIN    schedule 13.01.2020
comment
Это выглядит действительно перспективным и имеет смысл для меня. Но все же у меня есть ошибка: HTTPError: Ошибка HTTP 429: слишком много запросов. Я не уверен, как справиться с этим. - person Django12; 13.01.2020
comment
Я отредактировал свой ответ, надеюсь, это поможет. Если вы нашли мой ответ полезным, пожалуйста, проголосуйте за него, и если он решил вашу проблему, примите его! :) - person UJIN; 13.01.2020
comment
Я все еще получаю ту же ошибку. Я сделал попытку и исключение в другой ячейке, а затем импортировал время в другую. Тем не менее я получаю ту же ошибку .. - person Django12; 13.01.2020
comment
И как только мы преодолеем эту ошибку, в том же фрейме данных у меня будет еще около 10 столбцов, в которых мне нужно сделать то же самое. - person Django12; 13.01.2020
comment
У вас есть две отдельные проблемы, которые нужно решить одновременно, если вы хотите, чтобы весь код работал. Один из них касается неправильного типа некоторых ячеек, а другой — слишком большого количества запросов, которые textblob отправляет (неявно) в Google. Пожалуйста, посмотрите мой обновленный код, вы должны использовать обе функцию с исключением и цикл for с функцией sleep. Я не думаю, что могу сделать что-то большее, чем это, чтобы помочь вам, это уже должно было указать вам правильный путь. - person UJIN; 13.01.2020