Основы многоязычного текстового корпуса - PullRequest
0 голосов
/ 27 августа 2018

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

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

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

К сожалению, я не смог найти хороший идентификатор языка. Например. 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))))

1 Ответ

0 голосов
/ 28 августа 2018

Несмотря на то, что API не так уж хорош, вы можете ограничить 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", по-видимому, польский), но все равно значительно снизит уровень ошибок.

...