Подтвердить что ты не робот

Пометка POS на немецком языке

Я использую NLTK для извлечения существительных из текстовой строки, начиная со следующей команды:

tagged_text = nltk.pos_tag(nltk.Text(nltk.word_tokenize(some_string)))

Он отлично работает на английском языке. Есть ли простой способ заставить его работать и на нем?

(У меня нет опыта программирования на естественном языке, но мне удалось использовать библиотеку python nltk, которая пока прекрасна.)

4b9b3361

Ответ 1

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

См. nltk.corpus.europarl_raw и этот ответ для примера конфигурации.

Также рассмотрите возможность пометить этот вопрос как "nlp".

Ответ 2

Библиотека шаблонов включает в себя функцию синтаксического анализа предложений на немецком языке, а результат включает теги части речи. Следующее скопировано из их документации:

from pattern.de import parse, split
s = parse('Die Katze liegt auf der Matte.')
s = split(s)
print s.sentences[0]

>>>   Sentence('Die/DT/B-NP/O Katze/NN/I-NP/O liegt/VB/B-VP/O'
     'auf/IN/B-PP/B-PNP der/DT/B-NP/I-PNP Matte/NN/I-NP/I-PNP ././O/O')

Если вы предпочитаете набор тегов SSTS, вы можете установить дополнительный параметр tagset="STTS".

Обновление. Другой вариант - просторный, в этой статье блога приведен краткий пример:

import spacy

nlp = spacy.load('de')
doc = nlp(u'Ich bin ein Berliner.')

# show universal pos tags
print(' '.join('{word}/{tag}'.format(word=t.orth_, tag=t.pos_) for t in doc))
# output: Ich/PRON bin/AUX ein/DET Berliner/NOUN ./PUNCT

Ответ 3

Отличия от части речи (POS) очень специфичны для определенного [естественного] языка. NLTK включает в себя множество разных тегов, которые используют различные методы для вывода тега данного токена в данный токен. Большинство (но не все) этих тегов используют статистическую модель рода, как основное или единственное устройство, чтобы "сделать трюк". Такие тегеры требуют некоторых "данных обучения", на которых можно построить это статистическое представление языка, а данные обучения поступают в виде корпусов.

"Распределение" NTLK включает в себя многие из этих корпусов, а также набор "читателей корпусов", которые предоставляют API для чтения разных типов корпусов. Я не знаю положения дел в НТЛК, и если это касается любого немецкого корпуса. Тем не менее, вы можете найти бесплатные бесплатные корпуса, которые затем вам нужно будет преобразовать в формат, который соответствует правильному считывателю корпусов NTLK, а затем вы можете использовать его для обучения тегов POS для немецкого языка.

Вы даже можете создать свой собственный корпус, но это чертовски кропотливая работа; если вы работаете в университете, вы должны искать способы подкупа и принуждать студентов делать это за вас;-)

Ответ 4

Возможно, вы можете использовать тэгер Стэнфорда POS. Ниже приводится рецепт, который я написал. Есть рецепты python для немецкого NLP, которые я скомпилировал, и вы можете получить к ним доступ на http://htmlpreview.github.io/?https://github.com/alvations/DLTK/blob/master/docs/index.html

#-*- coding: utf8 -*-

import os, glob, codecs

def installStanfordTag():
    if not os.path.exists('stanford-postagger-full-2013-06-20'):
        os.system('wget http://nlp.stanford.edu/software/stanford-postagger-full-2013-06-20.zip')
        os.system('unzip stanford-postagger-full-2013-06-20.zip')
    return

def tag(infile):
    cmd = "./stanford-postagger.sh "+models[m]+" "+infile
    tagout = os.popen(cmd).readlines()
    return [i.strip() for i in tagout]

def taglinebyline(sents):
    tagged = []
    for ss in sents:
        os.popen("echo '''"+ss+"''' > stanfordtemp.txt")
        tagged.append(tag('stanfordtemp.txt')[0])
    return tagged

installStanfordTag()
stagdir = './stanford-postagger-full-2013-06-20/'
models = {'fast':'models/german-fast.tagger',
          'dewac':'models/german-dewac.tagger',
          'hgc':'models/german-hgc.tagger'}
os.chdir(stagdir)
print os.getcwd()


m = 'fast' # It best to use the fast german tagger if your data is small.

sentences = ['Ich bin schwanger .','Ich bin wieder schwanger .','Ich verstehe nur Bahnhof .']

tagged_sents = taglinebyline(sentences) # Call the stanford tagger

for sent in tagged_sents:
    print sent

Ответ 5

Я написал блог-пост о том, как преобразовать немецкий аннотированный TIGER Corpus, чтобы использовать его с NLTK. Посмотрите здесь.