0

I am trying to lemmatize and remove stopwords from a dataset of Dutch tweets in order to perform text analysis. The goal is to achieve the following structure: [['this','is','a','tweet],['this','is','a','tweet],['this','is','a','tweet]] Where then the stopwords are also removed.

The dataset is currently looking like this: [' Wanneer het niet mogelijk is om met de auto naar de teststraat te komen, kun je samen met een telefonisch medewerker de beste optie om je te laten testen bespreken. ^CM', 'De tweede stap in het versoepelen van de coronamaatregelen zetten we vandaag. Alleen als iedereen zich aan de maatregelen houdt, zetten we samen een stap vooruit.\n\nActuele informatie ⤵️\n\n', 'De tweede stap in het versoepelen van de coronamaatregelen zetten we vandaag. \n\nAlleen als iedereen zich aan de maatregelen houdt, zetten we samen een stap vooruit.\n\nActuele informatie ⤵️\n\n\nAlleenSamen ']

The code I wrote is this:

import pandas as pd
import re
import numpy as np
import pandas as pd
from pprint import pprint
import gensim
import gensim.corpora as corpora
from gensim.utils import simple_preprocess
from gensim.models import CoherenceModel
import pyLDAvis
import pyLDAvis.gensim
import matplotlib.pyplot as plt
from nltk.corpus import stopwords
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)

df = pd.read_excel (r"C:xxxxxxxxxxx")

print (df)

df2_clean = df['text'].replace('https.*[^ ]', '',regex=True) 
df2_clean = df2_clean.replace('@([^ ]*)', '',regex=True) 
df2_clean = df2_clean.replace('#', '',regex=True) 
df2_clean = df2_clean.replace('RT', '',regex=True)
df2_clean = df2_clean.replace('[0-9]+', '', regex=True)
df2_clean

tweets = [line for line in df2_clean]

tweets
import spacy
import nltk
from nltk.tokenize import RegexpTokenizer
from nltk.corpus import stopwords
nltk.download('wordnet')

stopword_list = stopwords.words('dutch') + 
['coronavirus','covid','corona']

#lemmatizer
def lemmatizer(x):
    
#lemmatize 
for x in x:
    doc = nlp(x)
    print(doc.text)
    for token in doc:
        lemmatized_list = [token.lemma_]
    cleaned_lemmas = [x for x in lemmatized_list if x not in stopword_list]
return cleaned_lemmas



lemmatizer(tweets)

The issue is that I dont get the form returned I want to;it returns like this

Wanneer het niet mogelijk is om met de auto naar de teststraat te komen, kun je samen met een telefonisch medewerker de beste optie om je te laten testen bespreken. ^CM
De tweede stap in het versoepelen van de coronamaatregelen zetten we vandaag. Alleen als iedereen zich aan de maatregelen houdt, zetten we samen een stap vooruit.

Actuele informatie ⤵️


De tweede stap in het versoepelen van de coronamaatregelen zetten we vandaag. 

Alleen als iedereen zich aan de maatregelen houdt, zetten we samen een stap vooruit.

Actuele informatie ⤵️


AlleenSamen 
De tweede stap in het versoepelen van de coronamaatregelen zetten we vandaag. Alleen als iedereen zich aan de maatregelen houdt, zetten we samen een stap vooruit.

Actuele informatie ⤵️


AlleenSamen 
Heb je klachten als neusverkoudheid, hoesten en/of verhoging. Blijf dan thuis en laat je testen op het coronavirus.

Bel het landelijke gratis telefoonnummer - en maak een testafspraak bij een GGD-locatie in de buurt.

It is not lemmatized, it is not in a list and also the stopwords are still there so the function does not work properly. Thanks in advance for your advice!

  • The code does not compile: *`NameError: name 'lemmas' is not defined`*. Also, `def lemmatizer(x)` syntax/indentation is wrong. Also, it looks as if you are using Spacy, but you have no `import` for it. – Wiktor Stribiżew May 12 '21 at 08:52
  • *`NameError: name 'nlp' is not defined`* - please add a complete reproducible example. Please also explain what the problem is. – Wiktor Stribiżew May 12 '21 at 09:02
  • I've moved some advice from an answer below to this comment: _People are more inclined to help when the post is well structured. For starts, your code snippet is incorrectly indented and formatted. Secondly, it would help if you explain what the issue is with your current code and what kind of output you expect._ – halfer May 12 '21 at 09:15

1 Answers1

0

This is an attempt that uses pipe for faster inference.

import spacy
from nltk.corpus import stopwords

stopword_list = stopwords.words('dutch') + ['coronavirus','covid','corona']

nlp = spacy.load("nl_core_news_sm")

def lemmatizer(texts):
    texts = [text.replace("\n", "").strip() for text in texts]
    docs = nlp.pipe(texts)
    cleaned_lemmas = [[t.lemma_ for t in doc if t.lemma_ not in stopword_list] for doc in docs]

    return cleaned_lemmas

tweets = [' Wanneer het niet mogelijk is om met de auto naar de teststraat te komen, kun je samen met een telefonisch medewerker de beste optie om je te laten testen bespreken. ^CM', 'De tweede stap in het versoepelen van de coronamaatregelen zetten we vandaag. Alleen als iedereen zich aan de maatregelen houdt, zetten we samen een stap vooruit.\n\nActuele informatie ⤵️\n\n', 'De tweede stap in het versoepelen van de coronamaatregelen zetten we vandaag. \n\nAlleen als iedereen zich aan de maatregelen houdt, zetten we samen een stap vooruit.\n\nActuele informatie ⤵️\n\n\nAlleenSamen ']
cleaned = lemmatizer(tweets)

print(cleaned)
halfer
  • 19,824
  • 17
  • 99
  • 186
Bram Vanroy
  • 27,032
  • 24
  • 137
  • 239