6

I have a German text that I want to apply lemmatization to. If lemmatization is not possible, then I can live with stemming too.

Data: This is my German text:

mails=['Hallo. Ich spielte am frühen Morgen und ging dann zu einem Freund. Auf Wiedersehen', 'Guten Tag Ich mochte Bälle und will etwas kaufen. Tschüss']

Goal: After applying lemmatization it should look similar to this:

mails_lemma=['Hallo. Ich spielen am früh Morgen und gehen dann zu einer Freund. Auf Wiedersehen', 'Guten Tag Ich mögen Ball und wollen etwas kaufen Tschüss']

I tried using spacy

conda install -c conda-forge spacy

python -m spacy download de_core_news_md

import spacy
from spacy.lemmatizer import Lemmatizer
lemmatizer = Lemmatizer()
[lemmatizer.lookup(word) for word in mails]

I see following problems.

  1. My data is structured in sentences and not single words

  2. In my case spacy lemmatization doesn't seem to work even for single words.

Can you please tell me how this works?

Community
  • 1
  • 1
PParker
  • 1,419
  • 2
  • 10
  • 25

2 Answers2

13

Just wrap it into a loop and get the lemma of each token:

import spacy
nlp = spacy.load('de_core_news_md')

mails=['Hallo. Ich spielte am frühen Morgen und ging dann zu einem Freund. Auf Wiedersehen', 'Guten Tag Ich mochte Bälle und will etwas kaufen. Tschüss']

mails_lemma = []

for mail in mails:
     doc = nlp(mail)
     result = ' '.join([x.lemma_ for x in doc]) 
     mails_lemma.append(result)

Output:

['hallo . ich spielen am früh Morgen und gehen dann zu einer Freund . Auf Wiedersehen ',
 'Guten tagen ich mögen Ball und wollen etwas kaufen . Tschüss']
cronoik
  • 15,434
  • 3
  • 40
  • 78
6

Using HanoverTagger library, you can do it this way: (see here for more detail)

first install HanTa using !pip install HanTa, and then

from HanTa import HanoverTagger as ht

tagger = ht.HanoverTagger('morphmodel_ger.pgz')

mails=['Hallo. Ich spielte am frühen Morgen und ging dann zu einem Freund. Auf Wiedersehen',
       'Guten Tag Ich mochte Bälle und will etwas kaufen. Tschüss']

mails_lemma = []
for mail in mails:
    lemma = [lemma for (word,lemma,pos) in tagger.tag_sent(mail.split())]
    mails_lemma.append(' '.join(lemma))
Maryam Bahrami
  • 1,056
  • 9
  • 18