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