
期中大作业报告
目录
期中大作业报告
目录
环境搭建
项目结构
后端
前端
架构图
数据挖掘算法
词库提取
近义词挖掘
词语聚类和主题挖掘
诗歌与词语的匹配度
基于影响力的诗歌离线排名
具体代码实现
作业展示
数据挖掘示例:词表
数据挖掘示例:近义词
数据挖掘示例:聚类和主题词
数据挖掘示例:诗歌匹配度
表一:只考虑近义词模型
表二:只考虑主题词模型
表三:综合考虑三方面因素
服务端示例:FastAPI 接口
前端示例
主页
搜索页
诗歌详情页
诗歌相似作品
诗人详情页
诗人作品
知识图谱
移动端页面
在线演示
环境搭建
后端开发环境为 Python 3.8.11,可在 Python 3.7 到 3.9 上运行。离线计算部分的依赖包见
backend/lab/requirements.txt ,在线服务部分的依赖包见
backend/server/requirements.txt 。

语料来自于 Github 项目 chinese-poetry ,出于压缩文件的原因,原始语料未包含在打包中。可以克隆
此项目,置于 backend/lab/chinese-poetry 文件夹中。
后端依赖于 neo4j 数据库以及 neo4j 的 gds 拓展。实际使用版本的是 neo4j 4.3.6 和 gds 1.7.2。
前端开发环境为 Node.js 16.5.0,需要的依赖包见 frontend/poem-tang/package.json 。在
frontend/poem-tang 文件夹内,使用 yarn install 可一键完成环境配置。
项目结构
项目结构如图:
后端
后端分为两部分:离线计算和在线服务。
离线计算负责对数据集进行清洗和分析,从古诗中提取词库,挖掘词语之间的近义词关系,评价词语和
古诗的匹配度,对古诗进行排名,并将结果写入 neo4j 数据库中。这一部分运行在开发环境中,不在服
务器上运行。代码见 backend/lab/process.ipynb 。
在线服务运行在服务器上,负责从数据库中读取数据,并对外提供 HTTP 接口。代码见
backend/server/ 文件夹。
前端
前端采用 React 开发,负责从服务端提供的接口中获取数据,并向用户展示。代码见 frontend/poem-
tang/ 文件夹。
├── backend # 后端
│ ├── lab # 离线计算(关系挖掘,数据库写入)
│ │ ├── data # 数据集
│ │ │ └
│ │ ├── process.ipynb
│ │ └── requirements.txt
│ └── server # 在线服务(读取数据库,提供接口)
│ ├── init.py
│ ├── graph.py
│ ├── wds.txt
│ └── requirements.txt
└── frontend # 前端
└── poemtang
├── src # React 页面及组件
│ ├──components
│ │ └
│ ├──scripts
│ │ └
│ ├──App.js
│ └──
├── public
│ └
├──package.json
└──

React + Ant Design
数据挖掘算法
以下记 为所有词语的集合, 为所有诗歌的集合。对于 , ,记 表示词语
在诗歌 中出现。
词库提取
利用 gensim 包提供的 FastText 模型,逐字训练 n-gram 向量与字向量。
然后提取出所有古诗中的二到四字组合,利用 FastText 模型得到词向量 。词向量的长度可以表示
词语的相对概率,由此得到每个词语的评分:
其中 是词频。
保留 最高的若干个词语,得到词表。
提取结果见 backend/server/wds.txt 。
近义词挖掘
根据词语的共现关系,建立共现图。认为在同一首诗中共同出现即为共现。
此时,共现图的邻接矩阵的每一行可以认为是词语的一个特征向量。对整个邻接矩阵使用 PCA 降维,得
到每个词语的词向量。
计算词语间的两两的余弦相似度,取每个词语的前10作为近义词。
词语聚类和主题挖掘
按照近义词关系,建立近义词网络。利用 Louvain 算法进行聚类,得到若干个类 ,作为词语所属的
主题。

对每一类中的词语,运行 PageRank 算法,将不同词语在主题中的中心度作为重要程度。
诗歌与词语的匹配度
根据近义词与主题词模型,分别可以计算一首诗与某一个词语的匹配度。
近义词模型认为,一首诗包含某个词语的近义词越多,这首诗和这个词的匹配度越高。优点是计算结果
较精确,缺点是可应用的词语范围较窄,对于近义词未在诗中出现的词,无法计算匹配度。
主题词模型认为,一首诗包含某个主题的词在这个主题中的重要程度越高,这首诗越贴合这个主题,与
这个主题中的词语的匹配度越高。优点是可应用的词语范围广,缺点是不够精确,对同一主题中词语区
分不足。
最终的匹配度是二者的加权平均:
基于影响力的诗歌离线排名
按照诗歌所包含词语的相似性,来判断诗歌的相似性。取诗歌中所有词语的词向量之和作为诗歌向量,
利用 PCA 对诗歌向量进行特征提取后,按照余弦相似度排序,取每首诗的前16个作为相似诗歌,构建相
似网络。
认为诗歌在相似网络中的 PageRank 越高,诗歌的影响力越高。
以此为依据,计算给定词语时,搜索结果中诗歌的最终得分:
具体代码实现
数据挖掘部分见 backend/lab/process.ipynb 。其中 PCA 算法采用了 scikit-learn 包的实现,
Louvain 算法及 PageRank 算法采用了 neo4j 数据库的拓展 gds 提供的算法。
在本地将数据分析完毕后,存入 neo4j 数据库中。服务器上的服务端负责从 neo4j 中读取数据(见
backend/server/graph.py ),并提供接口。