Java 中是不是有用于文本分析/挖掘的 API? [关闭]

Posted

技术标签:

【中文标题】Java 中是不是有用于文本分析/挖掘的 API? [关闭]【英文标题】: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。

【问题讨论】:

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

您似乎正在寻找Named Entity Recogniser。

你有几个选择。

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

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

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

您还有其他选择:

通过 Web 服务进行简单的文本提取:例如Tagthe.net 和 Yahoo's Term Extractor。 part-of-speech (POS) tagging:从文本中提取词性(例如动词、名词)。这是关于 SO 的帖子:What is a good Java library for Parts-Of-Speech tagging?。

关于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 是日期还是数字?您可能需要实现多遍解析算法以更好地“理解”数据。

【讨论】:

以上是关于Java 中是不是有用于文本分析/挖掘的 API? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

头条数据挖掘总结

如何从海量的文本中挖掘有用信息:文本挖掘及应用技巧

从海量的文本中挖掘有用信息:文本挖掘及应用技巧 学术中国第十二期文本挖掘技能研习营

数据挖掘技术全套

论文泛读82上下文嵌入空间中用于文本分类的流形外正则化

文本挖掘篇|利用SVM进行短文本分类