Определение языка и перевод значений в столбце

Из-за ограничений API библиотеки Google Translate (googletrans) решил использовать локально библиотеку EasyNMT. У EasyNMT нет автоматического определения языка (multiple languages). Т.е. сначала нужно определить язык и потом можно перевести значения.

Мой код

# подключаем библиотеку 
from easynmt import EasyNMT

# подключаем модель opus-mt
model = EasyNMT('opus-mt')

# функция для опеределения языка в строке
def detect_language(row):
    """
    Возвращает название языка
    """
    try:
        lang_id = model.language_detection(row['comment_fr'])
        return lang_id
    except:
        pass

# создаем столбец с переводом
df['comment_ru'] = df.apply(lambda row: model.translate(row['comment_fr'], source_lang=detect_language, target_lang='ru'), axis=1)

Получаю ошибку

OSError: Incorrect path_or_model_id: 'Helsinki-NLP/opus-mt-<function detect_language at 0x7f8463e27100>-ru'. Please provide either the path to a local folder or the repo_id of a model on the Hub.

Есть предположение, что так вообще не будет работать и нужно все же создать отдельный столбец. При этом если создаю отдельный столбец, то функция работает в таком виде:

    # функция для опеределения языка в строке
    def detect_language(row):
        """
        Возвращает название языка
        """
        try:
            lang_id = model.language_detection(row['comment_fr'])
            return lang_id
        except:
            pass

df['comment'] = df.apply(detect_language, axis=1) 

Подскажите, как можно было извлечь значение из функции определения языка и подставить его в функцию lambda?

Решение

В одном из топиков уже обсуждали похожий кейс. Кажется не очень изящным, но рабочим:

import pandas as pd, warnings
import numpy as np
from langdetect import detect_langs
from easynmt import EasyNMT

warnings.filterwarnings('ignore')
model = EasyNMT('opus-mt')


def fr_ru(x:str) -> str:
    try:
        input_lang_type = detect_langs(x)[0].lang # определяем язык
        if input_lang_type == "fr": # если французкий
            x = model.translate(x, source_lang = 'fr', target_lang = 'ru')
            return x
        else: # в остальных случаях
            x = model.translate(x, source_lang = 'en', target_lang = 'ru')
            return x
    except:
            return 'n/a' # если пустая строка, возращаем n/a
# создаем столбец с переводом    
df['comment_ru'] = df['comment_fr'].apply(lambda j: fr_ru(j))

Ответы (0 шт):