Определение языка и перевод значений в столбце
Из-за ограничений 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))