ansj添加自定义词典

ansj添加自定义词典,第1张

网上百度了很多,大部分都是说要修改library.properties的文件,但是这个文件我根本找不到。

后来采用的方法是,首先建立起自己的自定义字典文件,格式为 词\t词性\t频数,比如 手机    n    1000

词典建立好后,在进行分词时,加入如下语句:

Forest forest = null

 forest=Library.makeForest(filepath)//filepath为自定义词典路径

String line = "这是一段测试文字"

List<Term>result = NlpAnalysis.parse(line.trim(),forest).getTerms()

输出的结果就是:

这是

一段

测试

文字

最近出于兴趣和需要,重新回顾中文分词技术,期间有些心得,以及一些关于自然语言处理的浅薄之见,这里简单分享一下。

首先, 中文分词_百度百科 里面简单介绍了其中主要的分词算法以及相应的优缺点,包括字符匹配法、统计法以及理解法,其中字符匹配法和统计法比较流行且可以取到相对不错的效果,而理解法则相对比较复杂高级,但是我认为这才是真正解决中文分词任务的根本算法。

如今用于中文分词的算法和模型虽算不上比比皆是,但也算是唾手可得,开源的如jieba、ltp、Hanlp等等,提供中文分词服务的如腾讯云、百度大脑、讯飞AI平台等,以及其他如Jiagu等。

其实这些平台算法的差距并不算太大,分词准确率基本上都是在80%以上,然而在98%以下(这里胡诌个数),在一些不太严格的应用场景下基本已经够用了,只要挑一个在自己的业务场景下表现最好的即可。

在我看来,对于中文分词这项任务而言,最关键最核心的其实并不是算法模型,这些都不是所谓的瓶颈,最重要的其实是高质量、大规模的词典。对于字符匹配法而言,词典是基础,没有词典自然连分都分不出来;对于统计学习法而言,其效果一方面取决于算法和模型的选择,一方面取决于其训练数据的数量与质量,需要堆人力物力,比如找专门的标注公司标注数据等。但是就算是人标的数据,也难免有所错误遗漏,所以在有错误的训练数据下,模型也不可能学的太好,同时训练数据再大,也难以覆盖全部语料,总会出现OOV,总有些句子会训练不到,此时还强求模型可以做到“举一反三”有些不切实际。

词条中还提到了关于中文分词的技术难点:歧义识别与新词识别,关于歧义识别,上面并没有提具体的解决思路,对于新词识别而言,这又是自然语言处理领域很基础并且很重要的点,可以参见一下我之前的文章: 《NLP基础任务之新词发现探索之路》 | lightsmile's Blog ,也有另一个思路,比如说爬取网上一些网站的相关条目,比如百度百科等。

简单看了一下 jieba 、 ansj_seg 、 Jiagu 的分词词典,发现其中jieba的词典质量最差,其中不少词性都是错误的,Jiagu的词典还算不错,就是一些新词不全,ansi_seg的没有细看。

尽管这些工具在一些评测数据的结果可以达到90以上的成绩,但是在我看来,还是不够的,我觉得中文分词这个基础而又艰巨的任务还是要到99%以上才可以,否则分词都分不对,那些在分词基础之上的任务更是不行,毕竟词是基本的语义单元。

然而在现在深度学习盛行的潮流下,许多任务如文本分类、命名实体识别等并不一定需要依赖于分词,直接基于字符(char)的Embedding也可以取得不错的效果,并且也可以规避OOV(out of vocabulary words,未登录词)的问题。

但是深度学习,尤其是监督学习的很关键之处是得有大规模的高质量训练数据,不然巧妇难为无米之炊,再好的模型也难以从垃圾中学到有用的知识。

话说回来,虽然自然语言处理是计算机科学与其他领域的交叉学科,深度学习、机器学习算是人工智能的一部分,然而许多时候往往十分依赖人工,而所谓的智能其实也不智能。

无论是计算机视觉领域里的图像分类还是自然语言处理领域的文本分类,其任务都是学习一个从输入 映射到输出或者说标签 的函数 ,具体来说就是将 表征为多维向量 ,将 表征为多维向量 ,然后让 进入一个模型进行一系列的运算后得到一个 ,通过不断地比较 和 的值并调整模型的参数使模型的运算结果 更为准确即更加贴近 (过程有点类似于 “猜数字”游戏 ),从而最终得到一个近似函数 ,我们就可以用来代替未知的 用于预测未来的样本 ,得到它对应的 。

我们可以发现,以上学习算法确实可以得到能够解决问题的模型,然而局限之处在于它也只能做这个任务,即对输入 预测 ,别的啥也干不了。

