自然语言处理(NLP)在文学作品分析中具有广泛的应用,从简单的文本统计到复杂的情感分析和主题建模。本文将通过一个完整的实践案例——对《红楼梦》文本进行分词、停用词处理以及 TF-IDF 关键词提取,展示如何利用 Python 及其强大的库来实现这些功能。我们将逐步解析代码逻辑,并探讨如何从文本数据中提取有价值的信息。
一、项目背景
《红楼梦》是中国古典文学的巅峰之作,其丰富的语言和复杂的人物关系为文本分析提供了绝佳的素材。在本次项目中,我们将通过 Python 实现以下目标:
-
分词与停用词处理:对《红楼梦》文本进行分词,并去除无意义的停用词。
-
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 及其相关库进行文本处理的具体方法。