文本内容之间的关键词提取和相似度计算

背景

Web应用程序变得越来越智能。 从网站上使用服务的日子已经一去不复返了,用户不得不填写一个巨大的表格。 假设您有一个适合书迷的网站。 在Web 2.0之前,此类网站曾经以诸如年龄,阅读书籍,喜欢的书籍类型,语言偏好,作者偏好等形式向用户提出各种问题。如今,如今,一种常见的做法是要求用户在自己(个人资料)上写一个段落。 在此注释中,用户表达了一些细节,但是挑战在于,如何从这种自由格式的文本中提取有用的信息,以及如何找到兴趣相似的用户?

这种用例已经变得如此普遍,以至于每个Java开发人员都应该了解一些有关从文本检索信息的技巧。 在本文中,我将引导您完成一种简单而有效的方法。

从文本中提取信息的过程

  1. 过滤单词 :逐字阅读文本内容并删除不需要的单词。 作为此过滤状态的一部分,请删除所有常用的英语单词。 人们还可以应用审查规则,并删除露骨的色情字词或仇恨言论等。
  2. 执行词干: “搜索”或“搜索”或“搜索”之类的词都表示“搜索”。 将单词还原为词根的过程称为词干。
  3. 计算相似度 :经过前两个步骤,我们现在有了一组关键字,它们真实地表示原始文本(在此示例中为用户个人资料)。 我们可以将这些关键字视为一组唯一的单词。 要计算两个用户资料之间的相似度,最好用一个数字来表示相似度,该数字代表两个内容在0(不相似)到1(完全相似)范围内的相似程度。 一种实现方法是计算Jaccard Index,该索引用于计算集合的相似性或多样性。
Jaccard index J(A,B) = |A∩B|/| A⋃B|

其中A和B是集合,而J(A,B)在0到1之间。

实施细节

根据以上几点,可以开发一个库来提取关键字并计算相似度。 但是,Apache Lucene是一个Java库,具有大量用于执行关键字提取的API。 这是此API不同重要区域的简要说明。

分词器

Tokenizer将您的文本分成多个块。 有不同的令牌生成器,根据您使用的令牌生成器,您可以获得不同的输出令牌流(文本块序列)。

词干

词干用于获取有疑问的单词的基础。 在很大程度上取决于所使用的语言。 诸如“ seaerch”,“ searched”,“ searching”等词源于词根“ search”。 在信息检索领域,如果我们能找到根词,这将非常有用,因为它可以减少噪声,并且用更少的词仍可以承载文档的意图。 著名的词干提取算法之一是Porter Stemmer算法。

令牌过滤器

可以将令牌过滤器应用于令牌生成器的输出以标准化或过滤令牌。 像LowerCaseFilter,它将令牌文本规范化为小写字母或stopfilter抑制最频繁且几乎无用的单词。 同样,它在很大程度上取决于语言。 对于英语,这些停用词是“ a”,“ the”,“ I”,“ be”,“ have”等。

分析仪

分析器是使用令牌生成器从输入生成令牌,使用词干提取器减少令牌,使用过滤器抑制/标准化令牌的更高级别的类。 这是粘接其他三个主要组件的类。 不同的分析器使用标记器和过滤器的不同组合。 例如,StandardAnalyzer使用StandardTokenizer从字符串中提取令牌,将其传递给LowerCaseFilter以将令牌转换为小写,然后将令牌流传递给StopFilter以除去最常用的英语单词。 默认情况下,它不执行词干。 可以通过根据需要混合和匹配标记器和标记过滤器来开发定制分析器。

代码遍历

可以从https://github.com/shamikm/similarity访问该示例的源代码。 以下是这些步骤的重点:

  1. 创建一个执行以下步骤的自定义分析器:
    • 根据空间,逗号,句点等对英语单词进行标记。使用StandardTokenizer可以完成此任务。
    • 使用LowerCaseFilter将标记转换为小写
    • 使用StopFilter停止常见的英语单词
    • 使用Porter Stemmer阻止英语单词

    从StemmAnalyzer类:

    @Overridepublic TokenStream tokenStream(String fieldName, Reader reader) {(a)..  final StandardTokenizer src = new StandardTokenizer(matchVersion, reader);TokenStream tok = new StandardFilter(matchVersion, src);(b)..  tok = new LowerCaseFilter(matchVersion, tok);(c)..  tok = new StopFilter(matchVersion, tok, getStopWords());(d)..  return new PorterStemFilter(tok);}
  2. 一旦我们有了一组单词,就很容易计算出两个单词之间的相似度。

    从JaccardIndexBasedSimilarity类:

    public double calculateSimilarity(String oneContent, String otherContet) {Set<String> keyWords1 = keywordGenerator.generateKeyWords(oneContent);Set<String> keyWords2 = keywordGenerator.generateKeyWords(otherContet);Set<String> denominator = Sets.union(keyWords1,keyWords2);Set<String> numerator = Sets.intersection(keyWords1,keyWords2);return denominator.size()>0? (double)numerator.size()/(double)denominator.size() : 0;}