同时在基于深度学习的自然语言处理模型中,基本套路都是Embedding+Encoder+Decoder,其中Embedding是基于字还是基于词,是使用预训练词向量还是随机初始化,这些选择所导致的效果的差异都随着训练轮数的增加而最终减小。然而,由于梯度下降以及解空间的特点,基于bert的效果确实是要比Word2Vec的要好,那些词向量确实比Word2Vec的嵌入了(或者说学到了)更多的语言知识。

关于模型的选择和取舍,工业界和学术界的标准其实差别很大。学术界里有的论文是开创性的,而许多论文其实都是在原来基础上小修小改,将最近的较新的思想和算法一堆,实验结果比原来指标高一点又是一篇文章,程序运行占用多大内存、跑了多长时间这些都不是主要因素,也就是一切向指标看齐。

而工业界则更加看重的是性价比,不同的公司、不同的部门、不同的阶段其主要矛盾不同。比如说Facebook之前出的fastText,尽管模型很简单,最终效果可能比不上一些其他复杂的模型,但是其训练速度超快、基于CPU就可以,并且可以很方便地对模型进行压缩。许多时候,一些指标高低差几个点并没有那么关键,模型大小、训练时间、预测时间在很多时候是比较关键的因素,除非由于甲方或客户不满意,或者家大业大,有的是资源,那么这时候效果和指标又成为主要矛盾,这时的优化可能要以一定的时间和空间为代价。

原来的自然语言处理各任务基本上都构建在分词的基础之上,粗略来说有一个 语法 、 语义 到 语用 的递进的过程。这一层一层的任务虽然耦合的很好,但是

这种Pipline将会导致下层的错误都将会被积累到上层,其直接影响就是越到上层其准确率越低,甚至低到惨不忍睹的程度。然而在表示学习,尤其是深度学习崛起以后,其强大的特征学习能力,使得现在的模型多为end-to-end模型,其结果是一方面可以使得相关人员摆脱繁琐的特征工程,可以将特征提取与组合设计的工作交给神经网络模型去隐形完成,大大解放了生产力;令一方面可以将模型视为整体的一部分,即它的输入直接对应原始输入,它的输出直接是我们想要的结果,有点直达病灶的意思,摆脱了原来Pipline错误累积的困境。

不过我个人看来成也end-to-end,败也end-to-end,虽然简化了任务,但是有点太过开门见山,得到的模型一个个都是彼此孤立的,各做各的事情,然而从整体论的角度来看它们都是整个自然语言处理系统的一部分,一些特征本来是可以共享,一些结果是彼此相互依赖的。这也又涉及到参数共享、多任务学习等概念,不细表。由于神经网络的可解释性较差,这使得模型更加像一个黑盒,训练调参的过程更像是在炼丹,因为谁也不知道具体能炼出个什么玩意儿。

如下图很形象地诠释了这一现状:

下面就深度学习下的自然语言处理四大任务进行简单对比(都是个人浅薄之见,难免有不足之处,还望海涵)。自然语言处理四大任务分别是:序列标注、文本分类、句子关系、文本生成。

序列标注任务的原始语料是一连串的句子,经过标注后的语料格式大概如下(以命名实体识别为例):

我们可以发现,每一行的格式都是一个字符以及它所对应的类别,如 B_{type} 、 O ,那么对于每一个字符模型需要预测的类别数量总计为 2*len(types) + 1 ,其中2是指 BI 这种标注规范, len(types) 指类型种类的数量(如人名、地名、机构名共三种),1是指 O 。可以发现模型需要拟合的函数的值域还是很小的,即 O(len(types)) 。

文本分类任务的标注语料格式大概如下(以情感极性分析为例):

每一行的格式都包含原始文本以及它所对应的类别(或者说标签),我们可以发现模型需要预测的类别数量总计为 len(types) ,即类型种类的数量(以新闻语料分类,如 娱乐 、 军事 、 科技 、 体育 等),可以发现模型需要拟合的函数的值域也是较小的,即 O(len(types)) 。

句子关系任务的标注语料格式大致如下(以语句相似度为例):

每一行都是两个句子以及它们的关系( 1 代表语义相同, 0 代表语义不同),我们可以发现模型需要预测的类别数量总计为 len(relations) ,即关系种类的数量,可以发现模型需要拟合的函数的值域也是较小的,即 O(len(relations)) 。

文本生成任务的标注语料格式大致如下(以机器翻译为例):

