Можно ли сказать стеммеру игнорировать слова конкретного языка? - PullRequest
0 голосов
/ 04 ноября 2019

Я использую Cistem stemmer для немецкого языка.

Документы, которые я создаю, содержат также английские слова.

Поэтому я хочу сказать немецкому партеру игнорировать английские слова, а затем я хочу сказать своему английскому партеру игнорировать немецкие слова.

Пример:

Мой текст на немецком языке содержит английское слово "case". Немецкий стеммер называет это «cas», но оно должно оставаться «case». Поэтому игнорируем английское слово "case".

Возможно ли это?

Мой код:

stemmer = Cistem()
sl = []
for line in o: 
    sp = line.split()
    sl.append(sp)

st = [[stemmer.segment(s) for s in l] for l in sl]

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Хороший подход - сравнить частоту появления данного слова в корпусе английских документов с частотой появления этого же слова в корпусе немецких документов.
Например, если слово w1 встречается чащев немецкой википедии, чем в английской википедии, тогда это, вероятно, немецкое слово.

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

Мы можем использовать английскую и немецкую модель в Spacy:

import spacy
nlpDE = spacy.load("de_core_news_md")
nlpEN = spacy.load('en_core_web_md')

# some test sentences in both languages:
sl = [ "Python is an interpreted, high-level, general-purpose programming language.",
"Created by Guido van Rossum and first released in 1991, Python's design philosophy emphasizes code readability with its notable use of significant whitespace.", 
"Its language constructs and object-oriented approach aim to help programmers write clear, logical code for small and large-scale projects.", 
"Python ist eine universelle, üblicherweise interpretierte höhere Programmiersprache.",
" Wegen ihrer klaren und übersichtlichen Syntax gilt Python als einfach zu erlernen.",
"Python unterstützt mehrere Programmierparadigmen, z. B. die objektorientierte, die aspektorientierte und die funktionale Programmierung"]

#let's randomly shuffle this list of test sentences:
from random import shuffle
shuffle(sl)
s = " ".join(sl)

#Our function which will compare the likelihoods:
def compare(word):
    prob_en = nlpEN.vocab[word].prob
    prob_de = nlpDE.vocab[word].prob
    if prob_en > prob_de:
        return('EN')
    else:
        return('DE')


doc = nlpEN(s)    
print([(t, compare(t.text))  for t in doc if not t.is_punct])

ИРезультат этого метода на данных выборки:

[(Python, 'EN'), (is, 'EN'), (an, 'DE'), (interpreted, 'EN'), (high, 'EN'), (level, 'EN'), 
(general, 'EN'), (purpose, 'EN'), (programming, 'EN'), (language, 'EN'), (Python, 'EN'), 
(unterstützt, 'DE'), (mehrere, 'DE'), (Programmierparadigmen, 'DE'), (z., 'DE'), (B., 'DE'), (die, 'DE'), 
(objektorientierte, 'DE'), (die, 'DE'), (aspektorientierte, 'DE'), (und, 'DE'), (die, 'DE'), (funktionale, 'DE'),
 (Programmierung, 'DE'), (Created, 'EN'), (by, 'EN'), (Guido, 'DE'), (van, 'DE'), (Rossum, 'DE'), (and, 'EN'),
 (first, 'EN'), (released, 'EN'), (in, 'DE'), (1991, 'EN'), (Python, 'EN'), ('s, 'EN'), (design, 'EN'), 
(philosophy, 'EN'), (emphasizes, 'EN'), (code, 'EN'), (readability, 'EN'), (with, 'EN'), (its, 'EN'), 
(notable, 'EN'), (use, 'EN'), (of, 'EN'), (significant, 'EN'), (whitespace, 'EN'), ( , 'EN'), (Wegen, 'DE'), 
(ihrer, 'DE'), (klaren, 'DE'), (und, 'DE'), (übersichtlichen, 'DE'), (Syntax, 'DE'), (gilt, 'DE'), (Python, 'EN'), 
(als, 'DE'), (einfach, 'DE'), (zu, 'DE'), (erlernen, 'DE'), (Python, 'EN'), (ist, 'DE'), (eine, 'DE'), 
(universelle, 'DE'), (üblicherweise, 'DE'), (interpretierte, 'DE'), (höhere, 'DE'), (Programmiersprache, 'DE'),
 (Its, 'EN'), (language, 'EN'), (constructs, 'EN'), (and, 'EN'), (object, 'EN'), (oriented, 'EN'), (approach, 'EN'), 
(aim, 'EN'), (to, 'EN'), (help, 'EN'), (programmers, 'EN'), (write, 'EN'), (clear, 'EN'), (logical, 'EN'),
 (code, 'EN'), (for, 'EN'), (small, 'EN'), (and, 'EN'), (large, 'EN'), (scale, 'EN'), (projects, 'EN')]
0 голосов
/ 05 ноября 2019

Непосредственной идеей было бы проверить для каждого токена, принадлежит ли он к определенному немецкому словарю или к английскому словарю. В соответствии с этим вы можете решить, применять стеммер к токену или нет. Для этого вам понадобится словарь соответствующих языков, возможно, вы могли бы использовать один из nltk или проверить наличие или частоту в корпусе, чтобы можно было определить вероятность использования слова на целевом языке или его использования. заимствование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...