Python перевод колонки с несколькими языками на английский - PullRequest
0 голосов
/ 13 января 2020

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

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

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

 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'

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

1 Ответ

0 голосов
/ 13 января 2020

Скорее всего, у вас есть некоторые комментарии, которые состоят только из 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)

РЕДАКТИРОВАТЬ: Если вы получаете ошибку HTTP Too Many Requests это, вероятно, потому, что вы выгнали из Google Translate API. Вместо использования apply, вы можете сделать ваш перевод "очень медленным", используя for l oop с некоторыми циклами сна. В этом случае вам следует импортировать другой пакет (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. Конечно, чем дольше сон, тем медленнее перевод! NB sleep аргумент в секундах.

...