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

文本分类和提取关键词算法

背景

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/340652.shtml

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

相关文章

python里随机抽取样本_概率分布和抽样分布基础知识及Python实现

本文主要介绍推论统计中的概率分布和抽样分布,本文结构如下: 一、概率分布 随机变量:在一定条件下,某件事情可能发生或者不发生,这个事件就叫随机事件。例如抛硬币哪面朝上。随机变量X就是用来量化随机事件的函数,是将随机事件每一个可能出现的结果映射到数值的一个函数。…

php 创建目录_使用SMB绕过PHP远程文件包含限制

译文声明本文是翻译文章&#xff0c;文章原作者mannulinux&#xff0c;文章来源&#xff1a;mannulinux.org 原文地址&#xff1a;http://www.mannulinux.org/2019/05/exploiting-rfi-in-php-bypass-remote-url-inclusion-restriction.html译文仅供参考&#xff0c;具体内容表达…

eas系统服务器地址,EAS7.0EAS7.5服务端及其客户端标准配置介绍

金蝶EAS是基于JavaEE的大型企业应用。目前服务端支持以下主流软硬件环境。适用版本&#xff1a;EAS7.0 EAS703 EAS7.51.金蝶EAS服务端支持的软硬件环境注&#xff1a;标志为部署支持的环境&#xff0c;可以正常安装配置&#xff0c;但是正式运行前需联系金蝶技术支持。2.客户端…

Java的Kafka:构建安全,可扩展的消息传递应用程序

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 当今的用户希望可以通过其计算机&#xff0c;手机&#xff0c;平板电脑或任何其他设备访问您的应用程序&#xff01; …

background复合属性顺序_CSS有哪些好用的字体属性?

本文创建于2020年9月&#xff0c;以下为正文&#xff1a;CSS中有哪些字体属性呢&#xff1f;font&#xff1a;复合属性。设置或检索对象中的文本特征。font-style&#xff1a;设置或检索对象中的字体样式。用于定义字体的风格&#xff0c;如&#xff1a;斜体&#xff08;italic…

转译和编译_10个有趣又能编译为JavaScript的语言,你用过哪些?

点击上方“IT平头哥联盟”&#xff0c;选择“置顶或者星标”你的关注意义重大&#xff01;来源&#xff1a;https://www.sitepoint.com/现代应用相比普通的网页有不同的要求。但是浏览器是一个有着一套(大部分)固定可用的技术的平台&#xff0c;JavaScript依然是web应用的核心语…

OPC服务器如何采集设备的信息,如何将OPC服务器采集的设备数据转为MQTT方式,实现云端发布或订阅...

通过与PLC、智能仪表等硬件设备&#xff0c;以及OPC服务器、数据库等软件建立通讯&#xff0c;进行实时数据采集监控&#xff0c;然后将相关数据转换为数据库、OPC&#xff0c;以及MQTT、HTTP等多种服务接口&#xff0c;实现各类自动化与信息化系统软件灵活对接。MQTT智能网关案…

jboss7 关闭日志打印_使用自定义日志记录处理程序在JBoss AS 7中跟踪SQL语句

jboss7 关闭日志打印使用ORM从您的特定数据库中提取数据并让其创建和发布您必须亲自编写的所有SQL语句似乎很方便。 这就是使ORM解决方案受欢迎的原因。 但是它也有一个缺点&#xff1a;由于ORM为您做了很多工作&#xff0c;您在某种程度上失去了对生成SQL的控制&#xff0c;因…

微信小程序摄像头监控_微信必备黑科技小程序!

↑点击上方蓝字关注极物推荐欢迎分享到朋友圈-不花冤枉钱&#xff0c;历史见真谛对于喜欢购物的朋友们&#xff0c;这绝对是一把利器。只需把商品链接复制粘贴到上面&#xff0c;就可以轻松的查阅到该商品的历史价格&#xff0c;轻松直观的了解商品过去的价格波动&#xff0c;同…

无线打印 airprint 服务器,如何让 Windows 的共享打印机支持 AirPrint

对很多办公室环境来说&#xff0c;局域网共享打印机往往都是刚需&#xff0c;而如果局域网内的设备大多为 Windows 设备&#xff0c;通过 网络共享 的方式就可以轻松将所连接的 USB 打印机共享到局域网。但对同一个局域网内的 Apple 设备而言&#xff0c;因为很多打印机的 Mac …

