Как обучать / расширять словарный запас nltk на неанглийском языке - PullRequest
0 голосов
/ 11 февраля 2019

Я разбираю текст на немецком языке со многими дефисами.Чтобы проверить, является ли слово правильным немецким словом (и оно было разделено дефисом, потому что оно было концом строки) или оно нуждается в этих дефисах, потому что так оно и должно быть написано, я сейчас расширяю коллекцию лемматизированных словчто я нашел здесь: https://github.com/michmech/lemmatization-lists

Можете ли вы указать мне, как это можно сделать с помощью nltk?

Что я делаю: когда мой парсер встречает слово с дефисом, япроверить орфографию без дефиса (то есть, если она содержится в моем списке с лемматизированными словами).Если он не содержится в моем списке (в настоящее время около 420 000 слов), я сам проверю, следует ли добавить его в мой список или написать с дефисом.

Это функция, которая выполняет эту работу:

 **function(sents, german_words, hyphened_words):**

 clutter = '[*!?,.;:_\s()\u201C\u201D\u201E\u201F\u2033\u2036\u0022]'
 sentences = list()
 new_hyphened_words = list()
 new_german_words = list()
 skip = False

 for i, sentence in enumerate(sents):
     if skip:
         skip = False
         continue
     new_sentence = ''
     words = sentence.split(' ')
     words = list(filter(None, words))
     new_words = list()      # words to make a correct sentence
     last_word = words[-1]
     last_word = last_word.strip()
     if last_word[-1] == '-':
         try:
             next_sentence = sents[i+1]
         except IndexError as e:
             raise e
         next_words = next_sentence.split(' ')
         next_words = list(filter(None, next_words))
         first_word = next_words[0]
         new_word = last_word[:-1] + first_word
         new_word = re.sub(clutter, '', word)
         if _is_url_or_mail_address(new_word):
             new_words = words[:-1] + [new_word] + next_words[1:]
             skip = True
             continue
         elif new_word in german_stopwords:
             new_words = words[:-1] + [new_word] + next_words[1:]
             skip = True
             continue
         elif new_word in german_words:
             new_words = words[:-1] + [new_word] + next_words[1:]
             skip = True
             continue
         else:
             new_word = last_word + first_word       # now with hyphen!
             new_word = re.sub(clutter, '', word)
             if new_word in hyphened_words:
                 new_words = words[:-1] + [new_word] + next_words[1:]
                 skip = True
                 continue
             else:           # found neither with nor without hyphen
                 with_hyphen = re.sub(clutter, '', last_word + first_word)
                 without_hyphen = re.sub(clutter, '', last_word[:-1] + first_word)
                 print(f'1: {with_hyphen}, 2: {without_hyphen}')
                 choose = input('1 or 2, or . if correction')
                 if choose == '1':
                     new_hyphened_words.append(with_hyphen)
                     new_words = words[:-1] + [last_word+first_word] + next_words[1:]
                     skip = True
                     continue
                 elif choose == '2':
                     new_german_words.append(without_hyphen)
                     new_words = words[:-1] + [last_word[:-1]+first_word] +\
                             next_words[1:]
                     skip = True
                     continue
                 else:
                     corrected_word = input('Corrected word: ')
                     print()
                     new_german_words.append(corrected_word)
                     print(f'Added to dict: "{corrected_word}"')
                     ok = input('Also add to speech? ./n')
                     if ok == 'n':
                         speech_word = input('Speech word: ')
                         new_words = words[:-1] + [speech_word] + next_words[1:]
                         skip = True
                         continue
                     else:
                         new_words = words[:-1] + [corrected_word] + next_words[1:]
                         skip = True
                         continue
     else:
         new_words = words

     new_sentence = ' '.join(w for w in new_words)
     sentences.append(new_sentence)

 return sentences

Списки "german_words" и "hyphened_words" обновляются время от времени, поэтому они содержат новые слова из предыдущих сессий.

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

...