Как программно определить язык отдельного слова

Раздел: Текст -> Обработка естественного языка

Определение языка слова или текста является частой задачей обработки естественного языка. В Python существует несколько библиотек, различающихся по точности, скорости и объему поддерживаемых языков. Ниже рассмотрены основные подходы.

Наиболее эффективное решение с помощью fastText

Библиотека fastText от Facebook предоставляет предобученные модели для идентификации 176 языков. Модель основана на классификации n-грамм символов и показывает высокую точность даже на коротких текстах.

Установка и загрузка модели

pip install fasttext
wget https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin

библиотека nlp python (библиотека nlp в python)

После загрузки модели её можно использовать для предсказания:

import fasttext
model = fasttext.load_model('lid.176.bin')

text = "Bonjour le monde"
labels, probabilities = model.predict(text, k=1)
lang = labels[0].replace('__label__', '')
print(f"Язык: {lang}, уверенность: {probabilities[0]:.3f}")

библиотека spacy python (библиотека spacy в python)

Язык: fr, уверенность: 0.995

Python текст перевод (перевод текста с помощью python)

Метод predict возвращает кортеж из меток и вероятностей. Параметр k задаёт количество лучших кандидатов.

Типичные проблемы и их решения:

  • Модель не найдена или загружается слишком долго. Решение: скачать файл заранее и указать абсолютный путь.
  • Ошибка при установке fasttext из-за отсутствия компилятора. Решение: использовать предварительно скомпилированные бинарные файлы через conda или установить g++.
  • Модель не распознаёт очень короткие слова (менее 3 символов). Решение: комбинировать с другими методами или увеличить контекст.

Как определить язык слова с помощью langdetect?

Библиотека langdetect портирует Java-алгоритм Google Language Detection. Поддерживает 55 языков. Проста в использовании, но на коротких строках может ошибаться.

pip install langdetect
from langdetect import detect
text = "Hola amigo"
lang = detect(text)
print(lang)

определить язык слова python (определение языка слова в python)

es

стоп слова python (стоп-слова в python)

Для получения вероятностей используется detect_langs:

from langdetect import detect_langs
probs = detect_langs(text)
for item in probs:
    print(item.lang, item.prob)

Возможные сложности:

  • На коротких словах (менее 5 символов) результат может быть случайным (например, 'cat' -> 'la'). Решение: использовать контекст или увеличить минимальную длину строки.
  • Ошибка LangDetectException: No features in text. при пустой строке. Решение: проверять текст перед вызовом.

Как распознать язык текста через langid?

Библиотека langid основана на наивном байесовском классификаторе с n-граммами символов. Поддерживает 97 языков. Лёгкая и быстрая.

pip install langid
import langid
text = "Guten Tag"
lang, confidence = langid.classify(text)
print(lang, confidence)
de -13.09

Значение уверенности представляет логарифмическую вероятность. Чем меньше отрицательное число, тем выше уверенность.

Особенности: библиотека может путать близкородственные языки (например, норвежский и датский). Для повышения точности можно задать langid.set_languages(['en','fr','de']).

Как использовать cld3 для быстрого определения языка?

cld3 (Compact Language Detector v3) - компактная нейронная сеть от Google, способна определять более 100 языков. Отличается маленьким размером модели и высокой скоростью.

pip install gcld3
import gcld3
detector = gcld3.NNetLanguageIdentifier(min_num_bytes=0, max_num_bytes=1000)
text = "Привет мир"
result = detector.FindLanguage(text)
print(result.language, result.probability, result.reliable, result.proportion)
ru 0.999 True 1.0

Метод возвращает объект с полями language, probability, reliable и proportion.

Проблемы: cld3 плохо работает с однобуквенными или пустыми строками. Для коротких слов рекомендуется устанавливать min_num_bytes=1.

Как определить язык по алфавиту символов с помощью unicodedata?

Для простых случаев, когда нужно отличить, например, кириллицу от латиницы, можно использовать диапазоны Unicode. Этот метод не требует установки дополнительных библиотек, но не различает языки внутри одной письменности.

import unicodedata

