Обзор методов определения языка в Python
Определение языка текста в Python: обзор
Как определить язык текста с помощью библиотеки langdetect?
Библиотека langdetect - это простая и быстрая библиотека для определения языка текста. Она портирована с Java-библиотеки Google Language Detection и поддерживает более 50 языков.
Установка
pip install langdetectPython определить язык текста (определение языка текста в python)
Базовое использование
Импортируйте функцию detect и передайте ей строку текста:
from langdetect import detect
text = "Привет, мир!"
lang = detect(text)
print(lang)
Результат:
ru
Для получения вероятностей по всем языкам используйте detect_langs:
from langdetect import detect_langs
text = "Hello world"
langs = detect_langs(text)
for lang in langs:
print(lang.lang, lang.prob)
Результат:
en 0.9999964279536089
Типичные проблемы и их решения
- Ошибка LangDetectException: No features in text. Возникает, если текст слишком короткий (менее 10 символов). Решение: проверяйте длину текста перед вызовом detect.
- Неверное определение для смешанных языков. Библиотека определяет доминирующий язык. Для смешанного текста лучше использовать detect_langs и анализировать вероятности.
- Проблемы с установкой на некоторых платформах. Иногда требуется компилятор C++ или gcc. Решение: используйте виртуальное окружение и обновите pip:
pip install --upgrade pip.
Цели использования: быстрая и лёгкая идентификация языка в небольших текстах (сообщения, комментарии, заголовки). Подходит для прототипирования и проектов, где не требуется высочайшая точность.
Как определить язык с помощью библиотеки langid?
Библиотека langid использует naГЇve Bayes классификатор и предобученную модель на 97 языках. Она проста в установке и использовании.
Установка
pip install langid
Пример использования
import langid
text = "Bonjour le monde"
lang, confidence = langid.classify(text)
print(lang, confidence)
Результат:
fr -303.4705762863159
Значение confidence - это логарифмическая вероятность; чем ближе к нулю, тем выше уверенность.
Если нужно получить только язык:
lang = langid.classify(text)[0]
Типичные проблемы и их решения
- Низкая точность для похожих языков (например, испанский и португальский). Решение: используйте доверительную вероятность (confidence) и установите порог.
- Медленная работа на больших текстах. Решение: разбивайте текст на части или используйте batch-обработку.
Цели использования: определение языка для многоязычных документов, когда требуется широкий охват языков.
Как применить fastText для определения языка?
Библиотека fastText от Facebook предлагает предобученные модели для идентификации языка. Модель lid.176.bin распознаёт 176 языков и показывает высокую точность.
Установка и загрузка модели
pip install fasttext
wget https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin
Пример использования
import fasttext
model = fasttext.load_model('lid.176.bin')
text = "Где мои семнадцать лет?"
predictions = model.predict(text, k=2)
print(predictions)
Результат:
(('__label__ru', '__label__be'), array([0.9876, 0.0102]))
Первая метка - наиболее вероятный язык (ru - русский).
Если нужно только название языка:
lang = predictions[0][0].replace('__label__', '')
print(lang)
Типичные проблемы и их решения
- Модель очень большая (900 МБ). Решение: скачайте модель заранее и сохраните в папке проекта.
- Ошибка TypeError: expected string or bytes-like object при передаче пустого текста. Решение: проверяйте, что текст не пуст и не состоит только из пробелов.
- Медленная загрузка модели (каждый раз). Решение: загружайте модель один раз и используйте синглтон.
Цели использования: высокая точность и поддержка редких языков. Подходит для критичных приложений, где требуется максимальная достоверность.
Как определить язык с помощью Polyglot?
Polyglot - библиотека для обработки естественного языка, которая включает модуль определения языка на основе n-грамм.
Установка
Установка может быть сложной из-за зависимостей (ICU). Рекомендуется использовать conda:
conda install -c conda-forge polyglot
polyglot download languages2
Пример использования
from polyglot.detect import Detector
text = "Ciao mondo"
detector = Detector(text)
print(detector.language.code)
Результат:
it
Можно получить также название языка и уверенность:
print(detector.language.name, detector.language.confidence)
Типичные проблемы и их решения
- Ошибка ImportError: No module named 'icu'. Решение: установите PyICU (
pip install pyicu) или используйте conda. - Не загружены языковые пакеты. После установки polyglot необходимо выполнить
polyglot download languages2. - Медленная работа на больших текстах. Решение: ограничьте размер текста первыми 500 символами.
Цели использования: когда требуется не только код языка, но и дополнительные лингвистические данные (токенизация, транслитерация).
Как определить язык через Google Translate API (библиотека googletrans)?
Сервис Google Translate предоставляет возможность обнаруживать язык через API. Библиотека googletrans предоставляет неофициальный клиент для этого API.
Установка
pip install googletrans==4.0.0-rc1
Пример использования
from googletrans import Translator
translator = Translator()
text = "Hola amigo"
detection = translator.detect(text)
print(detection.lang, detection.confidence)
Результат:
es 0.9
Также можно использовать синхронную версию:
result = translator.detect(text)
print(result.lang)
Типичные проблемы и их решения
- Ошибка AttributeError: 'NoneType' object has no attribute 'group' при первом запуске. Решение: обновите библиотеку до последней версии и используйте
googletrans==4.0.0-rc1. - Ограничение на количество запросов (100 запросов в час для бесплатного API). Решение: используйте платный API Google Cloud Translation или введите задержки между запросами.
- Блокировка со стороны Google при частых запросах. Решение: используйте официальный клиент с API-ключом.
Цели использования: когда другие локальные библиотеки не справляются с редким языком или требуется высокая точность за счёт облачного сервиса.
Расширенные примеры определения языка
1. Сравнение нескольких библиотек на одном тексте
import langdetect
import langid
import fasttext
model = fasttext.load_model('lid.176.bin')
text = "Ich liebe Programmierung"
# langdetect
print("langdetect:", langdetect.detect(text))
# langid
lang, conf = langid.classify(text)
print("langid:", lang, conf)
# fastText
preds = model.predict(text, k=1)
lang_ft = preds[0][0].replace('__label__', '')
print("fastText:", lang_ft)
langdetect: de langid: de -328.417 fastText: de
2. Обработка списка текстов и вывод результатов в DataFrame
import pandas as pd
from langdetect import detect, DetectorFactory
DetectorFactory.seed = 0 # для воспроизводимости
texts = [
"This is English",
"Ceci est franГ§ais",
"Dies ist Deutsch",
"Это русский"
]
results = []
for t in texts:
try:
lang = detect(t)
except:
lang = "unknown"
results.append({'text': t, 'language': lang})
df = pd.DataFrame(results)
print(df)
text language 0 This is English en 1 Ceci est franГ§ais fr 2 Dies ist Deutsch de 3 Это русский ru
3. Определение языка из файла и обработка пустых строк
from pathlib import Path
from langdetect import detect
file_path = Path('sample_texts.txt')
if file_path.exists():
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if len(line) < 10:
print("Пропущена короткая строка:", line)
continue
try:
lang = detect(line)
print(f"{line[:30]:30} -> {lang}")
except Exception as e:
print(f"Ошибка для строки: {line[:30]:30} -> {e}")
Пропущена короткая строка: Hi Hello world! -> en Bonjour tout le monde -> fr
4. Использование вероятностей для фильтрации неуверенных предсказаний
from langdetect import detect_langs
texts = [
"A quick brown fox",
"Hola, como estas?",
"Смешанный текст with English",
""
]
for t in texts:
if len(t) < 10:
print(f"'{t}' -> слишком короткий")
continue
try:
langs = detect_langs(t)
best = langs[0]
if best.prob < 0.8:
print(f"'{t}' -> слабая уверенность: {best.lang} ({best.prob:.2f})")
else:
print(f"'{t}' -> {best.lang} ({best.prob:.2f})")
except Exception as e:
print(f"'{t}' -> ошибка: {e}")
'A quick brown fox' -> en (1.00) 'Hola, como estas?' -> es (1.00) 'Смешанный текст with English' -> ru (0.82) '' -> слишком короткий
5. Пакетное определение языка с fastText и сохранение результатов в CSV
import fasttext
import csv
model = fasttext.load_model('lid.176.bin')
texts = ["Привет", "Hello", "Hola", "Bonjour", "Guten Tag", "안녕하세요"]
with open('language_results.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['text', 'language', 'confidence'])
for txt in texts:
if len(txt.strip()) == 0:
continue
preds = model.predict(txt, k=1)
lang = preds[0][0].replace('__label__', '')
conf = preds[1][0]
writer.writerow([txt, lang, f"{conf:.4f}"])
print("Результаты сохранены в language_results.csv")
Результаты сохранены в language_results.csv
6. Настройка seed в langdetect для воспроизводимости
from langdetect import DetectorFactory
DetectorFactory.seed = 42
text = "This is consistent"
for _ in range(5):
print(detect(text))
en en en en en
7. Определение языка для каждого абзаца в длинном тексте
text = """First paragraph in English.
Ce second paragraphe est en franГ§ais.
Dritter Absatz auf Deutsch."""
paragraphs = text.split('\n\n')
for i, para in enumerate(paragraphs, 1):
lang = detect(para)
print(f"Paragraph {i}: {lang} - {para[:50]}...")
Paragraph 1: en - First paragraph in English.... Paragraph 2: fr - Ce second paragraphe est en franГ§ais.... Paragraph 3: de - Dritter Absatz auf Deutsch....