用Spacy在德语中进行小写词形还原

4
似乎在德语中使用spacy时,名词单数化存在问题。Spacy似乎依赖于将单词大写以将其识别为名词。例如:
import spacy
nlp = spacy.load("C:\\Users\\somepath\\spacy\\de_core_md\\de_core_news_md\\de_core_news_md-2.2.5")

def lemmatize_text(text):
    """returns the text with each word in its basic form"""
    doc = nlp(text)
    return [word.lemma_ for word in doc]

lemmatize_text('Das Wort Tests wird erkannt. Allerdings werden tests nicht erkannt')
--> ['der', 'Wort', 'Test', 'werden', 'erkennen', '.', 'Allerdings', 'werden', 'tests', 'nicht', 'erkennen']

# should say 'Test' for both sentences

如果我立即对原始文本进行词形还原,那就不会有问题。但是,我的预处理流程如下:

  1. 将文本转换为小写
  2. 去除标点符号
  3. 删除停用词
  4. 进行词形还原

上述步骤执行的顺序是否有推荐的顺序?

我没有先进行词形还原,因为句子开头的单词会被错误地识别:

lemmatize_text('Größer wird es nicht mehr. größer wird es nicht mehr.')
--> ['Größer', 'werden', 'ich', 'nicht', 'mehr', '.', 'groß', 'werden', 'ich', 'nicht', 'mehr', '.']

# should say 'groß' for both sentences
1个回答

3

虽然这是一个旧的帖子,但我仍希望能帮助那些正在寻找答案的人......

在我的内容词分析项目中,我将 !? 替换为句号,以便稍后使用它作为拆分点来获取整个句子。

然后,我将 6- 和 9- 形状的撇号 ’ ‘ 替换为竖直的 ',因为有时候它们会不知不觉地出现在我的文本扫描中,影响标记。

然后我使用 re.findall("[a-zA-ZÄÖÜäöüß]+\\'?[a-zA-ZÄÖÜäöüß]+\.?", s) 将包括缩略词和句子中的最后一个单词在内的任何单词提取到列表中。

然后我用空格将它们全部连接起来,以创建一个漂亮干净的文本。

对于德语标记,我使用 HanTa(汉诺威标注器)。 https://github.com/wartaal/HanTa/blob/master/Demo.ipynb 它似乎很擅长猜测大小写,即使它们都输入不正确,您可以在示例中看到。

安装:

 !pip install HanTa

示例:

from nltk import word_tokenize
from HanTa import HanoverTagger as ht

tagger = ht.HanoverTagger('morphmodel_ger.pgz')
sent = "die bäume Wurden große. wie geht's dir, Meinem freund?" 
tokenized_sentence = word_tokenize(sent)
tokens = tagger.tag_sent(tokenized_sentence, taglevel = 1)
for token in tokens:
    print(token[1] + ' / ' + token[2])

输出:

die ART
Baum NN
werden VAFIN
groß ADJA
-- $.
wie PWAV
gehen VVFIN
's PPER
dir PPER
-- $,
mein PPOSAT
Freund NN
-- $

如果你只需要内容单词:

  • 以“NN”开头的标签是名词
  • 以“V”开头的标签是动词
  • 以“ADJ”开头的标签是形容词
  • 以“ADV”开头的标签是副词

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接