def detect_script(text):
    for char in text:
        if 'A' <= char <= 'Z' or 'a' <= char <= 'z':
            return 'Latin'
        if 'А' <= char <= 'я' or char == 'ё' or char == 'Ё':
            return 'Cyrillic'
    return 'Unknown'

print(detect_script("Hello"))
print(detect_script("Привет"))
Latin
Cyrillic

Ограничения: метод не определяет языки, использующие одну письменность (например, английский и французский), а также не работает с иероглифами или арабским письмом без дополнительных диапазонов.

Расширенные примеры определения языка

Пакетное определение языка для списка слов с fastText

Пример обработки нескольких слов и вывода вероятностей для каждого:

Пример
import fasttext
model = fasttext.load_model('lid.176.bin')

words = ['hello', 'привет', 'hola', 'こんにちは', 'bonjour']
for w in words:
    labels, probs = model.predict(w, k=2)
    langs = [l.replace('__label__','') for l in labels[0]]
    print(f"{w:10} -> {langs[0]:4} ({probs[0][0]:.3f}) | {langs[1]:4} ({probs[0][1]:.3f})")
hello      -> en   (0.998) | fr   (0.001)
привет     -> ru   (1.000) | uk   (0.000)
hola       -> es   (0.999) | pt   (0.001)
こんにちは  -> ja   (0.999) | zh   (0.001)
bonjour    -> fr   (0.999) | pt   (0.001)

Параметр k=2 показывает два наиболее вероятных языка.

Определение языка с фильтрацией по порогу уверенности (langdetect)

Иногда требуется игнорировать результаты с низкой вероятностью. Реализация:

Пример
from langdetect import detect_langs, LangDetectException

def confident_detect(text, threshold=0.9):
    try:
        probs = detect_langs(text)
        best = probs[0]
        if best.prob >= threshold:
            return best.lang
        else:
            return None
    except LangDetectException:
        return None

for t in ['cat', 'the cat sat on the mat', '']:
    print(f"{t!r:30} -> {confident_detect(t)}")
'cat'                          -> None
'the cat sat on the mat'       -> en
''                             -> None

Сравнение результатов разных библиотек на одном тексте

Полезно оценить согласованность методов:

Пример
import fasttext, langid, gcld3

fasttext_model = fasttext.load_model('lid.176.bin')
cld3_detector = gcld3.NNetLanguageIdentifier(1, 1000)

text = "C'est la vie"
# fastText
ft_labels, ft_probs = fasttext_model.predict(text, k=1)
ft_lang = ft_labels[0].replace('__label__','')
# langid
li_lang, li_conf = langid.classify(text)
# cld3
cld3_result = cld3_detector.FindLanguage(text)

print(f"fastText: {ft_lang} (prob={ft_probs[0][0]:.3f})")
print(f"langid:   {li_lang} (log_conf={li_conf:.3f})")
print(f"cld3:     {cld3_result.language} (prob={cld3_result.probability:.3f})")
fastText: fr (prob=0.998)
langid:   fr (log_conf=-0.457)
cld3:     fr (prob=0.997)

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

Удаление шума часто повышает точность на смешанных данных:

Пример
import re
from langdetect import detect

def clean_and_detect(text):
    # удаляем всё кроме букв и пробелов
    cleaned = re.sub(r'[^a-zA-Zа-яА-ЯёЁ\s]', '', text)
    return detect(cleaned) if cleaned.strip() else None

samples = ["Привет! Как дела? 123", "Hello, world! #python", "123456"]
for s in samples:
    print(f"{s:40} -> {clean_and_detect(s)}")
'Привет! Как дела? 123'          -> ru
'Hello, world! #python'          -> en
'123456'                         -> None

Интеграция с pandas: определение языка для колонки DataFrame

Удобно для анализа текстовых данных:

Пример
import pandas as pd
import fasttext
model = fasttext.load_model('lid.176.bin')

df = pd.DataFrame({
    'text': ['Python is great', 'Merci beaucoup', 'Спасибо', 'Grazie']
})
df['lang'] = df['text'].apply(
    lambda x: model.predict(x, k=1)[0][0].replace('__label__','')
)
print(df)
                text lang
0   Python is great   en
1  Merci beaucoup    fr
2            Спасибо   ru
3           Grazie    it

Определение языка слова в Python - comments

En
определить язык слова python (python)