Основы многоязычного текстового корпуса

1

У меня есть текстовый корпус с описаниями предметов на английском, русском и польском языках.

Этот текстовый корпус имеет 68K наблюдений. Некоторые из этих наблюдений написаны на английском языке, некоторые на русском языке, а некоторые на польском языке.

Не могли бы вы рассказать мне, как правильно и экономически эффективно реализовать слово, происходящее в этом случае? Я не могу использовать английский словарь по русским словам и наоборот.

К сожалению, я не смог найти хороший идентификатор языка. Например, langdetect работает слишком медленно и часто неправильно. Например, я пытаюсь определить язык английского слова "сегодня":

detect("today") 
"so" 
# i.e Somali 

Пока моя реализация кода выглядит плохо. Я просто использую один стеблем на другом:

import nltk
# polish stemmer
from pymorfologik import Morfologik

clean_items = []

# create stemmers

snowball_en = nltk.SnowballStemmer("english")
snowball_ru = nltk.SnowballStemmer("russian")
stemmer_pl = Morfologik()

# loop over each item; create an index i that goes from 0 to the length
# of the item list 

for i in range(0, num_items):
    # Call our function for each one, and add the result to the list of
    # clean items

    cleaned = items.iloc[i]

    # to word stem
    clean_items.append(snowball_ru.stem(stemmer_pl(snowball_en.stem(cleaned))))
  • 0
    Как насчет определения языка сначала по предложению / токену текста, а затем с использованием соответствующего стеммера?
  • 0
    Вы можете сделать грубый классификатор языка слов, используя существование и / или частоты символов, а также фонотаксику. Вы можете даже добавить четвертый класс, который будет содержать слова, которые не могут быть классифицированы, и, вероятно, из-за длины даже не понадобятся (например, английская статья "a", чешское соединение "a").
Показать ещё 7 комментариев
Теги:
nlp
nltk
text-processing
stemming

1 ответ

1
Лучший ответ

Хотя API не так уж и langdetect, вы можете заставить langdetect ограничиться только langdetect языками, с которыми вы фактически работаете. Например:

from langdetect.detector_factory import DetectorFactory, PROFILES_DIRECTORY
import os

def get_factory_for(langs):
    df = DetectorFactory()
    profiles = []
    for lang in ['en', 'ru', 'pl']:
        with open(os.path.join(PROFILES_DIRECTORY, lang), 'r', encoding='utf-8') as f:
            profiles.append(f.read())
    df.load_json_profile(profiles)

    def _detect_langs(text):
        d = df.create()
        d.append(text)
        return d.get_probabilities()

    def _detect(text):
        d = df.create()
        d.append(text)
        return d.detect()

    df.detect_langs = _detect_langs
    df.detect = _detect
    return df

Хотя неограниченный langdetect кажется, что "today" является сомалийцем, если у вас есть только английский, русский и польский, вы можете теперь это сделать:

df = get_factory_for(['en', 'ru', 'pl'])
df.detect('today')         # 'en'
df.detect_langs('today')   # [en:0.9999988994459187]

Он все равно пропустит много ("snow" по-видимому, польский), но он по-прежнему резко сократит ваш коэффициент ошибок.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню