使用spaCy对DataFrame数据移除停用词时报AttributeError如何解决
问题修复方案
报错原因
你定义的tokenize函数直接返回了分词后每个token的text属性(字符串类型),只有spaCy原生的Token对象才有is_stop属性,字符串不存在该属性,因此触发AttributeError。
解决方案
这里提供两种可直接使用的修改方案:
方案1:调整停用词移除逻辑,保留原有分词列
如果需要继续保留单独的tokenizing列存储分词后的字符串列表,可直接调用spaCy内置的印尼语停用词集合做判断,仅修改stopwords_remover函数即可:
import pandas as pd from spacy.lang.id import Indonesian nlp = Indonesian() # 提前获取spaCy内置的印尼语停用词集合 stop_words = nlp.Defaults.stop_words data = [ 'Aku suka sekali beradai di wilayah yang dingin', 'Kembali jika terjadi sesuatu di sana', 'Sampai berapa lama kamu akan pergi dari sini', ] df = pd.DataFrame({'text': data}) df['text'] = df['text'].str.lower() # Tokenizing 逻辑保持不变 def tokenize(word): return [token.text for token in nlp(word)] df['tokenizing'] = df['text'].apply(tokenize) # 修改停用词移除函数,直接用停用词集合判断 def stopwords_remover(words): return [word for word in words if word not in stop_words] df['stopwords'] = df['tokenizing'].apply(stopwords_remover) df
方案2:合并分词与停用词判断逻辑,减少重复计算
如果不需要严格拆分分词和停用词移除步骤,可直接在同一步处理两个逻辑,运行效率更高:
import pandas as pd from spacy.lang.id import Indonesian nlp = Indonesian() data = [ 'Aku suka sekali beradai di wilayah yang dingin', 'Kembali jika terjadi sesuatu di sana', 'Sampai berapa lama kamu akan pergi dari sini', ] df = pd.DataFrame({'text': data}) df['text'] = df['text'].str.lower() # 分词同时过滤停用词,直接返回过滤后的字符串列表 def tokenize_and_remove_stopwords(word): return [token.text for token in nlp(word) if not token.is_stop] df['tokenizing'] = df['text'].apply(lambda x: [token.text for token in nlp(x)]) df['stopwords'] = df['text'].apply(tokenize_and_remove_stopwords) df
内容的提问来源于stack exchange,提问作者caeruleum
相关产品推荐
相关产品推荐

