Скорее всего, у вас есть некоторые комментарии, состоящие только из 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
TypeError: The text argument passed to __init__(text) must be a string, not
что? Что послеnot
? - person UJIN   schedule 13.01.2020text
, передаваемый в__init__(text)
, должен быть строкой, а не ‹class 'float'› - person Django12   schedule 13.01.2020