28

我正在使用 NLTK 从以以下命令开头的文本字符串中提取名词:

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

它在英语中运行良好。有没有一种简单的方法让它也适用于德语?

(我没有自然语言编程的经验,但我设法使用了迄今为止很棒的 python nltk 库。)

4

6 回答 6

22

自然语言软件通过利用语料库和它们提供的统计数据来发挥它的魔力。您需要告诉 nltk 一些德语语料库,以帮助它正确标记德语。我相信EUROPARL语料库可能会帮助您前进。

有关示例配置,请参见nltk.corpus.europarl_raw此答案

另外,考虑用“nlp”标记这个问题。

于 2009-10-28T20:46:26.147 回答
17

Pattern 库包括一个解析德语句子的功能,结果包括词性标签。以下是从他们的文档中复制的:

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"

更新:另一个选项是spacy,这篇博客文章中有一个简单的例子:

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
于 2013-03-07T17:53:59.817 回答
4

词性 (POS) 标记非常特定于特定的 [自然] 语言。NLTK 包含许多不同的标记器,它们使用不同的技术来推断给定标记中给定标记的标记。这些标记器中的大多数(但不是全部)都使用某种统计模型作为主要或唯一的设备来“完成任务”。这样的标注器需要一些“训练数据”来构建语言的这种统计表示,并且训练数据以语料库的形式出现。

NTLK“发行版”本身包括许多这样的语料库,以及一组“语料库阅读器”,它们提供了一个 API 来读取不同类型的语料库。我不知道 NTLK 本身的情况,如果这包括任何德国语料库。但是,您可以找到一些免费的免费语料库,然后您需要将其转换为满足适当 NTLK 语料库阅读器的格式,然后您可以使用它来训练德语的 POS 标注器。

你甚至可以创建自己的语料库,但这是一项非常艰苦的工作;如果你在大学工作,你必须想办法贿赂或强迫学生为你做这件事;-)

于 2009-10-28T21:04:59.717 回答
4

可能你可以使用 Stanford POS tagger。下面是我写的食谱。我已经编译了德语 NLP 的 python 食谱,您可以在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's 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
于 2013-12-28T15:40:11.767 回答
2

我写了一篇关于如何转换德语注释的 TIGER 语料库以便将其与 NLTK 一起使用的博客文章。看看这里。

于 2011-01-21T12:01:33.477 回答
0

回答这个问题似乎有点晚了,但它可能对任何像我一样通过谷歌搜索发现这个问题的人有所帮助。所以我想分享我发现的东西。

HannoverTagger可能是此任务的有用工具。您可以在此处此处(德语)找到教程​​,但第二个是德语的。

如果您需要所有标签的完整列表,标记器似乎使用STTS Tagset 。

于 2022-01-05T10:05:04.680 回答