这是一个示例测试案例,以演示代码如何工作:

@Testpublic void calculateSim(){SimilarityCalculator calculator = new JaccardIndexBasedSimilarity();Assert.assertEquals(calculator.calculateSimilarity("They Licked the platter clean","Jack Sprat could eat no fat"),0.0);//1(lamb) out of 6(littl,lamb,mari,had,go,sure) words are sameAssert.assertEquals(calculator.calculateSimilarity("Mary had a little lamb", "The lamb was sure to go."), 0.16, 0.02);Assert.assertEquals(calculator.calculateSimilarity("Mary had a little lamb","Mary had a little lamb"),1.0);}

您可以脱机运行此过程,并找出一个用户配置文件与数据库中任何其他用户的相似之处,并可以根据相似用户正在阅读的内容开始推荐用户。

结论

从文本中检索信息是当今的一种常见用例。 对这个关键领域有基本的了解对任何开发人员都有帮助。在本文中,我们研究了如何有效地使用Apache Lucene API来提取关键字并计算文本之间的相似度。

资源:

  • http://en.wikipedia.org/wiki/Jaccard_index
  • http://tartarus.org/martin/PorterStemmer/
  • http://www.manning.com/ingersoll/
  • http://www.amazon.com/Algorithms-Intelligent-Web-Haralambos-Marmanis/dp/1933988665

翻译自: https://www.javacodegeeks.com/2014/07/keyword-extraction-and-similarity-calculation-among-textual-content.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows XP SP3支持多用户远程桌面连接

远程桌面连接的确很方便&#xff0c;但是在Windows XP中只支持单一用户的连接&#xff0c;当第二个用户连接时&#xff0c;第一个用户就被迫断开并回到用户登录界面了&#xff0c;这可和多任务的操作系统理念不符啊&#xff0c;或许微软是为了突出Server系统的特点吧&#xff0…

构建用于测试的超大型内存InputStream

由于某种原因&#xff0c;我需要非常大的&#xff0c;甚至可能是无限的InputStream &#xff0c;它会反复地反复返回相同的byte[] 。 这样&#xff0c;我可以通过重复小样本来产生大量的数据流。 在Guava中可以找到类似的功能&#xff1a; Iterable<T> Iterables.cycle(I…

linux 调试小经验

1、查看netlink socket 丢包 cat /proc/net/netlink sk Eth Pid Groups Rmem Wmem Dump Locks Drops Inode c91eda00 0 1172 00000001 0 0 00000000 2 0 27767 c43eee00 0 -4099 00000000 0 0 00000000 2 0 41200 c9266e00 0 1186 00000000 0 0 00000000 2 0 28922 c1af580…

前端打印功能

方法一&#xff1a; html代码&#xff1a; 在要打印的内容上加入&#xff1a;<!--startprint-->和<!--endprint--> js代码&#xff1a; $(.printData).click(function(){bdhtmlwindow.document.body.innerHTML; sprnstr"<!--startprint-->"; …

Vlc支持IE 360 低版本的Google浏览器

VLC 插件代码&#xff1a; <object typeapplication/x-vlc-plugin pluginspage"http://www.videolan.org/" idvlc eventsfalse width"720" height"410"><param namemrl valuertsp://admin:123456******:554/h264/ch1/main/av_stream /&…

同步多线程

同步多线程&#xff08;SMT&#xff09;是一种在一个CPU 的时钟周期内能够执行来自多个线程的指令的硬件多线程技术。本质上&#xff0c;同步多线程是一种将线程级并行处理&#xff08;多CPU&#xff09;转化为指令级并行处理&#xff08;同一CPU&#xff09;的方法。 同步多线…

如何使用布隆过滤器在Java中建立大容量的内存缓存

背景 缓存是解决日常软件问题的重要概念。 您的应用程序可能会执行CPU密集型操作&#xff0c;而您又不想一次又一次地执行这些操作&#xff0c;而是只导出一次结果并将其缓存在内存中。 有时瓶颈是IO&#xff0c;例如您不想重复访问数据库&#xff0c;并且想缓存结果并仅在基础…

Centos7安装Python3的方法

由于centos7原本就安装了Python2&#xff0c;而且这个Python2不能被删除&#xff0c;因为有很多系统命令&#xff0c;比如yum都要用到。 [rootVM_105_217_centos Python-3.6.2]# python Python 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)…

ajax请求导致status为canceled的原因

在使用layui的form表单提交以后&#xff0c;请求状态总是canceled。后来在form表单的后面添加了一行代码&#xff1a; return false; 就可以了。 文档&#xff1a;https://www.layui.com/doc/modules/form.html#onsubmit 错误&#xff1a; 解决方法&#xff1a; 总结一下&…

CSS图片水平垂直居中

Html: <div id"MainContent"><img src"QQ截图20150515140512.png" width"247" height"192"></img></div></div> CSS: #MainContent {display:table-cell;width: 700px;height: 800px;background: #0C78…

如何开启OpenSSL和mcrypt

1&#xff0c;要想开启mcrypt支持&#xff0c;系统需要安装了libmcrypt.dll库。这个一般用户是没有安装过的&#xff0c;但不用担心&#xff0c;PHP的windows发行包里已经给我们附带了此文件&#xff0c;在PHP压缩包的根目录下即可找到&#xff0c;然后将其复制到%system%/syst…

如果BigDecimal是答案,那肯定是一个奇怪的问题

总览 许多开发人员已确定BigDecimal是处理金钱的唯一方法。 通常&#xff0c;他们通过用BigDecimal替换double来确定错误或十个错误。 我对此没有说服力的是&#xff0c;也许他们可以解决double处理中的错误以及使用BigDecimal的额外开销。 根据我的比较&#xff0c;当被问到改…

算法思想_常见四种

文章目录常用算法思想描述穷举算法思想1. 基本思想2. 步骤3.实例递推算法1. 基本思想2. 步骤3. 实例递归算法1. 基本思想2. 步骤3. 实例1. 分治算法1. 基本思想2. 步骤3. 实例概率算法1. 基本思想2. 步骤3. 实例如果还有时间&#xff0c;将继续更新常用算法思想描述 穷举算法思…

[转] 做个自强不息的青年

人的出生和际遇本身造就了每个人的道路都不同&#xff0c;对于青年人来说&#xff0c;如何能够面对逆顺&#xff0c;如何面对起伏&#xff0c;如何能够正确设定理想并为之激发生命的火焰&#xff0c;在持续的奋斗中不断提升自我&#xff0c;自强不息而自立利他&#xff1f;在与…

commonJS — 全局操作(for Window)

for Window github: https://github.com/laixiangran/commonJS/blob/master/src/forWindow.js 代码 /*** Created by laixiangran on 2016/1/24* homepage&#xff1a;http://www.cnblogs.com/laixiangran/* for Window*/ (function() {var com window.COM window.COM || {}…

点击返回上一页失效

点击取消的时候&#xff0c;返回上一页&#xff0c;没有效果&#xff0c;仍然停留在当前页&#xff0c;还报500&#xff1b;改成window.history.go(-1)也不生效 代码&#xff1a; <button class"st-btn-normal st-btn-cancel cancle" onclick"javascript:wi…

如何通过7个Logback调整立即改善Java日志记录

基准测试可帮助您发现Logback在压力下的性能 日志记录对于服务器端应用程序是必不可少的&#xff0c;但这是有代价的。 令人惊讶的是&#xff0c;微小的更改和配置调整对应用程序的日志记录吞吐量有多大影响。 在这篇文章中&#xff0c;我们将根据每分钟的日志条目对Logback的性…

JS中的编码

今天发现我输入的中文变成了另外一种格式&#xff0c;查了一下&#xff0c;原来是转换成了数字编码。在这里介绍一下数字编码和base64&#xff0c;做个记录 1.出现原因&#xff1a;在开发中经常需要对用户输入的数据进行编码然后才能通过HTTP请求发送给后台&#xff0c;或者对…

commonJS — DOM操作(for DOM)

for DOM github: https://github.com/laixiangran/commonJS/blob/master/src/forDOM.js 代码 /*** Created by laixiangran on 2016/1/24* homepage&#xff1a;http://www.cnblogs.com/laixiangran/* for DOM*/(function(undefined) {var com window.COM window.COM || {};…

deMeer5_Attacker

SoccerCommand Player::deMeer5_Attacker(){SoccerCommand soc(CMD_ILLEGAL);if (WM->isBeforeKickOff()){if (formations->getFormation() ! FT_INITIAL || //不在开球的阵型 WM->getAgentGlobalPosition().getDistanceTo(WM->getStrategicPosition()) > 2.…