Ошибка 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 и добавить его в системный путь, проверьте эту ссылку:

https://support.nordvpn.com/Connectivity/Windows/1350897482/Connect-to-NordVPN-app-on-Windows-using-the-Command-Prompt.htm

Цель состоит в том, чтобы вы могли подключаться / отключаться и выбирать серверы с 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()

Другие вопросы по тегам