硒测试中所需的功能和示例

所需功能是用于声明一组基本要求&#xff08;例如浏览器&#xff0c;操作系统&#xff0c;浏览器版本等的组合&#xff09;的类&#xff0c;以对Web应用程序执行自动跨浏览器测试。 当我们尝试通过Selenium自动化测试来自动化测试脚本时&#xff0c;我们需要考虑这些组合&…

边沿触发是什么意思_集基耦合双稳电路,集成化单稳电路,数字逻辑电路,门电路,触发器...

1).箝位器能把脉冲电压维持在某个数值上而使波形保持不变的电路称为箝位器。它也是整形电路的一种。例如电视信号在传输过程中会造成失真&#xff0c;为了使脉冲波形恢复原样&#xff0c;接收机里就要用箝位电路把波形顶部箝制在某个固定电平上。下图中反相器输出端上就有一个箝…

鲸鱼优化算法_盘点 35 个 Java 代码优化细节

代码优化&#xff0c;一个很重要的课题。可能有些人觉得没用&#xff0c;一些细小的地方有什么好修改的&#xff0c;改与不改对于代码的运行效率有什么影响呢&#xff1f;这个问题我是这么考虑的&#xff0c;就像大海里面的鲸鱼一样&#xff0c;它吃一条小虾米有用吗&#xff1…

powerbi导入地图_Power BI系列教程之powerBI功能介绍及使用导引(一)

作为从事数据分析相关工作的小伙伴&#xff0c;我们总会遇到一些工作是每周、每月甚至每天都是重复做的工作&#xff0c;这个时候我们有没有一种结构化的方法来处理这一些数据呢&#xff1f;答案是肯定的&#xff0c;微软为了满足广大职场数据分析人员的需求&#xff0c;开发了…

模糊搜索怎么实现_干货 | 你真的了解自己是怎么搜索的吗_01

「干货」栏目的开启是为了帮大家科普学习关于品牌出海、数字营销与跨境电商行业相关的知识&#xff0c;以及我们在业内会遇到的情况和一些规避的方法。第一讲搜索者我们整个搜索营销活动都是围绕搜索者展开的我们的目的是把搜索者转化为我们的销售机会所以&#xff0c;研究搜索…

JUnit 5和Selenium –改善项目配置

Selenium是一组支持浏览器自动化的工具和库&#xff0c;主要用于Web应用程序测试。 Selenium的组件之一是Selenium WebDriver&#xff0c;它提供客户端库&#xff0c;JSON有线协议&#xff08;与浏览器驱动程序进行通信的协议&#xff09;和浏览器驱动程序。 Selenium WebDrive…

linux shc shell脚本_详解shell脚本加密解密软件—gzese和shc

概述以我个人的需求为例&#xff0c;有时写一个脚本需要传密码&#xff0c;如果直接把密码写在脚本里会存在安全问题&#xff0c;一般是把密码写在脚本里&#xff0c;作为参数传给脚本&#xff0c;而保存密码的脚本&#xff0c;使用某种手段加密&#xff0c;令其不可读但是可执…

python3 for计数_python怎么实现计数?

python中实现计数的一般方法&#xff1a;1、使用字典解决(dict)字典计数是最常用的计数方法&#xff0c;逐个遍历数据结构中元素&#xff0c;将元素作为键&#xff0c;元素个数作为值进行统计&#xff0c;依次加入字典中。实例演示test_lst [a, b, c, d, e, f, g, a, f, s, b,…

linux 查看主板sn_如何在 Linux 上查找硬件规格

在 Linux 系统上有许多工具可用于查找硬件规格。-- Sk(作者)在 Linux 系统上有许多工具可用于查找硬件规格。在这里&#xff0c;我列出了四种最常用的工具&#xff0c;可以获取 Linux 系统的几乎所有硬件(和软件)细节。好在是这些工具在某些 Linux 发行版上默认预装。我在 Ubun…

输入流输出流是以内存为标准_构建用于测试的超大内存输入流

输入流输出流是以内存为标准由于某种原因&#xff0c;我需要非常大的&#xff0c;甚至可能是无限的InputStream &#xff0c;它会反复地反复返回相同的byte[] 。 这样&#xff0c;我可以通过重复小样本来产生疯狂的大数据流。 可以在Guava中找到类似的功能&#xff1a; Iterabl…