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

背景

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

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

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

  1. 文本分类的14种算法

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 之前介绍了14种文本分类中的常用算法,包括8种传统算法:k临近.决策树.多层感知器.朴素贝叶斯 ...

  2. 文本分类模型_多标签文本分类、情感倾向分析、文本实体抽取模型如何定制?...

    文心(ERNIE)是依托百度深度学习平台飞桨打造的语义理解技术与平台,集先进的预训练模型.全面的NLP算法集.端到端开发套件和平台化服务于一体,为企业和开发者提供一整套NLP定制与应用能力.在2020 ...

  3. 文本分类的14种算法(1)

    文本分类的14种算法(1): 前期的数据处理及算法的评价指标选取 训练集和测试集采用了 上一篇文章中的数据集: https://blog.csdn.net/qq_43012160/article/de ...

  4. 文本分类的14种算法总结

    文本分类的14种算法总结 之前介绍了14种文本分类中的常用算法,包括8种传统算法:k临近.决策树.多层感知器.朴素贝叶斯(包括伯努利贝叶斯.高斯贝叶斯和多项式贝叶斯).逻辑回归和支持向量机:4种集成学 ...

  5. 文本分类的14种算法(2)

    文本分类的14种算法(2): 部分常用文本分类算法 决策树 决策树从根结点开始,根据待分类数据的某一特征的取值对其进行划分,分配到相应子结点.像这样递归进行,直到到达叶结点.那么如何判定最优特征呢? ...

  6. 文本分类的14种算法(3)

    文本分类的14种算法(3): 部分常用文本分类算法 k临近算法 所谓临近,就是指对于测试样本,找出训练集中与他最相似的一个样本,并将该样本的结果当作测试样本的结果输出.k临近算法利用"距离& ...

  7. 文本分类(下) | 卷积神经网络(CNN)在文本分类上的应用

    正文共3758张图,4张图,预计阅读时间18分钟. 1.简介 原先写过两篇文章,分别介绍了传统机器学习方法在文本分类上的应用以及CNN原理,然后本篇文章结合两篇论文展开,主要讲述下CNN在文本分类上的 ...

  8. Python文本分类(不涉及算法)

    Python文本分类 ** 首先下载安装,用到的库有pandas和jieba库 这个文本分类很简单,并不涉及算法 ** 源数据是二个excel文件,大约7000条数据,首先把二个文件进行合并成一个DF ...

  9. 文本分类之特征简约算法说明

    见 http://blog.csdn.net/aalbertini/archive/2010/07/20/5749883.aspx 用数值衡量某个特征的重要性. 1 df: 用df衡量重要性. df就 ...

最新文章

  1. LSGO:祝大家新年快乐!
  2. 如何在Python中将字典键作为列表返回?
  3. 【cropper】限制图片大小
  4. java set第n位_Java学习路线:float在内存中的存储
  5. gnu screen的用法
  6. Linux 内核漏洞可用于逃逸 Kubernetes 容器
  7. python免费教程视频-微软推出 Python 免费在线教程视频
  8. 飞翔 nyoj195(贪心or 动态)
  9. 汽车行业中SOP和PT是什么意思?
  10. wdf中的两个宏WDF_DECLARE_CONTEXT_TYPE WDF_DECLARE_CONTEXT_TYPE_WITH_NAME
  11. HTTPS的原理与具体实现过程及HTTP服务的虚拟目录简介
  12. 图像处理的一些相关知识(Related knowledge for IQA)
  13. AWS亚马逊云注册图文详细教程,多币种充值优势分析
  14. ShaderJoy —— 心形爆炸烟花效果【GLSL】
  15. REDIS哨兵【Sentinel】模式+哨兵的核心知识点+redis哨兵主从切换的数据丢失问题+上一章铺垫的【异步复制数据丢失问题】+【集群脑裂】
  16. 审计学习-审计概述02(政府审计和注册会计师审计+职业责任和期望差距+审计报告和信息差距+审计五要素+三方关系人+责任方责任+审计报告预期使用者+鉴证对象+披露+财报编制基础)
  17. [USACO 07NOV]防晒霜Sunscreen {贪心}
  18. 【前端面试】div和p标签都是块级元素,有什么区别?
  19. CentOS + Flask +Python +MySql 部署网站运行在阿里云笔记
  20. K歌宝全国产化电子元件推荐方案

热门文章

  1. nssl1256-C(盟主的忧虑)【并查集】
  2. 【dfs】简单游戏(jzoj 2121)
  3. Codeforces 刷题记录(已停更)
  4. 动态规划训练18 [免费馅饼 HDU - 1176 ]
  5. JVM运行时区域详解
  6. 2017派卧底去阿里、京东、美团、滴滴带回来的面试题
  7. “温室里的花朵”也要直面困难
  8. ssm使用全注解实现增删改查案例——web.xml
  9. ssh(Spring+Spring mvc+hibernate)——applicationContext.xml
  10. java实现加密电话号码,有具体的加密流程注释