红楼梦文本数据分析

一、项目背景

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

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

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

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

二、项目实现步骤

(一)分词与停用词处理

  1. 文本数据的准备

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

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

我们使用 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` 列表中,以便后续处理。

  1. 加载自定义词库

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

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

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

  1. 读取停用词

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

复制代码
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()

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

1.读取和显示图像

cv.imread(firepath, flags=1)

读取图像

firepath 图像的路径

flags 图像的打开方式

返回值 返回一个图像对象,实际上是一个三维矩阵

cv.imwrite(firepath, img)

firepath 图像的保存路径

img 要保存的图像对象

flags参数 属性 含义

1 cv.IMREAD_COLOR 以彩色模式加载图像,任何图像的透明度都将被忽略,这是默认参数

0 cv.IMREAD_GRAYSCALE 以灰度模式加载图像

-1 cv.IMREAD_UNCHANGED 包括alpha通道的加载图像模式

flags可以是上述数字参数,也可以是上述属性

cv.imshow(winname, mat)

显示图像

winname 图像显示窗口的名称,字符串的形式

mat 要显示的图像对象

cv.waitKey(time)

图像的停留时间

time=0 时表示图像一直停留

cv.destroyAllWindows()

按任意键可以停止 waitKey(time) 的等待,并关闭所有图像

例:

复制代码
img = cv.imread("HappyFish.jpg", 1)
cv.imshow("HappyFish", img)
cv.waitKey(0)

2.图像的读取方式

在 OpenCV 中,读取和表达图像的方式是B-G-R通道,(Blue-Green-Red)

在 OpenCV 中,图像对象实际上是一个 M×N×3 的三维矩阵,数据类型一般为 uint8 0, 255,如图所示:

例:分别显示出一张彩色图像的 B-G-R 灰度 0, 255

复制代码
img = cv.imread("HappyFish.jpg", 1)

# B
img_b = img[:, :, 0]
# G
img_g = img[:, :, 1]
# R
img_r = img[:, :, 2]
cv.imshow("B", img_b)
cv.imshow("G", img_g)
cv.imshow("R", img_r)
# 原图
cv.imshow("img", img)

此外,在 Matplotlib 中,读取和表达图像的方式是R-G-B通道,显然,如果想要使 OpenCV 打开的图像通过 Matplotlib 来表达,就需要通道的转换,很显然,B-G-R通道 ⇨ R-G-B通道 的转换,只需要将一维矩阵中的元素反转即可

img:, :, ::-1

对图像对象进行通道转换,即一维矩阵的反转

img:, ::-1, :

对图像进行列翻转,即对图像进行水平翻转

img::-1, :, :

对图像进行行翻转,即对图像进行竖直翻转

注:还可以多处进行 ::-1 处理

plt.imshow(img, cmap=)

使用 Matplotlib 来显示图像,通道:R-G-B

img 要显示的图像

cmap= 图像显示的颜色图谱

plt.show()

显示图像

cmap参数 含义

plt.cm.autumn 红-橙-黄

plt.cm.bone 黑-白,x线

plt.cm.cool 青-洋红

plt.cm.copper 黑-铜

plt.cm.flag 红-白-蓝-黑

plt.cm.gray 黑-白

plt.cm.hot 黑-红-黄-白

plt.cm.hsv hsv颜色空间, 红-黄-绿-青-蓝-洋红-红

plt.cm.inferno 黑-红-黄

plt.cm.jet 蓝-青-黄-红

plt.cm.magma 黑-红-白

plt.cm.pink 黑-粉-白

plt.cm.plasma 绿-红-黄

plt.cm.prism 红-黄-绿-蓝-紫-...-绿模式

plt.cm.spring 洋红-黄

plt.cm.summer 绿-黄

plt.cm.viridis 蓝-绿-黄

plt.cm.winter 蓝-绿

复制代码
img_cv = cv.imread("HappyFish.jpg", 1)
img_plt = img_cv[:, :, ::-1]

# 原图在OpenCV中的显示
cv.imshow("img_cv", img_cv)
# 反转图在OpenCV中的显示
cv.imshow("img_plt_in_cv", img_plt)

# 反转图在Matplotlib中显示
plt.imshow(img_plt)
plt.show()

cv.waitKey(0)
cv.destroyAllWindows()

二、绘制几何图形

cv.line(img, start, end, color, thickness, lineType)

绘制直线

img 要绘制直线的图像

start, end 直线的起点和终点

color 直线的颜色,用(B, G, R)表示

thickness 线条宽度

lineType 线条类型

cv.circle(img, centerpoint, radius, color, thickness, lineType)

绘制圆形

img 要绘制圆形的图像

centerpoint, radius 圆形的圆心和半径

color 线条的颜色,用(B, G, R)表示

thickness 线条宽度,为-1时生成闭合的图案并填充线条颜色

lineType 线条类型

cv.rectangle(img, leftupper, rihtdown, color, thickness, lineType)

绘制矩形

img 要绘制矩形的图像

leftupper, rightdown 矩形的左上角和右下角坐标

color 线条的颜色,用(B, G, R)表示

thickness 线条宽度,为-1时生成闭合的图案并填充线条颜色

lineType 线条类型

cv.putText(img, text, station, font, fontsize, color, thickness, cv.LINE_AA)

向图像中添加文字

img 要添加文字的图像

text 要写入的文本内容

station 文本的放置位置

font 字体

fontsize 字体大小

color 线条的颜色,用(B, G, R)表示

thickness 线条宽度

cv.LINE_AA 一种线条类型

复制代码
# 创建一个全黑的三维矩阵作为图像对象
img = np.zeros((512, 512, 3), np.uint8)
# 绘制图形
cv.line(img, (0, 0), (511, 511), color=(255, 0, 0), thickness=5)
cv.rectangle(img, (384, 0), (510, 128), color=(0, 255, 0), thickness=3)
cv.circle(img, (447, 63), radius=63, color=(0, 0, 255), thickness=-1)
# 添加字体
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img, "OpenCV", (10, 500), font, 4, (255, 255, 255), thickness=2, lineType=cv.LINE_AA)
# 显示图像
plt.imshow(img[:, :, ::-1])
plt.title("result"), plt.xticks([]), plt.yticks([])
plt.show()
三、其他图像操作

前面已经提到,图像对象实际上是一个三维矩阵,因此我们可以通过对三维矩阵的操作来实现对图像的操作

1.获取并修改图像中的像素点

当我们只指定图像对象的行、列下标时,我们就可以获得图像的B-G-R的1×3一维数组

相关推荐
SelectDB38 分钟前
从 StarRocks 走向 Apache Doris:如何实现引擎平滑替换与架构升级?
大数据·数据库·数据分析
总要学点什么2 小时前
第79篇:数据可视化-模拟迁徙效果——把三十条航线画成会飞的弧
3d·信息可视化·数据挖掘·数据分析·gis·webgl·cesium
Apok'4 小时前
零基础学Python量化(1):研究大纲与流程
python·机器学习·金融·数据挖掘·数据分析
benchmark_cc5 小时前
如何为 QuantDash Python SDK 编写一个最小化的连接验证脚本?
python·数据分析·pandas·量化交易·股票数据·quantdash
STLearner6 小时前
KDD 2026 | (2月轮)时空数据(Spatial-Temporal)论文总结时空【下】(人群移动,城市科学(资源调度,)
大数据·人工智能·python·深度学习·机器学习·语言模型·数据挖掘
效率工作实验室9 小时前
商业智能报告趋势解析:标准化报告为何正被个性化分析取代
数据分析·agent·商业智能报告·标准化报告·个性化分析
钱工的门窗技术笔记9 小时前
铝木复合门窗中木材的角色分类与界面可分解性:结构判定、失效路径与维护设计
网络·物联网·数据分析
机器学习之心9 小时前
电池SOH估计和RUL预测,五个时间特征 + 基于GPR高斯过程回归的锂电池健康状态估计和剩余寿命预测
人工智能·数据挖掘·回归·锂电池健康状态估计·剩余寿命预测
benchmark_cc1 天前
量化开发中,什么时候应该停止手动下载股票数据?
python·数据分析·pandas·量化交易·1024程序员节·股票数据·quantdash
fastjson_1 天前
可视化工具 — DataGear
数据分析