redis简易相似去重实现
随着网络的发展和数据的飞速增长,如何高效地对数据进行去重也逐渐成为了我们面临的一个问题。在这个过程中,Redis作为一个轻量级的key-value缓存idc.com/xtywjcwz/15347.html" target="_blank">数据库,已经成为了不可或缺的角色。
本文将主要介绍如何使用Redis实现一个简易的相似去重功能。相似度去重是指对一组具有相似性质的数据进行去重。例如,对一组文章进行去重,需要判断文章的相似度,如果相似度较高,就可以认为是同一篇文章,直接将其中一篇文章保留,其余的文章就可以视为重复文章进行去重。
我们需要定义相似度的计算方法。本文使用余弦相似度计算相似度,该方法利用向量空间中两个向量夹角的余弦值作为衡量两个向量相似度的大小指标。公式如下:
来存储文章的相似度。
在Redis中,每个有序集合都由一个键和多个成员组成,成员之间按照给定的分数(score)进行排序,分数相同则按照成员的字典序排序。由于我们是根据相似度分值来排序的,分值越高则相似度越高,因此分值是一份很好的标记。
下面是相关代码实现:
import redis
import jieba
import numpy as np
r = redis.Redis(host=’localhost’, port=6379)
def add_article(title, content):
id_num = r.incr(‘article_id’)
content_cut = jieba.lcut(content) # 分词处理
article_key = ‘article_{}’.FORmat(id_num)
pipeline = r.pipeline()
pipeline.sadd(‘article_ids’, id_num) # 将文章ID添加到集合中
pipeline.zadd(‘article_similarity’, {article_key: 1}) # 将文章的相似度分数设为1
for WORD in content_cut:
pipeline.sadd(‘word:’ + word, id_num) # 将文章词汇放入指定的集合中
pipeline.hmset(article_key, {‘title’: title, ‘content’: content}) # 将文章的内容保存到哈希表中
pipeline.execute()
def get_similar_articles(article_id, num):
article_key = ‘article_{}’.format(article_id)
article_words = r.hmget(article_key, ‘content’)[0]
article_words_cut = jieba.lcut(article_words)
article_vec = np.zeros(len(article_words_cut))
for idx, word in enumerate(article_words_cut):
article_vec[idx] = r.scard(‘word:’ + word)
articles_ids = r.smembers(‘article_ids’)
article_scores = {}
for id_num in articles_ids:
if int(id_num) == article_id:
other_key = ‘article_{}’.format(id_num)
other_words = r.hmget(other_key, ‘content’)[0]
if not other_words:
other_words_cut = jieba.lcut(other_words)
other_vec = np.zeros(len(article_vec))
for idx, word in enumerate(other_words_cut):
other_vec[idx] = r.scard(‘word:’ + word)
score = np.dot(article_vec, other_vec) / (np.linalg.norm(article_vec) * np.linalg.norm(other_vec))
article_scores[id_num] = score
article_scores = sorted(article_scores.items(), key=lambda item: item[1], reverse=True)

