热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

zipf定律与相似性度量

zipf定律与相似性度量Zipf定律指出,在文本中,标识符出现的频率与其在排序列表中的排名或位置成反比。这个定律描述了标识符在文本中是如何分布的,即一些
zipf定律与相似性度量


        Zipf定律指出,在文本中,标识符出现的频率与其在排序列表中的排名或位置成反比。这个定律描述了标识符在文本中是如何分布的,即一些标志符出现的频次很大,另一些出现的频次较低,还有一些基本不出现。它是自然语言处理中,非常重要的一个定律,它的数学语言可以这样描述:在给定的语料库里,对于任意的一个term,它的频度f与这个频度在语料库中的排名r的乘积近似一个常数。即f正比于1/r。以英语语料库为例,其他语料库一样遵循zipf定律,表明在英语单词中,只有极少数的词被经常使用,而绝大多数词很少被使用。事实上,它是一个很普遍的规律,比如网站的访问者数量、每个国家公司的数量都近似服从zipf定律。下面用nltk来获取基于zipf定律的双对数图,代码如下:

#使用nltk获取基于zipf定律的双对数图
import nltk
from nltk.corpus import brown  #使用布朗语料库
from nltk.probability import FreqDist   #用来记录语料库中词频的分布
import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('TkAgg')
def zipf_log_log():
    fd=FreqDist()    #FreqDist()获取语料库中的词的频率分布
    for text in brown.fileids():     #fileids()为语料库中的文件
        for word in brown.words(text):   #words()包含了语料库中所有的单词
            fd[word]+=1
    ranks=[]
    freqs=[]
    for rank,word in enumerate(fd):   #把rank和word做一个枚举
        ranks.append(rank+1)
        freqs.append(fd[word])
    plt.loglog(ranks,freqs)     #做双对数图
    plt.xlabel('frequency(f)',fOntsize=14,fOntweight='bold')
    plt.ylabel('rank(r)',fOntsize=14,fOntweight='bold')
    plt.grid(True)
    plt.show()
if __name__=="__main__":
    zipf_log_log()

结果如图所示:

可以看到一个词的出现越频繁,也就是词频越高,它的排名越靠后。

相似性度量

        在NLP中进行距离的相似性度量很多,这里对其中的几种非常常用的作以介绍,包括编辑距离算法、Jaccard系数、Smith Waterman算法等等。

对于编辑距离算法,以两个字符串作以比较,指的是为了使两个字符串相等所插入、替换或删除的字符的数量。

下面以代码实现再加以解释,编辑距离代码如下:

#使用编辑距离进行相似性度量
import nltk
from nltk.metrics import edit_distance
e_d=edit_distance("machine_learning","deep_learning")
print("The two words edit_distance is:"+str(e_d))

输出结果:

因为要使的这两个词相等,需要做7次替换,注意这种编辑距离算法是按长的来匹配的,即把deep替换成machine,先进行4次替换再进行3次插入。

Jaccard系数相似性度量:

        Jaccard系数描述的是两个集合交集的相似程度,代码实现如下:

 

#使用Jaccard系数度量集合X与Y的相似度
#方法一:自己造轮子实现Jaccard系数
def jaccard_similarity(query,document):
    molecular=set(query).intersection(set(document))   #分子,两个集合的交集
    denominator=set(query).union(set(document))       #分母,两个集合的并集
    return len(molecular)/len(denominator)
#方法二:使用nltk中的Jaccard系数
def nltk_jaccard(X,Y):
    import nltk
    from nltk.metrics import jaccard_distance
    return jaccard_distance(X,Y)
if __name__=="__main__":
    X=set([10,20,30])
    Y=set([20,30,40])
    d_1=jaccard_similarity(X,Y)    #自己的轮子实现
    d_2=nltk_jaccard(X,Y)          #使用nltk中的实现
    print("d_1="+str(d_1))
    print("d_2="+str(d_2))

执行完程序后,结果如下:

当然了,相似性度量的距离算法有很多,想经常用到的度量词义之间的相似性,比如在word2vec中的使用欧氏距离的度量方法来寻找词义相近的词,等等。


推荐阅读
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
  • 我用Tkinter制作了一个图形用户界面,有两个主按钮:“开始”和“停止”。请您就如何使用“停止”按钮终止“开始”按钮为以下代码调用的已运行功能提供建议 ... [详细]
  • Highcharts翻译系列之二十:曲线图例子(二)
    Highcharts翻译系列之二十:曲线图例子(二)代码 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • [echarts] 同指标对比柱状图相关的知识介绍及应用示例
    本文由编程笔记小编为大家整理,主要介绍了echarts同指标对比柱状图相关的知识,包括对比课程通过率最高的8个课程和最低的8个课程以及全校的平均通过率。文章提供了一个应用示例,展示了如何使用echarts制作同指标对比柱状图,并对代码进行了详细解释和说明。该示例可以帮助读者更好地理解和应用echarts。 ... [详细]
  • vb.net不用多线程如何同时运行两个过程?不用多线程?即使用多线程,也不会是“同时”执行,题主只要略懂一些计算机编译原理就能明白了。不用多线程更不可能让两个过程同步执行了。不过可 ... [详细]
  • keras归一化激活函数dropout
    激活函数:1.softmax函数在多分类中常用的激活函数,是基于逻辑回归的,常用在输出一层,将输出压缩在0~1之间,且保证所有元素和为1,表示输入值属于每个输出值的概率大小2、Si ... [详细]
  • python数据可视化matplotlib专题:带数据标签的双batch的Bar图绘制示例
    基于matplotlib的双Batch带标签bar图生成函数李俊才邮箱:291148484163.com【代码实现】importmatplotlibimpor ... [详细]
  • MVC中的自定义控件
    怎么样创建自定义控 ... [详细]
  • 动量|收益率_基于MT策略的实战分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于MT策略的实战分析相关的知识,希望对你有一定的参考价值。基于MT策略的实战分析 ... [详细]
author-avatar
今生绝恋2702934494
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有