Ошибка API GoogleTrans - Ожидаемое значение: строка 1, столбец 1 (символ 0)
Я имею эту ошибку при переводе тысяч текстовых данных в итерации:
Expecting value: line 1 column 1 (char 0)
Мой код для перевода больших объемов текста:
translatedList = []
for index, row in df.iterrows():
newrow = copy.deepcopy(row)
try:
# translate the 'text' column
translated = translator.translate(row['text'], dest='en')
newrow['translated'] = translated.text
except Exception as e:
print(str(e))
continue
translatedList.append(newrow)
Я получаю эту ошибку после перевода около 2-3k строк.
2 ответа
Я вроде понял проблему. Я думаю, что это касается лимита запросов Google API.
Я решил эту проблему путем повторной инициализации API переводчика на каждой итерации:
import copy
from googletrans import Translator
translatedList = []
for index, row in df.iterrows():
# REINITIALIZE THE API
translator = Translator()
newrow = copy.deepcopy(row)
try:
# translate the 'text' column
translated = translator.translate(row['text'], dest='en')
newrow['translated'] = translated.text
except Exception as e:
print(str(e))
continue
translatedList.append(newrow)
Это то, что мне пришлось сделать, чтобы обойти их ограничение вызовов API... Я использую VPN, в частности Nord-Vpn, поэтому, чтобы сделать это так, как я, вам нужно будет иметь возможность подключаться / отключаться от / к VPN через терминал...
def translate_text(text, dest_language="en"):
# Used to translate using the googletrans library
import json
translator = googletrans.Translator()
try:
translation = translator.translate(text=text, dest=dest_language)
except json.decoder.JSONDecodeError:
# api call restriction
process = subprocess.Popen(["nordvpn", "d"], stdout=subprocess.PIPE)
process.wait()
process = subprocess.Popen(["nordvpn", "c", "canada"], stdout=subprocess.PIPE)
process.wait()
return Process_Data.translate_text(text=text, dest_language=dest_language)
return translation
Google может блокировать ваш IP, использовать VPN, и это должно работать.
Для этого может быть 2 причины:
1. IP-адрес временно заблокирован.
2. Вы достигли максимального количества символов.
Я столкнулся с той же проблемой и в итоге использовал другой пакет под названием translate
и работает безупречно. Синтаксис тоже очень похож. Вы можете найти это здесь или сделатьpip install translate
В моем случае это вызвано эмодзи в строках. Я удалил их, и все работает хорошо.
В моем случае ошибка была вызвана слишком большим количеством запросов за короткий промежуток времени, и мой IP-адрес был временно заблокирован. Я попробовал это на следующий день снова, и все работало хорошо.
Я дам модифицированный ответ Остина Марино, здесь решение, которое просто сработало для меня в списке из 2000 слов (также будет работать в большем списке).
Сначала вам нужно установить NordVPN и добавить его в системный путь, проверьте эту ссылку:
Цель состоит в том, чтобы вы могли подключаться / отключаться и выбирать серверы с CMD (вы можете сделать то же самое в Linux), чтобы вы могли управлять этими командами NordVPN CMD через код Python.
Вот функция (пожалуйста, импортируйте библиотеки):
import random
listofservers = ["South Africa", "Egypt" , "Australia", "New Zealand", "South Korea", "Singapore", "Taiwan", "Vietnam", "Hong Kong", "Indonesia", "Thailand", "Japan", "Malaysia", "United Kingdom", "Netherlands", "Germany", "France", "Belgium", "Switzerland", "Sweden","Spain","Denmark", "Italy", "Norway", "Austria", "Romania", "Czech Republic", "Luxembourg", "Poland", "Finland", "Hungary", "Latvia", "Russia", "Iceland", "Bulgaria", "Croatia", "Moldova", "Portugal", "Albania", "Ireland", "Slovakia","Ukraine", "Cyprus", "Estonia", "Georgia", "Greece", "Serbia", "Slovenia", "Azerbaijan", "Bosnia and Herzegovina", "Macedonia","India", 'Turkey', 'Israel', 'United Arab Emirates', 'United States', 'Canada','Mexico'
,"Brazil", "Costa Rica", "Argentina", "Chile"]
def SelectServer(l):
return random.choice(l)
def translate_text(text, dest_language="en"):
# Used to translate using the googletrans library
translator = googletrans.Translator()
try:
translation = translator.translate(text=text, dest=dest_language)
except json.decoder.JSONDecodeError:
# api call restriction
print("exception !! déconection du VPN ")
process = subprocess.Popen(["nordvpn", "-d"], shell = True ,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process.wait()
time.sleep(5)
srv = SelectServer(listofservers)
print("sélection du serveur : "+ srv + " et connexion")
process = subprocess.Popen(["nordvpn", "-c", "-g", srv ], shell = True ,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process.wait()
time.sleep(60)
return translate_text(text=text, dest_language=dest_language)
return translation.text
#translate to EN and remove EN stopwords
ListCapTranslated = []
for row in ListCaptionsCleanFiltred:
# REINITIALIZE THE API
newrow = translate_text(row, dest_language="en")
ListCapTranslated.append(newrow)
ListCapTranslated
Перед запуском кода добавьте NordVPN в системный путь и проверьте подключение / отключение на серверах через CMD, чтобы убедиться, что все работает.
Ура.
Я тоже столкнулся с этой проблемой. В моем случае это было связано с переводом текста (с английского) на английский.
В качестве обходного пути я использовал другой пакет langdetect для перенаправления неанглийского текста для перевода с помощью Google Translate.
какой-то фрагмент кода:
from langdetect import detect
lang = detect(title)
if lang == 'en':
temp_dict['title'] = title
else:
temp_dict['title'] = translator.translate(title, dest='en').text
Это происходит из-за ограничения на перевод. Вы можете использовать VPN или Tor, чтобы обойти ограничение. Однако вы можете обойти это, используя транслингвальный пакет Python. Также здесь можно найти коды языков, коды языков.
from translingual import translate
# example
trans = translate.translate(data=['hello world', 'the world is yours', 'whatever you do, whatever I do', '2b or not 2b'],tolang='es',fromlang='en',thread=3)
print(trans.translate())
Проблема заключается в запросах, которые одно устройство может делать с одного и того же IP-адреса. Смена VPN решает проблему. Бесплатная и простая альтернатива NordVPN - TunnelBear. Вы можете скачать его здесь.
Для меня максимальное количество запросов к API googletranslate составляет 200. Итак, каждые 200 запросов я вручную меняю VPN, а затем перехожу к следующим запросам.
К сожалению, здесь есть некоторая ручная работа, так как вам нужно каждый раз менять VPN-соединение. Однако это полезно, если вы хотите получить быстрые результаты и не программировать изменение VPN на Python.
Это связано с ограничением API. Предел перевода для каждой инициализации. Итак, переинициализируйте переводчик по истечении лимита, разбив код.
from googletrans import Translator
translator = Translator()