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