在使用spaCy时,如何同时删除停止词和柠檬化?

2024-04-28 13:12:35 发布

您现在位置:Python中文网/ 问答频道 /正文

当我使用spaCy清理数据时,我运行以下行:

df['text'] = df.sentence.progress_apply(lambda text: " ".join(token.lemma_ for token in nlp(text) if not token.is_stop and token.is_alpha))

如果文本行中的每个单词不是停止词,则将其进行柠檬化。问题是,在检查令牌是否为停止字后,text.lemma u应用于令牌。因此,如果停止词不是柠檬化形式,它将不会被视为停止词。例如,如果我将“friend”添加到停止词列表中,如果原始标记是“friends”,则输出仍将包含“friend”。简单的解决办法是运行这条线两次。但这听起来很傻。任何人都可以提出一个解决方案,在第一次运行时删除没有柠檬化形式的停止词

谢谢


Tags: 数据lambdatextfriendtokendfspacyis
1条回答
网友
1楼 · 发布于 2024-04-28 13:12:35

您只需检查token.lemma_是否存在于nlp.Defaults.stop_words中:

if token.lemma_.lower() not in nlp.Defaults.stop_words

例如:

df['text'] = df.sentence.progress_apply(
    lambda text: 
        " ".join(
            token.lemma_ for token in nlp(text)
                if token.lemma_.lower() not in nlp.Defaults.stop_words and token.is_alpha
        )
)

请参阅快速测试:

>>> import spacy
>>> nlp = spacy.load("en_core_web_sm")

>>> nlp.Defaults.stop_words.add("friend") # Adding "friend" to stopword list

>>> text = "I have a lot of friends"
>>> " ".join(token.lemma_ for token in nlp(text) if not token.is_stop and token.is_alpha)
'lot friend'

>>> " ".join(token.lemma_ for token in nlp(text) if token.lemma_.lower() not in nlp.Defaults.stop_words and token.is_alpha)
'lot'

如果将大写单词添加到stopword列表中,则需要使用if token.lemma_.lower() not in map(str.lower, nlp.Defaults.stop_words)

相关问题 更多 >