如何移除DataFrame中含版权符号©的句子?
代码问题分析及修复
核心问题1:遍历列表时直接修改列表,导致漏处理元素
你在遍历tokens列表的同时调用tokens.remove(sentence),这会打乱列表的遍历顺序。比如列表里有连续两个带©的句子,第一个被移除后,第二个会被跳过,根本不会被检查到,自然就留了下来。
核心问题2:DataFrame赋值逻辑错误
你用df['summaries'].loc[(df['summaries'] == i)] = final来更新值,一旦有重复的article_texts内容,会错误地把所有匹配行都改成同一个final;而且如果summaries列初始值和article_texts不一样,这个条件根本匹配不到,等于白改。
次要问题:异常处理太宽泛
except:会捕获所有异常,包括索引错误、空值错误等,你根本不知道代码哪里出了问题,调试起来完全抓瞎。
修复后的代码
用列表推导式过滤带©的句子,再用apply处理每一行,逻辑清晰还不会漏处理:
def remove_copyright_sentences(text): # 拆分句子(如果需要更准确的拆分可以用nltk的sent_tokenize,这里先按你的方式来) sentences = text.split(".") # 过滤掉含©的句子,同时去掉空字符串(避免拆分后出现空元素) filtered_sentences = [s.strip() for s in sentences if s.strip() and "©" not in s] # 重新拼接成段落 return ". ".join(filtered_sentences) # 对article_texts列处理后赋值给summaries列 df['summaries'] = df['article_texts'].apply(remove_copyright_sentences)
说明
- 列表推导式是一次性生成过滤后的列表,不会出现遍历修改原列表的问题,所有带©的句子都会被检查到并过滤。
apply方法直接对每一行的文本处理,准确对应每一行的赋值,不会出现匹配错误。- 去掉了宽泛的异常处理,真出问题能直接看到报错信息,方便调试。
内容的提问来源于stack exchange,提问作者Dawud Sayeed
相关产品推荐
相关产品推荐

