语料库
本文语料库特指文本分类语料库,对应IDataSet接口。而文本分类语料库包含两个概念:文档和类目。一个文档只属于一个类目,一个类目可能含有多个文档。比如搜狗文本分类语料库迷你版.zip,下载前请先阅读搜狗实验室数据使用许可协议。
用Map描述
这种关系可以用Java的Map<String, String[]>来描述,其key代表类目,value代表该类目下的所有文档。用户可以利用自己的文本读取模块构造一个Map<String, String[]>形式的中间语料库,然后利用IDataSet#add(java.util.Map<java.lang.String,java.lang.String[]>)接口将其加入到训练语料库中。
用文件夹描述
这种树形结构也很适合用文件夹描述,即:
/**
* 加载数据集
*
* @param folderPath 分类语料的根目录.目录必须满足如下结构:<br>
* 根目录<br>
* ├── 分类A<br>
* │ └── 1.txt<br>
* │ └── 2.txt<br>
* │ └── 3.txt<br>
* ├── 分类B<br>
* │ └── 1.txt<br>
* │ └── ...<br>
* └── ...<br>
* 文件不一定需要用数字命名,也不需要以txt作为后缀名,但一定需要是文本文件.
* @param charsetName 文件编码
* @return
* @throws IllegalArgumentException
* @throws IOException
*/
IDataSet load(String folderPath, String charsetName) throws IllegalArgumentException, IOException;
例如:
每个分类里面都是一些文本文档。任何满足此格式的语料库都可以直接加载。
数据集实现
考虑到大规模训练的时候,文本数量达到千万级,无法全部加载到内存中,所以本系统实现了基于文件系统的FileDataSet。同时,在服务器资源许可的情况下,可以使用基于内存的MemoryDataSet,提高加载速度。两者的继承关系如下:
训练
训练指的是,利用给定训练集寻找一个能描述这种语言现象的模型的过程。开发者只需调用train接口即可,但在实现中,有许多细节。
分词
目前,本系统中的分词器接口一共有两种实现:
但文本分类是否一定需要分词?答案是否定的。 我们可以顺序选取文中相邻的两个字,作为一个“词”(术语叫bigram)。这两个字在数量很多的时候可以反映文章的主题(参考清华大学2016年的一篇论文《Zhipeng Guo, Yu Zhao, Yabin Zheng, Xiance Si, Zhiyuan Liu, Maosong Sun. THUCTC: An Efficient Chinese Text Classifier. 2016》)。这在代码中对应BigramTokenizer. 当然,也可以采用传统的分词器,如HanLPTokenizer。 另外,用户也可以通过实现ITokenizer来实现自己的分词器,并通过IDataSet#setTokenizer来使其生效。
特征提取
特征提取指的是从所有词中,选取最有助于分类决策的词语。理想状态下所有词语都有助于分类决策,但现实情况是,如果将所有词语都纳入计算,则训练速度将非常慢,内存开销非常大且最终模型的体积非常大。
本系统采取的是卡方检测,通过卡方检测去掉卡方值低于一个阈值的特征,并且限定最终特征数不超过100万。
调参
对于贝叶斯模型,没有超参数需要调节。
训练
本系统实现的训练算法是朴素贝叶斯法,无需用户关心内部细节。另有一个子项目实现了支持向量机文本分类器,可供参考。由于依赖了第三方库,所以没有集成在本项目中。相关性能指标如下表所示:
模型
训练之后,我们就得到了一个模型,可以通过IClassifier#getModel获取到模型的引用。该接口返回一个AbstractModel对象,该对象实现了Serializable接口,可以序列化到任何地方以供部署。 反序列化后的模型可以通过如下方式加载并构造分类器:
NaiveBayesModel model = (NaiveBayesModel) IOUtil.readObjectFrom(MODEL_PATH);
NaiveBayesClassifier naiveBayesClassifier = new NaiveBayesClassifier(model);
分类
通过加载模型,我们可以得到一个分类器,利用该分类器,我们就可以进行文本分类了。
IClassifier classifier = new NaiveBayesClassifier(model);
目前分类器接口中与文本分类有关的接口有如下三种:
/**
* 预测分类
*
* @param text 文本
* @return 所有分类对应的分值(或概率, 需要enableProbability)
* @throws IllegalArgumentException 参数错误
* @throws IllegalStateException 未训练模型
*/
Map<String, Double> predict(String text) throws IllegalArgumentException, IllegalStateException;
/**
* 预测分类
* @param document
* @return
*/
Map<String, Double> predict(Document document) throws IllegalArgumentException, IllegalStateException;
/**
* 预测分类
* @param document
* @return
* @throws IllegalArgumentException
* @throws IllegalStateException
*/
double[] categorize(Document document) throws IllegalArgumentException, IllegalStateException;
/**
* 预测最可能的分类
* @param document
* @return
* @throws IllegalArgumentException
* @throws IllegalStateException
*/
int label(Document document) throws IllegalArgumentException, IllegalStateException;
/**
* 预测最可能的分类
* @param text 文本
* @return 最可能的分类
* @throws IllegalArgumentException
* @throws IllegalStateException
*/
String classify(String text) throws IllegalArgumentException, IllegalStateException;
/**
* 预测最可能的分类
* @param document 一个结构化的文档(注意!这是一个底层数据结构,请谨慎操作)
* @return 最可能的分类
* @throws IllegalArgumentException
* @throws IllegalStateException
*/
String classify(Document document) throws IllegalArgumentException, IllegalStateException;
classify方法直接返回最可能的类别的String形式,而predict方法返回所有类别的得分(是一个Map形式,键是类目,值是分数或概率),categorize方法返回所有类目的得分(是一个double数组,分类得分按照分类名称的字典序排列),label方法返回最可能类目的字典序。
线程安全性
类似于HanLP的设计,以效率至上,本系统内部实现没有使用任何线程锁,但任何预测接口都是线程安全的(被设计为不储存中间结果,将所有中间结果放入参数栈中)。
情感分析
可以利用文本分类在情感极性语料上训练的模型做浅层情感分析。目前公开的情感分析语料库有:中文情感挖掘语料-ChnSentiCorp,语料发布者为谭松波。
接口与文本分类完全一致,请参考com.hankcs.demo.DemoSentimentAnalysis。
性能指标
一般来讲,受到语料库质量的约束(部分语料库的分类标注模糊或有重叠),我们评测一个分类器时,必须严谨地注明在哪个语料库以何种比例分割数据集下得到这样的测试结果。
版本库中有一个在搜狗语料库上的测试com.hankcs.demo.DemoTextClassificationFMeasure,含有完整的参数,请自行运行评估。
相关推荐
- **文本分类**:通过词性的统计分析,可以提取文本的主题特征,用于新闻分类、情感分析等任务。 - **信息抽取**:识别专有名词和关键词,有助于提取关键信息,如人名、地名等。 - **机器翻译**:词性的识别有助...
6. **情感分析**:通过对文本情感倾向的判断,pyhanlp可以帮助分析用户评论、社交媒体数据等,为企业决策提供数据支持。 7. **自定义词典**:用户可以根据需要添加或修改词典,以适应特定领域的文本处理需求。 在...
6. **情感分析**:通过对文本情感倾向的判断,pyhanlp可以辅助进行情绪识别和用户反馈分析。 在实际使用中,Python开发者可以通过pip安装pyhanlp-0.1.32,然后在代码中导入相关模块,调用预设的方法实现上述功能。...
此外,pyhanlp还可能包含情感分析、文本分类、篇章理解等高级功能,这些都是NLP领域的进阶应用。通过学习和实践这些代码,读者不仅可以掌握基础的NLP技术,还能了解到如何将这些技术应用于实际问题的解决。 总的来...
- **文本分析**:在新闻摘要、情感分析、搜索引擎优化等领域,HanLP的分词和关键词提取功能可以提升内容理解的准确性。 - **智能客服**:在聊天机器人或自动问答系统中,HanLP的命名实体识别和文本分类可以帮助...
安装pyhanlp后,import pyhanlp时报错:FileNotFoundError:[Errno 2] No such file or director:'D:\\proframData\Anaconda2\envs\py3\lib\site-package\pyhanlp\static\hanlp-1.7.4-release.zip',网上下载hanlp-...
pyhanlp-0.1.85-py3-none-any.whl
在Python的世界里,自然语言处理(NLP)是一项关键任务,涉及文本分析、语义理解、情感分析等多个领域。HanLP,由厦门汉云科技有限公司开发,是一款高效、易用的Java NLP库,而在Python中,我们可以通过其提供的...
Pyhanlp是HanLP的Python接口,支持自动下载与升级HanLP,兼容py2、py3。HanLP是一个由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料...
除了以上基本功能,PyHanLP还支持关键词提取、情感分析、自动摘要等多种高级NLP任务。这些功能使得PyHanLP在新闻分析、社交媒体监控、机器翻译等领域有着广泛的应用。 总结来说,".hanlp.zip"压缩包中的".hanlp...
5. **情感分析**:判断文本的情感倾向,如正面、负面或中立,常用于评论和社交媒体数据的分析。 6. **语义理解**:理解文本的深层含义,包括语义角色标注、事件抽取等,这通常需要更复杂的模型和算法。 在`11.5.py...
学习的已于2020年初发布,次世代最先进的多语种NLP技术,与1.x相辅相成,平行发展。 安装 非IT人士可直接使用;新手建议观看 ;工程师请: 先安装和 。要求JDK,操作系统和Python一致。然后,最后执行: conda ...
- 情感分析 ##### 3. 信息抽取 信息抽取是从文本中自动抽取结构化信息的过程,它可以帮助我们快速了解文本的关键信息。 - **信息抽取的步骤**: 1. 文本预处理:分词、词性标注、命名实体识别等。 2. 特征提取...
"4-tag形式"是指NER中的标签体系,常见的有BIO(Begin, Inside, Outside)或者IOB2(与BIO相同,但解决了一种特殊情况,即两个相同的实体相邻时的标签冲突问题)。在这个项目中,可能有四个不同的标签:B-Entity...
通过这些方法的应用与实践,旨在加深学生对自然语言处理(NLP)领域中的文本分词技术的理解。 #### 实验目的与要求 - **掌握隐马尔科夫模型分词**:了解HMM的基本原理及其在中文分词中的应用。 - **掌握感知机模型...
主要用于手动安装python3.6.1对应的jpype1 库。使用pip install wheel 安装wheel成功后,再次安装该文件 pip install ****.whl 即可。
在中文文本中,由于没有明显的空格来区分单词,因此需要借助特定的算法来完成这个任务。**隐马尔可夫模型(Hidden Markov Model, HMM)是一种常用且有效的中文分词方法**。 **隐马尔可夫模型**是概率统计建模工具,...
2. 对问题抽象并提取关键词(pyhanlp模块分词和词性标注,其实我认为如果求简的话,这里可以用jieba替代) 3. 对抽象问句分类得到对应的模板(scikit-learn模块的朴素贝叶斯算法) 4. 根据模板规则到Neo4j数据库中...