我们可以发现每一行都是源语言句子以及目标语言的对应翻译。虽然此时模型和序列标注模型一样都需要对于单个样本预测多次,但是序列标注模型需要预测的次数直接等于字符的数量,是确定的,但是文本生成任务模型需要预测的次数是不确定的,并且每次预测的值域都是目标语言所有word(或者character)所组成的整体集合,即 O(len(words)) ,其规模可能是十万级或百万级的。因此我们很容易发现文本生成任务的难度和复杂程度是要远远高于其他任务的。对话任务如生成式闲聊机器人更是如此。

可能是之前的AlphaGo过于吸引广大群众的眼球,做相关业务的公司吹的太厉害,以及“人工智能”、“深度学习”这几个词听起来逼格满满,导致许多外行人认为现在的人工智能已经发展到很厉害的层次,并且可以做各种各样的事情,似乎无所不能。但是内行人心里却明白:“什么人工智能,人工智障吧”、“所谓人工智能,多是智能不够,人工来凑”。外行人看不到深度模型算法的局限性,如许多模型的精度并不能达到那么高;也看不到深度模型算法的前提条件,如高质量、大规模的数据集,他们以为模型大约聪明到随便喂点数据便成为终结者般的存在。这也就导致了他们刚开始预期很高,然而在投资或找到外包后发现效果远远不能达到预期,大失所望而潦草结束或撤资离场的局面。

如下一张图大概有点这个意思:

统观学术界与工业界,和计算机视觉领域相比,自然语言处理这种更深层次的、涉及到认知智能的领域的进展虽悠久但缓慢,并且许多任务目前为止距离真正商用还有很大的距离。然而正是科学史上如阿基米德、牛顿等伟大人物与其他相对无名之辈默默耕耘,前赴后继,才使得如今之人类齐享先辈之成果,即所谓“前人栽树后人乘凉”也。

我辈也无需悲观,须戒骄戒躁,搞算法的就多己见、少盲从,少水论文;搞工程的就多积累经验,提升实践能力,多做高质量的项目。功夫不负有心人。

一、一般处理流程

语料获取 -> 文本预处理 ->特征工程 ->特征选择

1、语料获取

即需要处理的数据及用于模型训练的语料。

数据源可能来自网上爬取、资料积累、语料转换、OCR转换等,格式可能比较混乱。需要将url、时间、符号等无意义内容去除,留下质量相对较高的非结构化数据。

2、文本预处理

将含杂质、无序、不标准的自然语言文本转化为规则、易处理、标准的结构化文本。

①处理标点符号

可通过正则判定、现有工具(zhon包)等方式筛选清理标点符号。

②分词

将连续的自然语言文本,切分成具有语义合理性和完整性的词汇序列的过程。

一般看来英文较容易可通过空格符号分词,中文相对复杂,参考结巴分词、盘古分词、Ansj等工具。

常见的分词算法有:基于字符串匹配的分词方法、基于理解的分词方法、基于统计的分词方法和基于规则的分词方法,每种方法下面对应许多具体的算法。

③词性标注

为自然语言文本中的每个词汇赋予一个词性的过程,如名词、动词、副词等。可以把每个单词(和它周围的一些额外的单词用于上下文)输入预先训练的词性分类模型。

常用隐马尔科夫模型、N 元模型、决策树

④stop word

英文中含大量 a、the、and,中文含大量 的、是、了、啊,这些语气词、助词没有明显的实际意义,反而容易造成识别偏差,可适当进行过滤。

⑤词形还原

偏向于英文中,单数/复数,主动/被动,现在进行时/过去时/将来时等,还原为原型。

⑥统计词频

因为一些频率过高/过低的词是无效的,对模型帮助很小,还会被当做噪声,做个词频统计用于停用词表。

⑦给单词赋予id

给每一个单词一个id,用于构建词典,并将原来的句子替换成id的表现形式

⑧依存句法分析

通过分析句子中词与词之间的依存关系,从而捕捉到词语的句法结构信息(如主谓、动宾、定中等结构关系),并使用树状结构来表示句子的句法结构信息(如主谓宾、定状补等)。

3、特征工程

做完语料预处理之后,接下来需要考虑如何把分词之后的字和词语表示成计算机能够计算的类型。

如果要计算我们至少需要把中文分词的字符串转换成数字,确切的说应该是数学中的向量。有两种常用的表示模型分别是词袋模型和词向量。

①词向量

词向量是将字、词语转换成向量矩阵的计算模型。目前为止最常用的词表示方法是 One-hot,这种方法把每个词表示为一个很长的向量。

②词袋模型

即不考虑词语原本在句子中的顺序,直接将每一个词语或者符号统一放置在一个集合(如 list),然后按照计数的方式对出现的次数进行统计。统计词频这只是最基本的方式,TF-IDF 是词袋模型的一个经典用法。

