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

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

背景

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类:

    @Override
        public 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;
        }

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

@Test
    public 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 same
        Assert.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来提取关键字并计算文本之间的相似度。

资源:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值