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? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章