常用的表示模型有:词袋模型(Bag of Word, BOW),比如:TF-IDF 算法;词向量,比如 one-hot 算法、word2vec 算法等。

4、特征选择

在文本挖掘相关问题中,特征工程也是必不可少的。在一个实际问题中,构造好的特征向量,是要选择合适的、表达能力强的特征。

举个自然语言处理中的例子来说,我们想衡量like这个词的极性(正向情感还是负向情感)。我们可以预先挑选一些正向情感的词,比如good。然后我们算like跟good的PMI,用到点互信息PMI这个指标来衡量两个事物之间的相关性。

特征选择是一个很有挑战的过程,更多的依赖于经验和专业知识,并且有很多现成的算法来进行特征的选择。目前,常见的特征选择方法主要有 DF、 MI、 IG、 CHI、WLLR、WFO 六种。

5、模型训练

在特征向量选择好了以后,接下来要做的事情是根据应用需求来训练模型,我们使用不同的模型,传统的有监督和无监督等机器学习模型,如 KNN、SVM、Naive Bayes、决策树、GBDT、K-means 等模型;深度学习模型比如 CNN、RNN、LSTM、 Seq2Seq、FastText、TextCNN 等。这些模型在分类、聚类、神经序列、情感分析等应用中都会用到。

当选择好模型后,则进行模型训练,其中包括了模型微调等。在模型训练的过程中要注意由于在训练集上表现很好,但在测试集上表现很差的过拟合问题以及模型不能很好地拟合数据的欠拟合问题。同时,也要防止出现梯度消失和梯度爆炸问题。

6、模型评估

在机器学习、数据挖掘、推荐系统完成建模之后,需要对模型的效果做评价。模型的评价指标主要有:错误率、精准度、准确率、召回率、F1 值、ROC 曲线、AUC 曲线等。

7、投产上线

模型的投产上线方式主要有两种:一种是线下训练模型,然后将模型进行线上部署提供服务;另一种是在线训练模型,在线训练完成后将模型 pickle 持久化,提供对外服务。

三、NLP应用方向

1、命名实体识别

指识别自然语言文本中具有特定意义的实体,主要包括人名、地名、机构名、时间日期等。

传统机器学习算法主要有HMM和CRF,深度学习常用QRNN、LSTM,当前主流的是基于bert的NER。

2、情感分析

文本情感分析和观点挖掘(Sentiment Analysis),又称意见挖掘(Opinion Mining)是自然语言处理领域的一个重要研究方向。简单而言,是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。

情感分析技术可以分为两类,一类是基于机器学习的方法,通过大量有标注、无标注的主观语料,使用统计机器学习算法,通过提取特征,进行文本情感分析。另一类是基于情感词典的方法,根据情感词典所提供的词的情感极性(正向、负向),从而进行不同粒度的(词语、短语、属性、句子、篇章)下的文本情感分析。

3、文章标签

文章标签是利用机器学习算法,对文章进行文字和语义的分析后,提取出若干个重要的词或者短语(关键短语)。关键短语是NLP基础的算法模块,有了关键短语,能为后续的搜索、推荐等更高级的应用提供有力的抓手。

适用场景:1、个性化推荐:通过对文章的标签计算,结合用户画像,精准的对用户进行个性化推荐;2、话题聚合:根据文章计算的标签,聚合相同标签的文章,便于用户对同一话题的文章进行全方位的信息阅读;3、搜索:使用中心词可以对query进行相似度计算、聚类、改写等,可以用于搜索相关性计算。

4、案件串并

①信息抽取

运用实体抽取、关系抽取,从案情中抽取关键信息,如从警情中可以抽取报警人项目、报警人电话、案发地址等信息

②实体对齐

相同的实体在不同的案情中会有不同的表述,会给串并带来困难。可针对地址、人名、组织名进行对齐处理。

③文本聚类

对于关键片段类信息,无法像实体那样对齐,需要借助文本聚类技术进行关联。

④构建图谱

将信息抽取结果存入图谱。每个警情id对应一个节点,实体、属性、关键片段作为节点,对齐的实体、同一类的文本存为同一个节点。

除了来自于从警情中抽取的信息,还可以将其他警务系统中存在的结构化数据导入(如来自户籍信息的人物关系),从而丰富图谱。

⑤图谱检索

完成以上工作,即完成了案件串并的必要基础建设,接下来通过图谱的查询功能自动完成案件的串并。首先需要设定串并的条件,案件串并的条件在警务实战中已有很多的积累,如“具有相似的作案手段”,又如“相似作案手段,嫌疑人有共同联系人”,只需要将这些条件用图谱查询语言表达出来。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7870214.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存