多语言文本语料库的词干

时间:2018-08-27 12:14:43

标签: python nlp nltk text-processing stemming

我有一个语料库,其中包含用英语,俄语和波兰语进行的项目描述。

该文本语料库具有68K个观察值。其中一些观察是用英语写的,一些是俄语的,还有一些是波兰语的。

您能告诉我在这种情况下 适当 具有成本效益 的用法吗?我不能在俄语单词上使用英语词干,反之亦然。

很遗憾,我找不到很好的语言标识符。例如。 langdetect的运行速度太慢,而且经常会出错。例如,我尝试识别英语单词“ today”的语言:

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 :(得分:2)

即使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"显然是波兰语),但仍会大大降低您的错误率。