红楼梦文本数据分析

一、项目背景

《红楼梦》是中国古典文学的巅峰之作,其丰富的语言和复杂的人物关系为文本分析提供了绝佳的素材。在本次项目中,我们将通过 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一维数组

相关推荐
人工智能培训4 小时前
10分钟了解向量数据库(4)
人工智能·机器学习·数据挖掘·深度学习入门·深度学习证书·ai培训证书·ai工程师证书
Lun3866buzha7 小时前
手机类型识别与分类_功能手机_折叠手机_滑盖手机_智能手机检测方法
智能手机·分类·数据挖掘
Lun3866buzha7 小时前
轮胎胎面花纹识别与分类:基于solo_r50_fpn模型的实现与优化
人工智能·分类·数据挖掘
Lun3866buzha8 小时前
基于FCOS和HRNet的易拉罐缺陷检测与分类系统:实现工业质检自动化,提升检测精度与效率_1
分类·数据挖掘·自动化
沐墨染8 小时前
敏感词智能检索前端组件设计:树形组织过滤与多维数据分析
前端·javascript·vue.js·ui·数据挖掘·数据分析
YangYang9YangYan9 小时前
2026大专计算机专业学数据分析的实用性与前景分析
数据挖掘·数据分析
海天一色y9 小时前
基于Resnet50预训练模型实现CIFAR-10数据集的分类任务
人工智能·分类·数据挖掘
Carl_奕然19 小时前
【数据挖掘】数据挖掘必会技能之:A/B测试
人工智能·python·数据挖掘·数据分析
数据智研1 天前
【数据分享】(2005–2016年)基于水资源承载力的华北地区降水与地下水要素数据
大数据·人工智能·信息可视化·数据分析
UrbanJazzerati1 天前
解码数据分布:茎叶图和箱形图初学者指南
面试·数据分析