Передача значения в столбце в качестве параметра при применении с помощью стеммера снежного кома nltk

Передача df[language] работает для стоп-слов, но не для снежного кома. Есть ли способ обойти это?

Я пока не нашла никаких зацепок...

import nltk
from nltk.corpus import stopwords
import pandas as pd
import re

df = pd.DataFrame([['A sentence in English', 'english'], ['En mening på svenska', 'swedish']], columns = ['text', 'language'])

def tokenize(text):
    tokens = re.split('\W+', text)
    return tokens

def remove_stopwords(tokenized_list, language):
    stopword = nltk.corpus.stopwords.words(language)
    text = [word for word in tokenized_list if word not in stopword]
    return text

def stemming(tokenized_text, l):
    ss = nltk.stem.SnowballStemmer(l)
    text = [ss.stem(word) for word in tokenized_text]
    return text

df['text_tokenized'] = df['text'].apply(lambda x: tokenize(x.lower()))
df['text_nostop'] = df['text_tokenized'].apply(lambda x: remove_stopwords(x, df['language']))
df['text_stemmed'] = df['text_nostop'].apply(lambda x: stemming(x, df['language']))

Я ожидал, что это сделает снежный ком, используя английский и шведский языки в качестве языка, так же, как удаление стоп-слов. Я получаю сообщение error, как показано ниже:

ValueError: истинное значение серии неоднозначно. Используйте a.empty, a.bool(), a.item(), a.any() или a.all().


person Marcus Högenå Bohman    schedule 24.07.2019    source источник


Ответы (1)


Попробуйте это вместо этого.

df['text_stemmed']=df.apply(lambda x: stemming(x['text_nostop'], x['language']), axis=1)

Изменить: когда вы используете apply в определенном столбце, таком как df['text_tokenized'].apply(lambda x: ...), лямбда-функция применяется к x, то есть к каждой строке столбца text_tokenized, тогда как df['language'] применяется не к конкретной строке, а ко всей серии панд.

То есть, когда вы пытаетесь lambda x: remove_stopwords(x, df['language']), возвращаемое значение df['language'] не является определенным значением «языка» соответствующей строки, а вместо этого представляет собой серию pandas, содержащую как «английский», так и «шведский».

0    english
1    swedish

Поэтому ваш второй код с apply тоже должен быть изменен:

df['text_nostop'] = df.apply(lambda x: remove_stopwords(x['text_tokenized'], x['language']), axis=1)
person Coding4pho    schedule 29.08.2019
comment
Можете ли вы добавить объяснение для будущих читателей, почему ваш код решает проблему? - person barbsan; 29.08.2019