【问题标题】:Java library to parse text and count number of unique words? [closed]Java 库来解析文本并计算唯一单词的数量? [关闭]
【发布时间】:2015-03-27 09:23:35
【问题描述】:

我想计算一些文本中使用了多少个独特的词。棘手的部分是,我想将一个单词的不同形式视为一个单词。示例:

I work.
He works.
I am working.
I have worked.

本文中唯一的词就是这 5 个:[I, work, He, am, have] 因为一个(同一个)词有 4 种不同的形式 - work。

我想我需要一些字典或一些图书馆,但经过一番谷歌搜索后没有找到任何东西。任何人都可以帮助我吗?谢谢!

PS:我知道有些词是完全一样的,但是它们的意思是不同的。 (例如:当他离开家时,树叶会覆盖地面)。无论如何,请忽略此类情况 - 很难涵盖它们 + 它们很少见,不会显着影响结果。

【问题讨论】:

  • @ryekayo 正则表达式将如何帮助他处理“go”、“goes”、“went”、“gone”? OP,您将如何处理“当他离开家时,叶子将覆盖地面”?重复还是唯一?
  • @RealSkeptic 因为这种情况无法区分,我可以将它们视为相同的词 - 这是可以接受的“错误”。它很少发生,不会对结果产生太大影响。我想要的只是处理最常见的重复单词的情况。
  • 我建议使用英语word stemmer 并找到您语料库的独特根茎。

标签: java parsing dictionary


【解决方案1】:

对于英语,您可以使用来自 lucene 发行版的PorterStemmer。这个想法是为每个单词保留它的词干,并将其存储到一个集合中。

import java.util.HashSet;
import java.util.Set;

import org.tartarus.snowball.ext.PorterStemmer;

public class Test {
    public static void main(String[] args) {
        Set<String> stems = new HashSet<>();

        PorterStemmer stemmer = new PorterStemmer();
        String strings[] = new String[] { "I work.", "He works.",
                "I am working.", "I have worked." };
        for (String s : strings) {
            for (String word : s.split("[\\s\\.]+")) {
                stemmer.setCurrent(word);
                stemmer.stem();
                stems.add(stemmer.getCurrent());
            }
        }
        System.err.println(stems);
    }
}

结果:

[work, have, am, I, He]

如果您决定使用 lucene,您也可以开始使用 lucene 更高级的分词器功能。在上面的例子中,我们只是分割了空格和点字符。

【讨论】:

    【解决方案2】:

    您需要一个stemming 库。我没有直接使用过(仅通过Lucene 的索引过程。有一个API 可以过滤文本中的单词以删除所有相关单词,作为计算频率之前的预处理的一部分。

    但是存在很多实现,例如this one

    【讨论】:

      【解决方案3】:

      根据this page hosted by the Stanford NLP Group,您可以使用 stemminglemmatization 来实现您想要的:

      词干提取通常指的是一种粗略的启发式过程,它会在大多数情况下切断词尾以希望正确地实现这一目标,并且通常包括删除派生词缀。 Lemmatization 通常是指使用词汇和词形分析正确地做事,通常旨在仅删除屈折词尾并返回单词的基本形式或字典形式,这被称为引理

      从该页面提供的所有链接中,唯一有效的是PorterStemmer,其用法在另一个答案中进行了说明。

      对于 lemmatizer,请参阅 this question here on SO,它建议您使用 Stanford Core NLP library

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多