基于 Python 的《红楼梦》文本分析:分词、停用词处理与 TF-IDF 关键词提取

自然语言处理(NLP)在文学作品分析中具有广泛的应用,从简单的文本统计到复杂的情感分析和主题建模。本文将通过一个完整的实践案例——对《红楼梦》文本进行分词、停用词处理以及 TF-IDF 关键词提取,展示如何利用 Python 及其强大的库来实现这些功能。我们将逐步解析代码逻辑,并探讨如何从文本数据中提取有价值的信息。

 一、项目背景

《红楼梦》是中国古典文学的巅峰之作,其丰富的语言和复杂的人物关系为文本分析提供了绝佳的素材。在本次项目中,我们将通过 Python 实现以下目标:

  1. 分词与停用词处理:对《红楼梦》文本进行分词,并去除无意义的停用词。

  2. TF-IDF 关键词提取:计算每个章节的 TF-IDF 值,并提取关键词。

通过这些步骤,我们可以更好地理解《红楼梦》的文本结构,挖掘其主题和核心内容。

二、项目实现步骤

(一)分词与停用词处理

1. 文本数据的准备

我们将《红楼梦》的文本按卷分割,存储在文件夹中,每个卷的内容保存为一个单独的文本文件。这样可以方便我们后续对每个卷分别进行处理。

2. 遍历文件夹并读取文本内容

我们使用 os.walk 方法遍历存储《红楼梦》文本的文件夹,获取每个卷的文件路径,并读取其内容。以下是实现代码的关键部分:

filePaths = []  # 保存文件的路径
fileContents = []  # 保存文件路径对应的内容

# 遍历文件夹中的所有文件
for root, dirs, files in os.walk(r"D:\Users\妄生\PycharmProjects\机器学习pythonProject\.idea\红楼梦\分卷"):
    for name in files:
        filePath = os.path.join(root, name)  # 获取每个文件的路径
        print(filePath)
        filePaths.append(filePath)  # 卷文件路径添加到列表中
        with open(filePath, 'r', encoding='utf-8') as f:
            fileContent = f.read()  # 读取文件内容
        fileContents.append(fileContent)  # 文件内容添加到列表中


通过上述代码,我们将所有卷的文件路径和内容分别存储在 `filePaths` 和 `fileContents` 列表中,以便后续处理。

3. 加载自定义词库

由于《红楼梦》中存在一些特定的词汇,这些词汇可能不在 jieba 的默认词库中。为了提高分词的准确性,我们需要加载自定义词库。我们使用 jieba.load_userdict 方法加载自定义词库:

jieba.load_userdict(r"D:\Users\妄生\PycharmProjects\机器学习pythonProject\.idea\红楼梦\红楼梦词库.txt")

这一步确保了 `jieba` 在分词时能够正确识别《红楼梦》中的专有名词、成语等词汇。

4. 读取停用词

停用词是指在文本中频繁出现但对文本意义贡献较小的词汇,如“的”“是”“和”等。在文本分析中,去除停用词可以减少噪声,提高分析效果。我们从文件中读取停用词列表,并将其存储为一个集合,以便后续快速查找:

stopwords = pd.read_csv(r"D:\Users\妄生\PycharmProjects\机器学习pythonProject\.idea\红楼梦\StopwordsCN.txt",
                        encoding='utf8', engine='python', index_col=False)
stopwords = set(stopwords['stopword'].values)
5. 分词与停用词过滤
file_to_jieba = open(r'D:\Users\妄生\PycharmProjects\机器学习pythonProject\.idea\红楼梦\分词后汇总.txt', 'w', encoding='utf-8')
for index, row in corpos.iterrows():
    juan_ci = ''  # 空的字符串
    fileContent = row['fileContent']
    segs = jieba.cut(fileContent)  # 对文本内容进行分词
    for seg in segs:  # 遍历每一个词
        if seg not in stopwords and len(seg.strip()) > 0:  # 剔除停用词和空字符
            juan_ci += seg + ' '
    file_to_jieba.write(juan_ci + '\n')
file_to_jieba.close()


通过上述代码,我们将每个卷的内容分词后,去除停用词,并将结果写入到一个汇总文件中。

6.运行结果

二)TF-IDF 关键词提取

1. 读取分词后的文本

我们将分词后的文本内容读取到内存中,以便进行 TF-IDF 计算:

inFile = open(r"D:\Users\妄生\PycharmProjects\机器学习pythonProject\.idea\红楼梦\分词后汇总.txt", 'r', encoding='utf-8')
corpus = inFile.readlines()  # 返回一个列表,每个元素是一行内容,即一篇分词后的文章

2. 计算 TF-IDF 值

我们使用 sklearn.feature_extraction.text.TfidfVectorizer 来计算 TF-IDF 值。以下是实现代码的关键部分

vectorizer = TfidfVectorizer()  # 初始化 TF-IDF 向量器
tfidf = vectorizer.fit_transform(corpus)  # 计算 TF-IDF 值
wordlist = vectorizer.get_feature_names_out()  # 获取特征名称(所有词)
3. 提取关键词

我们遍历每篇文档,提取 TF-IDF 值最高的关键词。以下是实现代码的关键部分:

df = pd.DataFrame(tfidf.T.todense(), index=wordlist)  # 将 TF-IDF 值转换为 DataFrame

# 遍历每篇文档,提取关键词
for i, doc in enumerate(corpus, start=1):
    featurelist = tfidf[i - 1, :].toarray()[0]  # 获取第 i 篇文档的 TF-IDF 值
    resdict = {word: featurelist[j] for j, word in enumerate(wordlist)}  # 创建词和 TF-IDF 值的映射
    sorted_resdict = sorted(resdict.items(), key=lambda x: x[1], reverse=True)  # 按 TF-IDF 值降序排序

    # 输出每篇文档的关键词
    print(f"第 {i} 回的核心关键词:")
    for word, tfidf_value in sorted_resdict[:10]:  # 输出前 10 个关键词
        print(f"{word}: {tfidf_value:.10f}")

通过上述代码,我们成功提取了每篇文档的关键词,并按 TF-IDF 值降序排列。

4.运行结果

三、项目成果

经过上述步骤,我们成功完成了对《红楼梦》文本的分词、停用词处理以及 TF-IDF 关键词提取。生成的分词后汇总文件可以用于后续的文本分析任务,如情感分析、主题建模等。通过 TF-IDF 关键词提取,我们能够快速了解每篇文档的核心内容,为进一步的文学研究提供了有力支持。

四、总结与展望

本文通过一个具体的实践案例,展示了如何使用 Python 进行文本预处理和关键词提取。通过对《红楼梦》文本的分词、停用词处理以及 TF-IDF 关键词提取,我们不仅加深了对文本分析流程的理解,还掌握了使用 Python 及其相关库进行文本处理的具体方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值