基于 TF-IDF 计算古诗之间的文本相似度
步骤
- 对每一首古诗进行分词
- 计算每一个词的 tfidf 值
- 利用每首古诗的词向量计算两首古诗之间的余弦相似度
import pandas as pd
import numpy as np
import picklepath = 'F:/1.csv'
df = pd.read_csv(path)
df.head()
_id | 标题 | 诗人 | 诗人id | 朝代 | 内容 | 译文 | 鉴赏 | 背景 | 古诗标签 | 古诗star数 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 关雎 | 佚名 | 0 | 先秦 | 关关雎鸠,在河之洲。窈窕淑女,君子好逑。\n参差荇菜,左右流之。窈窕淑女,寤寐求之。\n求之... | 译文\n关关和鸣的雎鸠,相伴在河中的小洲。那美丽贤淑的女子,是君子的好配偶。\n参差不齐的荇... | 《国风·周南·关雎》这首短小的诗篇,在中国文学史上占据着特殊的位置。它是《诗经》的第一篇,而... | 写作手法\n\n 这诗的主要表现手法是兴寄,《毛传》云:“兴也。”什么是“兴”?孔颖达的解... | 古诗三百首,初中古诗,诗经,爱情 | 14233 |
1 | 10 | 汝坟 | 佚名 | 0 | 先秦 | 遵彼汝坟,伐其条枚。未见君子,惄如调饥。\n遵彼汝坟,伐其条肄。既见君子,不我遐弃。\n鲂鱼... | 译文\n沿着汝河大堤走,采伐山楸那枝条。还没见到我夫君,忧如忍饥在清早。\n沿着汝河大堤走,... | 鉴赏\n\n 这在诗之首章,“遵彼汝坟,伐其条枚”——在高高的汝河大堤上,有一位凄苦的妇女... | 影响\n\n 相传为孔子编辑成书,集入西周至春秋中叶五百多年的作品305篇,分为风雅颂三个... | 诗经,思念 | 330 |
2 | 100 | 南山 | 佚名 | 0 | 先秦 | 南山崔崔,雄狐绥绥。鲁道有荡,齐子由归。既曰归止,曷又怀止?\n葛屦五两,冠緌双止。鲁道有荡... | 译文\n南山巍峨高峻,雄狐缓步独行。鲁国大道宽阔,文姜由此嫁人。既然嫁给鲁君,为何思念难禁?... | 鉴赏\n\n 作者开篇描写雄狐对伴侣的渴望,用意在于影射齐襄公对文姜的觊觎之心。作者以南山... | 创作背景\n\n 春秋时期,齐国和鲁国联姻,齐襄公的同父异母妹妹文姜被嫁给了鲁桓公,但文姜... | 诗经,怨刺 | 72 |
3 | 1000 | 舞曲歌辞。中和乐舞词 | 佚名 | 0 | 唐代 | 芳岁肇佳节,物华当仲春。乾坤既昭泰,烟景含氤氲。 \n德浅荷玄贶,乐成思治人。前庭列钟鼓,广... | NaN | NaN | NaN | NaN | 2 |
4 | 10000 | 与从弟正字、从兄兵曹宴集林园 | 李嘉祐 | 760 | 唐代 | 竹窗松户有佳期,美酒香茶慰所思。辅嗣外生还解易, \n惠连群从总能诗。檐前花落春深后,谷里莺... | NaN | NaN | NaN | NaN | 1 |
数据清洗
content_s = df['内容']
content_s.head()
0 关关雎鸠,在河之洲。窈窕淑女,君子好逑。\n参差荇菜,左右流之。窈窕淑女,寤寐求之。\n求之...
1 遵彼汝坟,伐其条枚。未见君子,惄如调饥。\n遵彼汝坟,伐其条肄。既见君子,不我遐弃。\n鲂鱼...
2 南山崔崔,雄狐绥绥。鲁道有荡,齐子由归。既曰归止,曷又怀止?\n葛屦五两,冠緌双止。鲁道有荡...
3 芳岁肇佳节,物华当仲春。乾坤既昭泰,烟景含氤氲。 \n德浅荷玄贶,乐成思治人。前庭列钟鼓,广...
4 竹窗松户有佳期,美酒香茶慰所思。辅嗣外生还解易, \n惠连群从总能诗。檐前花落春深后,谷里莺...
Name: 内容, dtype: object
def _filter(arg):arg = arg.replace('\n', '')return argcontent_s = content_s.apply(_filter)
content_s.head()
0 关关雎鸠,在河之洲。窈窕淑女,君子好逑。参差荇菜,左右流之。窈窕淑女,寤寐求之。求之不得,寤...
1 遵彼汝坟,伐其条枚。未见君子,惄如调饥。遵彼汝坟,伐其条肄。既见君子,不我遐弃。鲂鱼赪尾,王...
2 南山崔崔,雄狐绥绥。鲁道有荡,齐子由归。既曰归止,曷又怀止?葛屦五两,冠緌双止。鲁道有荡,齐...
3 芳岁肇佳节,物华当仲春。乾坤既昭泰,烟景含氤氲。 德浅荷玄贶,乐成思治人。前庭列钟鼓,广殿延...
4 竹窗松户有佳期,美酒香茶慰所思。辅嗣外生还解易, 惠连群从总能诗。檐前花落春深后,谷里莺啼日...
Name: 内容, dtype: object
分词测试
first = content_s[0]
firstimport jieba
import restop_words = ['而', '何', '乎', '乃', '其', '且', '若', '所', '为', '焉', '以', '因', '于', '与','也','则','者','之','不','自','得','一','来','去','无', '可', '是', '已', '此', '的', '上', '中', '兮', '三']# 因为要对古诗进行分词,尽量把有歧义句子进行更多的多分解
temp = ' '.join(jieba.cut(first, cut_all=True))
temp = re.sub('[,。]', ' ', temp)
temp
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\Liang\AppData\Local\Temp\jieba.cache
Loading model cost 0.677 seconds.
Prefix dict has been built successfully.'关关 关关雎 雎鸠 在 河之洲 窈窕 窈窕淑女 淑女 君子 君子好逑 好逑 参差 荇 菜 左右 流 之 窈窕 窈窕淑女 淑女 寤寐 寤寐求之 求之不得 不得 寤寐 思 服 悠哉 悠哉悠哉 悠哉 辗转 辗转反侧 反侧 参差 荇 菜 左右 采 之 窈窕 窈窕淑女 淑女 琴瑟 友 之 参差 荇 菜 左右 芼 之 窈窕 窈窕淑女 淑女 钟鼓 鼓乐 之 '
分词
def fenci(arg):
# arg = ' '.join(jieba.cut(arg, cut_all=True))arg = ' '.join(jieba.cut(arg, cut_all=True))arg = re.sub('[,。]', ' ', arg)return argcontent_s = content_s.apply(fenci)
content_s.head()
0 关关 关关雎 雎鸠 在 河之洲 窈窕 窈窕淑女 淑女 君子 君子好逑 好逑 ...
1 遵 彼 汝 坟 伐 其 条 枚 未 见 君子 惄 如 调 饥 遵 彼 汝 坟...
2 南山 崔 崔 雄 狐 绥 绥 鲁 道 有 荡 齐 子 由 归 既 曰 归 止...
3 芳 岁 肇 佳节 物华 当 仲春 乾坤 既 昭 泰 烟 景 含 氤氲 ...
4 竹 窗 松 户 有 佳期 美酒 酒香 香茶 慰 所思 辅 嗣 外生 生还 解 易 ...
Name: 内容, dtype: object
计算每一个词的 tfidf 值
from sklearn.feature_extraction.text import TfidfVectorizer
documents = content_s
tfidf_model = TfidfVectorizer(token_pattern=r'(?u)\b\w+\b', stop_words=stop_words).fit(documents)
tfidf_mat = tfidf_model.transform(documents)
tfidf_mat
<72417x81052 sparse matrix of type '<class 'numpy.float64'>'with 4077824 stored elements in Compressed Sparse Row format>
tfidf_mat[0].nonzero() # 不要问我这个方法是怎么找出来的,dir(),然后人肉搜索。。
(array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),array([80677, 76265, 73843, 73014, 70526, 70525, 64226, 63791, 63332,57493, 57492, 52190, 48145, 47330, 46554, 45842, 41379, 33000,32999, 32458, 28844, 26860, 26859, 24332, 21150, 18702, 18697,16807, 16660, 16610, 11379, 11378, 3195]))
# [i for i in content_s[0].split() if i not in stop_words].__len__()
content_s[0].split()
['关关','关关雎','雎鸠','在','河之洲','窈窕','窈窕淑女','淑女','君子','君子好逑','好逑','参差','荇','菜','左右','流','之','窈窕','窈窕淑女','淑女','寤寐','寤寐求之','求之不得','不得','寤寐','思','服','悠哉','悠哉悠哉','悠哉','辗转','辗转反侧','反侧','参差','荇','菜','左右','采','之','窈窕','窈窕淑女','淑女','琴瑟','友','之','参差','荇','菜','左右','芼','之','窈窕','窈窕淑女','淑女','钟鼓','鼓乐','之']
tfidf_mat[0, 80677]
numpy.float64
tfidf_mat[72416, 47377]
0.1403098208087779
计算两首诗的文本相似度
df[df['_id'] == 10]
_id | 标题 | 诗人 | 诗人id | 朝代 | 内容 | 译文 | 鉴赏 | 背景 | 古诗标签 | 古诗star数 | |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 10 | 汝坟 | 佚名 | 0 | 先秦 | 遵彼汝坟,伐其条枚。未见君子,惄如调饥。\n遵彼汝坟,伐其条肄。既见君子,不我遐弃。\n鲂鱼... | 译文\n沿着汝河大堤走,采伐山楸那枝条。还没见到我夫君,忧如忍饥在清早。\n沿着汝河大堤走,... | 鉴赏\n\n 这在诗之首章,“遵彼汝坟,伐其条枚”——在高高的汝河大堤上,有一位凄苦的妇女... | 影响\n\n 相传为孔子编辑成书,集入西周至春秋中叶五百多年的作品305篇,分为风雅颂三个... | 诗经,思念 | 330 |
def cosine_similarity(id1, id2):'''根据两首古诗的id,计算出两首古诗的文本相似度'''# 从df中找到古诗id对应的在稀疏矩阵csr_matrix中的行索引# 会有缺失数据,处理一下try:index1 = df[df['_id'] == id1].index[0]index2 = df[df['_id'] == id2].index[0]except IndexError:return 0vector1 = tfidf_mat[index1].nonzero()[1]vector2 = tfidf_mat[index2].nonzero()[1]sum1, sum2, sum3 = 0, 0, 0
# list1 = [i for i in ]for i in vector1:sum1 += tfidf_mat[index1, i]**2for j in vector2:sum2 += tfidf_mat[index2, j]**2for i in vector1:for j in vector2:if i == j:sum3 += tfidf_mat[index1, i]*tfidf_mat[index2, j]# print(locals())# 防止除 0,分母 +1return sum3/(np.sqrt(sum1*sum2)+1)
cosine_similarity(1, 2)
0.002923082839826352
'''
38204,小松,杜荀鹤,291,唐代
"咏物,讽喻,励志,哲理"
'''
from tqdm import tqdmmemory_list = []for i in tqdm(range(1, 72417)):if i == 38204:continuesim = cosine_similarity(38204, i)memory_list.append((i, sim))sorted(memory_list, key=lambda x:x[1],reverse=True)[:30]
100%|███████████████████████████████████████████████████████████████████████████| 72416/72416 [03:38<00:00, 331.48it/s][(42874, 0.08509635072406553),(25639, 0.07460172500593244),(19933, 0.07360265190423064),(13015, 0.07288387200145184),(12268, 0.06855823342195577),(24698, 0.06828669346676121),(11915, 0.06725844588564495),(15639, 0.06722002679024024),(8525, 0.06493546565747446),(962, 0.06334195607525453),(5838, 0.06316798198371498),(29091, 0.061948842869898796),(43175, 0.06068527155624073),(41581, 0.060285572253107704),(11809, 0.06022838400815675),(39570, 0.060142458480599424),(44562, 0.06001648813693223),(20642, 0.05925593090394182),(41664, 0.05881530250459235),(71968, 0.05772367696380888),(26726, 0.057529621355982885),(26888, 0.057529621355982885),(37002, 0.057056093152641256),(5246, 0.05700072408859219),(41484, 0.0568877395309903),(39116, 0.05678664339524122),(39023, 0.05669148933184754),(12621, 0.056382011763703686),(27120, 0.055758229911533785),(14859, 0.055241489261179846)]
df[df['_id'] == 38204]
_id | 标题 | 诗人 | 诗人id | 朝代 | 内容 | 译文 | 鉴赏 | 背景 | 古诗标签 | 古诗star数 | |
---|---|---|---|---|---|---|---|---|---|---|---|
30957 | 38204 | 小松 | 杜荀鹤 | 291 | 唐代 | 自小刺头深草里,而今渐觉出蓬蒿。 \n时人不识凌云木,直待凌云始道高。 | 译文\n松树小的时候长在很深很深的草中,埋没看不出来,\n到现在才发现已经比那些野草(蓬蒿)... | 鉴赏\n\n 《小松》借松写人,托物讽喻,寓意深长。\n\n 松,树木中的英雄、勇士。数... | NaN | 咏物,讽喻,励志,哲理 | 388 |
df[df['_id'] == 25639]
_id | 标题 | 诗人 | 诗人id | 朝代 | 内容 | 译文 | 鉴赏 | 背景 | 古诗标签 | 古诗star数 | |
---|---|---|---|---|---|---|---|---|---|---|---|
17103 | 25639 | 玩手植松 | 施肩吾 | 773 | 唐代 | 却思毫末栽松处,青翠才将众草分。 \n今日散材遮不得,看看气色欲凌云。 | NaN | NaN | NaN | NaN | 1 |
m_list = memory_list.copy()
m_list = sorted(m_list, key=lambda x:x[1],reverse=True)[:30]
基于 TF-IDF 计算古诗之间的文本相似度相关推荐
- 基于隐马尔科夫模型文本相似度问题研究
文本相似度是表示两个或者多个文本之间匹配程度的一个度量参数,相似度数值大,说明文本相似度高:反之文件相似程度就低.文本相似度的精确计算问题是进行信息处理的关键. 在如今信息技术飞速发展的互联网时代,文 ...
- 如何计算两个字符串之间的文本相似度?
如何计算两个字符串之间的文本相似度? 前言 平时的编码中,我们经常需要判断两个文本的相似性,不管是用来做文本纠错或者去重等等,那么我们应该以什么维度来判断相似性呢?这些算法又怎么实现呢?这篇文章对常见 ...
- 基于ICP算法计算点集之间的变换矩阵(旋转、平移)
前言 本文主要是计算两个激光雷达之间的变换矩阵,即计算两组点云之间的变换矩阵.其中处理的点云数据主要是由x,y,z,intensity组成的,代表空间位置x,ry,z 和每个点云对应的反射强度inte ...
- 【相似度计算】详解文本相似度计算(介绍、公式)
本文收录于<深入浅出讲解自然语言处理>专栏,此专栏聚焦于自然语言处理领域的各大经典算法,将持续更新,欢迎大家订阅! 个人主页:有梦想的程序星空 个人介绍:小编是人工智能领域硕士,全栈工 ...
- jaccard相似度_如何计算两个字符串之间的文本相似度?
推荐阅读: 面试BAT 却被小小字符串秒杀?这13道题帮你一举击败字符串算法题 字节跳动秋招面经:后端开发工程师,已拿意向书 前言 平时的编码中,我们经常需要判断两个文本的相似性,不管是用来做文本纠错 ...
- 使用Word2Vec完成基于文本相似度的推荐
使用 Word2Vec 完成基于文本相似度的推荐 之前的基于文本相似度的推荐使用的是one-hot的词向量,虽然可以使用稀疏向量来存储里面的非0值,但是以这种形式的词向量存在很多问题: 稀疏的向量表达 ...
- 文本相似度计算python lda_如何识别“答非所问”?使用gensim进行文本相似度计算...
在文本处理中,比如商品评论挖掘,有时需要了解每个评论分别和商品的描述之间的相似度,以此衡量评论的客观性. 评论和商品描述的相似度越高,说明评论的用语比较官方,不带太多感情色彩,比较注重描述商品的属性和 ...
- 如何识别“答非所问”?使用gensim进行文本相似度计算
在文本处理中,比如商品评论挖掘,有时需要了解每个评论分别和商品的描述之间的相似度,以此衡量评论的客观性. 评论和商品描述的相似度越高,说明评论的用语比较官方,不带太多感情色彩,比较注重描述商品的属性和 ...
- python 文本相似度计算函数_四种计算文本相似度的方法对比
作者:Yves Peirsman 编译:Bing 编者按:本文作者为Yves Peirsman,是NLP领域的专家.在这篇博文中,作者比较了各种计算句子相似度的方法,并了解它们是如何操作的.词嵌入(w ...
最新文章
- hadoop配置文件加载机制
- 给定某年日期及该年第一天是星期几然后显示该年的日历
- 浅谈PPM (Project Portfolio Management)
- 关于C#函数对象参数传递的问题
- JavaScript 内存机制(前端同学进阶必备)
- 【学习 OpenCV】—— Mat setTo/convertTo/copyTo
- Oracle Concepts Guide 中 Oracle 实例 和 数据库 【关系图】
- 基于CarMaker的C-NCAP主动安全系统试验仿真(二)
- Spark SQL自定义函数案例(拼接字符串)
- 计算机设备与驱动器空白图标,这个方法帮你删掉win10设备和驱动器里无效图标...
- Android Studio启动海马玩模拟器
- EOF in header-net core
- 基于Vue实现的多条件筛选功能(类似京东和淘宝功能)
- 计算机未连接到网络,电脑未连接到一个互联网的问题,解决网络问题方法
- python中var_【Python金融量化】VaR系列(一):HS,WHS,RM方法估计VaR
- 初学者入门阿里云haas510开板式DTU(2.0版本)--510-AS
- 深入浅出系列之 -- kafka消费者的三种语义模型
- 使用SSH协议搭建隧道(附搭建环境超详细)
- html鼠标拖尾效果,JavaScript鼠标划过背景拖尾效果
- 企业网络安全|监控解决方案