<think>
我们注意到原程序在清理文本时,只使用了spaCy的英文停用词,而没有为中文设置停用词。因此,我们需要重新处理已经生成的CSV文件,对`cleaned_website_text`列进行中文停用词的过滤。
步骤:
1. 读取`data_with_cleaned_text.csv`文件。
2. 为中文停用词做准备:我们可以使用jieba的内置停用词列表,或者使用第三方停用词表(这里使用jieba自带的停用词表,并补充一些常见的停用词)。
3. 定义一个函数,专门用于中文文本的停用词过滤(注意:原始清理函数中已经处理了英文,这里我们主要针对中文部分进行二次过滤)。
4. 遍历每一行,对`cleaned_website_text`进行中文停用词过滤(注意:该列可能包含中英文混合的文本,但之前已经分过词,所以我们按空格分割后过滤)。
5. 注意:原清理函数已经将文本转换为小写,所以停用词表也需要使用小写。
6. 将处理后的结果保存回同一个CSV文件(覆盖原列)或者另存为新文件(这里我们选择覆盖原列并保存到新文件,以防万一)。
考虑:由于原程序可能已经进行了一些处理,我们重新处理时应该只针对中文停用词进行补充过滤。原清理函数已经做了以下事情:
- 过滤了停用词(英文)、标点、数字等。
- 英文词形还原。
- 统一小写。
现在的问题是中文停用词没有过滤,所以我们需要在已经分好的词(用空格分隔)中,去掉中文停用词。
具体步骤:
1. 加载中文停用词表(可以使用`jieba.analyse`中的停用词表,或者从文件加载。这里我们直接使用`jieba`自带的停用词表路径,但需要注意`jieba`可能没有默认下载停用词表,所以我们可以使用一个内置的停用词列表作为备选)。
2. 定义一个函数`filter_chinese_stopwords(text)`,接收一个字符串(由空格分隔的单词组成),然后移除其中的中文停用词。
3. 注意:文本中可能同时包含中英文,我们只需要移除中文停用词,英文停用词已经在之前被移除过了(但可能有遗漏?)。为了保险,我们也可以同时过滤英文停用词(但原程序已经过滤了一次,这里我们主要是补充中文停用词过滤,所以可以只过滤中文停用词)。
4. 处理后的文本重新用空格拼接。
但是,由于原清理函数已经进行了分词(中英文分开处理),我们重新处理时只需要按空格分割,然后过滤停用词。
另外,我们注意到原清理函数对中文的处理是直接使用jieba分词,然后每个词作为一个token(没有去掉停用词)。所以我们需要在重新处理时去掉这些停用词。
实现:
1. 使用jieba自带的停用词表:`stop_words = set(line.strip() for line in open('stop_words.txt', encoding='utf-8'))`,但是我们需要一个确切的停用词表路径。我们可以使用jieba默认的停用词表(如果有的话),或者使用一个通用的停用词表。
由于我们不知道jieba的停用词表具体在哪里,我们可以使用以下方法获取:
- 从网上下载一个常用的中文停用词表(如百度停用词表、哈工大停用词表等)
- 或者使用一个内置的停用词列表(这里为了简单,我们使用一个内置的列表,但考虑到通用性,我们使用jieba源码中提供的停用词表路径,不过需要先确定是否存在)
实际上,jieba没有自带停用词表文件,但通常我们会自己准备一个。因此,我们可以从网上下载一个,或者使用一个已有的停用词集合。
这里,我们使用一个折中的办法:使用`jieba.analyse`中的`STOP_WORDS`(如果可用)。但注意,这个停用词表可能不是完整的。
另外,我们可以直接使用一个在线的停用词表(比如在代码中内置一个常见的停用词列表)。但为了灵活性,我建议使用外部文件,并放在同一目录下(文件名:`chinese_stopwords.txt`)。如果文件不存在,则使用一个内置的停用词列表(从网络资源中获取的一些常见停用词)。
但是,题目中没有提供停用词表,所以我们需要自己内置一个较小的停用词列表作为备选,同时允许使用外部文件。
考虑到程序健壮性,我们这样做:
- 尝试从当前目录下的`chinese_stopwords.txt`文件加载停用词。
- 如果文件不存在,则使用一个内置的停用词列表(通过一个列表定义)。
内置停用词列表我们可以参考常用的一些停用词(如:的、了、是、在、我、你、他、和、等)。
由于我们无法保证内置停用词表完整,所以最好还是提供一个外部文件。但在代码中,我们将内置一个基础的中文停用词表。
具体代码步骤:
1. 定义重新处理文本的函数,包含中文停用词过滤。
2. 读取CSV文件。
3. 对每一行的`cleaned_website_text`列应用过滤函数。
4. 将结果保存到新的列或者替换原列(这里我们替换原列,并保存为新文件,以防出错)。
5. 保存修改后的DataFrame到新的CSV文件(例如:`data_with_cleaned_text_stopwords_removed.csv`)。
注意:原始清理文本可能为空(失败记录),需要跳过处理。
代码实现:
由于我们不确定原CSV文件是否有其他列,我们只修改`cleaned_website_text`列。
我们这样设计:
- 输入文件:`data_with_cleaned_text.csv`
- 输出文件:`data_with_cleaned_text_stopwords_removed.csv`
步骤:
1. 加载停用词表(从文件或内置列表)。
2. 读取CSV文件。
3. 对每一行,如果`cleaned_website_text`不为空,则进行中文停用词过滤。
4. 将过滤后的文本替换原来的文本。
5. 保存。
停用词过滤函数:
```python
def remove_stopwords(text, stopwords):
if not text or text.strip() == "":
return text
words = text.split()
# 过滤停用词
filtered_words = [word for word in words if word not in stopwords]
return " ".join(filtered_words)
```
停用词表加载:
```python
def load_stopwords(file_path="chinese_stopwords.txt"):
stopwords = set()
# 尝试从文件加载
if os.path.exists(file_path):
try:
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
word = line.strip()
if word:
stopwords.add(word)
except Exception as e:
print(f"加载停用词文件失败: {e}, 使用内置停用词表")
stopwords = get_builtin_stopwords()
else:
print(f"停用词文件 {file_path} 不存在,使用内置停用词表")
stopwords = get_builtin_stopwords()
return stopwords
def get_builtin_stopwords():
# 返回一个内置的停用词集合
builtin_stopwords = {"的", "了", "和", "是", "在", "我", "你", "他", "她", "它", "我们", "你们", "他们", "这", "那", "啊", "哦", "呢", "吧", "呀",
"自己", "什么", "怎么", "为什么", "可以", "因为", "所以", "但", "而", "并且", "或", "如果", "就", "则", "只", "也", "有", "没有",
"不", "要", "会", "能", "可能", "应该", "一定", "非常", "很", "更", "最", "太", "又", "再", "还", "没", "已经", "将", "已", "了",
"着", "过", "啊", "哦", "嗯", "唉", "啦", "吗", "么", "为", "为了", "与", "关于", "对", "对于", "中", "上", "下", "内", "外",
"之间", "之中", "之一", "等等", "等", "些", "个", "年", "月", "日", "时", "分", "秒", "点", "分钟", "小时", "天", "周", "星期",
"月份", "年份", "今天", "明天", "昨天", "前天", "后天", "去年", "明年", "上个月", "下个月", "这个", "那个", "这些", "那些", "这样",
"那样", "这里", "那里", "这时", "那时", "谁", "何时", "何地", "如何", "为什么", "哪个", "多少", "几", "第几", "每", "各", "每",
"所有", "任何", "一些", "全部", "部分", "其他", "其余", "另外", "其实", "实际上", "特别", "尤其", "例如", "比如", "诸如", "一些",
"一下", "一点", "一切", "一种", "一样", "一般", "一直", "一起", "一定", "一切", "一下", "一点", "一种", "一样", "一般", "一直",
"一起", "一定", "一切", "一下", "一点", "一种", "一样", "一般", "一直", "一起", "一定", "一切", "一下", "一点", "一种", "一样",
"一般", "一直", "一起", "一定", "一切", "一下", "一点", "一种", "一样", "一般", "一直", "一起", "一定", "一切", "一下", "一点"}
return builtin_stopwords
```
注意:内置停用词表可能不够全面,但可以作为一个基础。
最后,我们编写一个脚本执行上述过程。
考虑到原程序已经生成了CSV文件,我们重新处理该文件即可。
下面编写完整的代码:
</think>
为了解决中文停用词缺失的问题,我将编写一个程序来重新处理 CSV 文件中的 `cleaned_website_text` 列,添加中文停用词过滤功能:
```python
# -*- coding: utf-8 -*-
"""
脚本功能:重新处理CSV文件,添加中文停用词过滤
输入文件:data_with_cleaned_text.csv
输出文件:data_with_cleaned_text_chinese_stopwords_removed.csv
"""
import pandas as pd
import jieba
import os
# 中文停用词列表(可扩展)
CHINESE_STOPWORDS = {
'的', '了', '在', '是', '我', '你', '他', '她', '它', '我们', '你们', '他们',
'这', '那', '啊', '哦', '呢', '吧', '呀', '吗', '啦', '和', '与', '或', '而',
'并', '但', '就', '很', '非常', '太', '不', '没', '没有', '无', '非', '别',
'自己', '什么', '怎么', '为什么', '可以', '因为', '所以', '虽然', '即使',
'并且', '如果', '则', '只', '也', '有', '要', '会', '能', '可能', '应该',
'一定', '非常', '更', '最', '太', '又', '再', '还', '没', '已经', '将', '曾经'
}
def remove_chinese_stopwords(text):
"""移除中文停用词并重新拼接文本"""
if not isinstance(text, str) or text.strip() == "":
return text
# 使用jieba分词
words = jieba.lcut(text)
# 过滤停用词
filtered_words = [word for word in words if word not in CHINESE_STOPWORDS]
return " ".join(filtered_words)
def main():
input_file = "data_with_cleaned_text.csv"
output_file = "data_with_cleaned_text_chinese_stopwords_removed.csv"
# 检查输入文件是否存在
if not os.path.exists(input_file):
print(f"[错误] 输入文件 {input_file} 不存在!")
exit(1)
print(f"[处理] 正在读取输入文件: {input_file}")
try:
# 读取CSV文件
df = pd.read_csv(input_file, encoding="utf-8")
total_records = len(df)
print(f"[处理] 成功读取 {total_records} 条记录")
# 处理文本并更新cleaned_website_text列
print("[处理] 开始移除中文停用词...")
df["cleaned_website_text"] = df["cleaned_website_text"].apply(remove_chinese_stopwords)
# 保存到新文件
df.to_csv(output_file, index=False, encoding="utf-8")
print(f"[处理] 处理完成!结果已保存到: {output_file}")
# 统计成功/失败记录
success_count = df[df["cleaned_website_text"] != ""].shape[0]
print(f"\n[统计] 总记录数: {total_records}")
print(f"[统计] 成功处理数: {success_count}")
print(f"[统计] 空文本记录数: {total_records - success_count}")
except Exception as e:
print(f"[处理错误] 处理过程中发生错误: {str(e)}")
exit(1)
if __name__ == "__main__":
print("=" * 50)
print("中文停用词处理程序启动")
print("=" * 50)
main()
```
### 程序说明:
1. **中文停用词列表**:
- 预定义了常见中文停用词集合 `CHINESE_STOPWORDS`
- 可根据需要扩展该列表
2. **处理流程**:
- 读取 `data_with_cleaned_text.csv` 文件
- 对 `cleaned_website_text` 列应用停用词过滤:
- 使用 jieba 进行中文分词
- 过滤停用词后重新拼接文本
- 结果保存到新文件 `data_with_cleaned_text_chinese_stopwords_removed.csv`
3. **统计信息**:
- 输出处理前后的记录统计
- 区分有效文本和空文本记录
### 使用方法:
1. 确保安装了依赖库:`pip install pandas jieba`
2. 将脚本与 `data_with_cleaned_text.csv` 放在同一目录
3. 运行脚本即可生成处理后的文件