return article_scores[:num]
add_article:添加一篇文章到Redis中。get_similar_articles:获取指定文章ID的相似文章。在调用add_article方法时,我们传入文章的标题和content,并通过分词处理将其分解成词汇表。然后,将文章ID添加到article_ids集合中,将文章的相似度分值设为1,并将文章分解后的词汇分别添加到对应的集合中。将文章的内容保存到哈希表中。在调用get_similar_articles方法时,我们首先获取了指定文章ID的内容,并根据内容的词汇计算向量;接着,遍历所有的文章ID,在文章ID不等于请求的文章ID时,获取并计算对应文章的词汇向量,并计算出两个文章之间的相似度。将所有文章的相似度按从高到低的顺序排序,并返回前num个相似度比较高的文章。我们可以使用以下代码进行测试:```pythonadd_article('test1', '今天的天气真好,我们去爬山吧!')add_article('test2', '今天天气真好,我们去爬山吧!')add_article('test3', '今天天气挺不错,我们去爬山好吗?')add_article('test4', '明天的天气好像也不错,我们可以一起去外婆家看看!')print(get_similar_articles(1, 2))
运行结果如下:
[('3', 0.834194937963523), ('2', 0.9966154201066122)]
从结果可以看出,指定文章ID为1时,与其内容最相似的两篇文章是ID为3和2的文章,它们的相似度分别为0.83和0.99。
综上所述,本文介绍了如何使用Redis实现一个简易的相似去重功能。通过计算余弦相似度并存储在有序集合中,我们可以轻松地找到相似度较高的文章,从而进行去重操作。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
雪白类似的词语
雪白类似的词语表示颜色词雪白 银白 灰白漆黑 煤黑 金黄 藤黄 土黄草绿 果绿 墨绿天蓝 钴蓝 土红 火红 曙红
高中数学解题技巧
数学解题的技巧 为了使回想、联想、猜想的方向更明确,思路更加活泼,进一步提高探索的成效,我们必须掌握一些解题的策略。 一切解题的策略的基本出发点在于“变换”,即把面临的问题转化为一道或几道易于解答的新题,以通过对新题的考察,发现原题的解题思路,最终达到解决原题的目的。 基于这样的认识,常用的解题策略有:熟悉化、简单化、直观化、特殊化、一般化、整体化、间接化等。 一、 熟悉化策略 所谓熟悉化策略,就是当我们面临的是一道以前没有接触过的陌生题目时,要设法把它化为曾经解过的或比较熟悉的题目,以便充分利用已有的知识、经验或解题模式,顺利地解出原题。 一般说来,对于题目的熟悉程度,取决于对题目自身结构的认识和理解。 从结构上来分析,任何一道解答题,都包含条件和结论(或问题)两个方面。 因此,要把陌生题转化为熟悉题,可以在变换题目的条件、结论(或问题)以及它们的联系方式上多下功夫。 常用的途径有: (一)、充分联想回忆基本知识和题型: 按照波利亚的观点,在解决问题之前,我们应充分联想和回忆与原有问题相同或相似的知识点和题型,充分利用相似问题中的方式、方法和结论,从而解决现有的问题。 (二)、全方位、多角度分析题意: 对于同一道数学题,常常可以不同的侧面、不同的角度去认识。 因此,根据自己的知识和经验,适时调整分析问题的视角,有助于更好地把握题意,找到自己熟悉的解题方向。 (三)恰当构造辅助元素: 数学中,同一素材的题目,常常可以有不同的表现形式;条件与结论(或问题)之间,也存在着多种联系方式。 因此,恰当构造辅助元素,有助于改变题目的形式,沟通条件与结论(或条件与问题)的内在联系,把陌生题转化为熟悉题。 数学解题中,构造的辅助元素是多种多样的,常见的有构造图形(点、线、面、体),构造算法,构造多项式,构造方程(组),构造坐标系,构造数列,构造行列式,构造等价性命题,构造反例,构造数学模型等等。 二、简单化策略 所谓简单化策略,就是当我们面临的是一道结构复杂、难以入手的题目时,要设法把转化为一道或几道比较简单、易于解答的新题,以便通过对新题的考察,启迪解题思路,以简驭繁,解出原题。 简单化是熟悉化的补充和发挥。 一般说来,我们对于简单问题往往比较熟悉或容易熟悉。 因此,在实际解题时,这两种策略常常是结合在一起进行的,只是着眼点有所不同而已。 解题中,实施简单化策略的途径是多方面的,常用的有: 寻求中间环节,分类考察讨论,简化已知条件,恰当分解结论等。 1、寻求中间环节,挖掘隐含条件: 在些结构复杂的综合题,就其生成背景而论,大多是由若干比较简单的基本题,经过适当组合抽去中间环节而构成的。 因此,从题目的因果关系入手,寻求可能的中间环节和隐含条件,把原题分解成一组相互联系的系列题,是实现复杂问题简单化的一条重要途径。 2、分类考察讨论: 在些数学题,解题的复杂性,主要在于它的条件、结论(或问题)包含多种不易识别的可能情形。 对于这类问题,选择恰当的分类标准,把原题分解成一组并列的简单题,有助于实现复杂问题简单化。 3、简单化已知条件: 有些数学题,条件比较抽象、复杂,不太容易入手。 这时,不妨简化题中某些已知条件,甚至暂时撇开不顾,先考虑一个简化问题。 这样简单化了的问题,对于解答原题,常常能起到穿针引线的作用。 4、恰当分解结论: 有些问题,解题的主要困难,来自结论的抽象概括,难以直接和条件联系起来,这时,不妨猜想一下,能否把结论分解为几个比较简单的部分,以便各个击破,解出原题。 三、直观化策略: 所谓直观化策略,就是当我们面临的是一道内容抽象,不易捉摸的题目时,要设法把它转化为形象鲜明、直观具体的问题,以便凭借事物的形象把握题中所及的各对象之间的联系,找到原题的解题思路。 (一)、图表直观: 有些数学题,内容抽象,关系复杂,给理解题意增添了困难,常常会由于题目的抽象性和复杂性,使正常的思维难以进行到底。 对于这类题目,借助图表直观,利用示意图或表格分析题意,有助于抽象内容形象化,复杂关系条理化,使思维有相对具体的依托,便于深入思考,发现解题线索。 (二)、图形直观: 有些涉及数量关系的题目,用代数方法求解,道路崎岖曲折,计算量偏大。 这时,不妨借助图形直观,给题中有关数量以恰当的几何分析,拓宽解题思路,找出简捷、合理的解题途径。 (三)、图象直观: 不少涉及数量关系的题目,与函数的图象密切相关,灵活运用图象的直观性,常常能以简驭繁,获取简便,巧妙的解法。 四、特殊化策略 所谓特殊化策略,就是当我们面临的是一道难以入手的一般性题目时,要注意从一般退到特殊,先考察包含在一般情形里的某些比较简单的特殊问题,以便从特殊问题的研究中,拓宽解题思路,发现解答原题的方向或途径。 五、一般化策略 所谓一般化策略,就是当我们面临的是一个计算比较复杂或内在联系不甚明显的特殊问题时,要设法把特殊问题一般化,找出一个能够揭示事物本质属性的一般情形的方法、技巧或结果,顺利解出原题。 六、整体化策略 所谓整体化策略,就是当我们面临的是一道按常规思路进行局部处理难以奏效或计算冗繁的题目时,要适时调整视角,把问题作为一个有机整体,从整体入手,对整体结构进行全面、深刻的分析和改造,以便从整体特性的研究中,找到解决问题的途径和办法。 七、间接化策略 所谓间接化策略,就是当我们面临的是一道从正面入手复杂繁难,或在特定场合甚至找不到解题依据的题目时,要随时改变思维方向,从结论(或问题)的反面进行思考,以便化难为易解出原题。
如何利用R软件进行聚类分析
1. 数据预处理,2. 为衡量数据点间的相似度定义一个距离函数,3. 聚类或分组,4. 评估输出。 数据预处理包括选择数量,类型和特征的标度,它依靠特征选择和特征抽取,特征选择选择重要的特征,特征抽取把输入的特征转化为一个新的显著特征,它们经常被用来获取一个合适的特征集来为避免“维数灾”进行聚类,数据预处理还包括将孤立点移出数据,孤立点是不依附于一般数据行为或模型的数据,因此孤立点经常会导致有偏差的聚类结果,因此为了得到正确的聚类,我们必须将它们剔除。 既然相类似性是定义一个类的基础,那么不同数据之间在同一个特征空间相似度的衡量对于聚类步骤是很重要的,由于特征类型和特征标度的多样性,距离度量必须谨慎,它经常依赖于应用,例如,通常通过定义在特征空间的距离度量来评估不同对象的相异性,很多距离度都应用在一些不同的领域,一个简单的距离度量,如Euclidean距离,经常被用作反映不同数据间的相异性,一些有关相似性的度量,例如PMC和SMC,能够被用来特征化不同数据的概念相似性,在图像聚类上,子图图像的误差更正能够被用来衡量两个图形的相似性。 将数据对象分到不同的类中是一个很重要的步骤,数据基于不同的方法被分到不同的类中,划分方法和层次方法是聚类分析的两个主要方法,划分方法一般从初始划分和最优化一个聚类标准开始。 Crisp Clustering,它的每一个数据都属于单独的类;Fuzzy Clustering,它的每个数据可能在任何一个类中,Crisp Clustering和Fuzzy Clusterin是划分方法的两个主要技术,划分方法聚类是基于某个标准产生一个嵌套的划分系列,它可以度量不同类之间的相似性或一个类的可分离性用来合并和分裂类,其他的聚类方法还包括基于密度的聚类,基于模型的聚类,基于网格的聚类。 评估聚类结果的质量是另一个重要的阶段,聚类是一个无管理的程序,也没有客观的标准来评价聚类结果,它是通过一个类有效索引来评价,一般来说,几何性质,包括类间的分离和类内部的耦合,一般都用来评价聚类结果的质量,类有效索引在决定类的数目时经常扮演了一个重要角色,类有效索引的最佳值被期望从真实的类数目中获取,一个通常的决定类数目的方法是选择一个特定的类有效索引的最佳值,这个索引能否真实的得出类的数目是判断该索引是否有效的标准,很多已经存在的标准对于相互分离的类数据集合都能得出很好的结果,但是对于复杂的数据集,却通常行不通,例如,对于交叠类的集合。
发表评论