【问题标题】:Are there APIs for text analysis/mining in Java? [closed]Java 中是否有用于文本分析/挖掘的 API? [关闭]
【发布时间】:2011-10-11 15:30:04
【问题描述】:

我想知道是否有 API 可以在 Java 中进行文本分析。可以提取文本中的所有单词、单独的单词、表达式等的东西。可以告知找到的单词是否是数字、日期、年份、名称、货币等的东西。

我现在开始文本分析,所以我只需要一个 API 即可启动。我做了一个网络爬虫,现在我需要一些东西来分析下载的数据。需要方法来统计页面中的单词数、相似词、数据类型以及与文本相关的其他资源。

Java 中是否有用于文本分析的 API?

编辑:文本挖掘,我想挖掘文本。提供此功能的 Java API。

【问题讨论】:

  • 在这个线程stackoverflow.com/questions/3778388/…有一些很好的答案@
  • 我想从下载的页面中提取电影信息。诸如头衔、演员、年份、导演等信息。
  • @Renato Dinhani Conceição 您下载的所有页面是否都有共同的 html 结构? (模板网页?)
  • @stemm 是的,它们都是 HTML。我正在避免其他类型。
  • @Renato Dinhani Conceição 我的意思是:您的所有页面都有模板化的 html 结构吗?要从文本中提取重要信息,您需要在其中找到信息量最大的部分。例如 - 如果您的页面具有模板结构,它会比处理原始文本更简单。

标签: java api nlp analysis text-mining


【解决方案1】:

您似乎正在寻找Named Entity Recogniser

你有几个选择。

CRFClassifier 来自斯坦福自然语言处理组,是命名实体识别器的 Java 实现。

GATE (General Architecture for Text Engineering),用于语言处理的开源套件。看看开发者页面上的截图:http://gate.ac.uk/family/developer.html。它应该让您简要了解这可以做什么。 video tutorial 让您更好地了解该软件的功能。

您可能需要自定义其中之一以满足您的需求。

您还有其他选择:


关于CRFClassifier的训练,你可以找到brief explanation at their FAQ

...训练数据应该在制表符分隔的列中,并且您 通过映射定义这些列的含义。一栏应该是 称为“答案”并具有NER类,并且现有功能知道 关于“单词”和“标签”等名称。您定义数据文件、地图、 以及通过属性文件生成哪些功能。有 关于什么具有不同属性的大量文档 在 NERFeatureFactory 的 Javadoc 中生成,尽管最终你 有的问题得去源码回答。。。

您还可以在javadoc of CRFClassifier 找到代码 sn-p:

典型的命令行用法

使用提供的序列化分类器运行经过训练的模型 文本文件:

java -mx500m edu.stanford.nlp.ie.crf.CRFClassifier -loadClassifier conll.ner.gz -textFile samplesentences.txt

在属性文件中指定所有参数时(训练、测试或 运行时):

java -mx1g edu.stanford.nlp.ie.crf.CRFClassifier -prop propFile

从命令行训练和测试一个简单的 NER 模型:

java -mx1000m edu.stanford.nlp.ie.crf.CRFClassifier -trainFile trainFile -testFile testFile -macro > output

【讨论】:

  • 你能提供从 CRFClassifier 到训练和分类的代码示例吗?
  • 我自己没有使用过这个库,但我确实找到了一些关于它的文档,尽管有些零散。见上面的补充信息...
  • 我正在使用 CRFClassifier。看起来很容易配置。
【解决方案2】:

我宁愿改编 Lucene 的 Analysis 和 Stemmer 类,也不愿重新发明轮子。他们涵盖了绝大多数案件。另请参阅附加和贡献类。

【讨论】:

    【解决方案3】:

    例如 - 您可以使用标准库 java.text 中的一些类,或者使用 StreamTokenizer(您可以根据自己的要求对其进行自定义)。但如您所知 - 来自互联网来源的文本数据通常有很多拼写错误,为了获得更好的性能,您必须使用类似 fuzzy tokenizer - java.text 和其他标准实用程序在这种情况下的能力太有限了

    所以,我建议您使用 正则表达式 (java.util.regex) 并根据您的需要创建自己的分词器。

    附言 根据您的需要 - 您可以创建状态机解析器来识别原始文本中的模板化部分。您可能会在下图中看到简单的状态机识别器(您可以构建更高级的解析器,它可以识别文本中更复杂的模板)。

    【讨论】:

      【解决方案4】:

      我也建议查看LingPipe。如果你对 web 服务没问题,那么this article 对不同的 API 有很好的总结

      【讨论】:

        【解决方案5】:

        如果您要处理大量数据,也许 Apache 的Lucene 会帮助您满足您的需求。

        否则,创建自己的 Analyzer 类可能最简单,该类严重依赖于标准 Pattern 类。这样,您可以控制将哪些文本视为单词、边界、数字、日期等。例如,20110723 是日期还是数字?您可能需要实现多遍解析算法以更好地“理解”数据。

        【讨论】:

          猜你喜欢
          • 2019-06-04
          • 2011-01-19
          • 2017-11-21
          • 2011-12-22
          • 2011-02-16
          • 1970-01-01
          • 2017-03-20
          • 1970-01-01
          • 2012-06-25
          相关资源
          最近更新 更多