❶ hanlp可以使用python调用吗
安装JDK
JPype并没有像IKVM那样实现自己的JVM,而是以pipe方式调用原生JVM。所以我们需要一个JVM,比如:
Oracle JDK
OpenJDK
安装JDK非常简单,分清楚32位和64位即可,必须与OS和Python的位数一致,具体安装过程不再赘述。
唯一需要注意的是,必须设置环境变量java_HOME到JDK的根目录,JDK的安装程序不一定会帮你做这一步。
安装编译工具链
Python的package一般是以源码形式发布的,其中一些C代码必须在用户机器上编译,所以需要安装编译工具链。当然你也可以跳过这步,直接下载binary。
Windows
安装免费的Visual C++ Express 2010。
Debian/Ubuntu
sudo apt-get install g++
Red Hat/Fedora
su -c 'yum install gcc-c++'
安装JPype
本文读者应该都是Python程序员,所以略过了安装Python这一步。不过必须注意的是,JPype版本与Python的对应兼容关系:
Python2.x:JPype
Python3.x:JPype1-py3
使用setup.py安装
下载源码后解压,在目录下运行:
*nix
sudo python3 setup.py install
Windows
python setup.py install
直接下载binary
当然你也可以选择下载binary,比如JPype1-py3主页上的binary列表。
在Pycharm中安装
如果你正在使用Pycharm这款IDE的话,那么事情就简单多了。
首先在Project Interpreter里面点击加号:
搜索JPype,选择你需要的版本安装:
稍等片刻就安装成功了:
测试安装结果
终于又到了写代码的开心时间了,可以通过如下代码测试是否安装成功:
from jpype import *startJVM(getDefaultJVMPath())java.lang.System.out.println("hello world")shutdownJVM()
输出如下结果表示安装成功:
hello worldJVM activity report : classes loaded : 31JVM has been shutdown
调用HanLP
关于HanLP
HanLP是
一个致力于向生产环境普及NLP技术的开源Java工具包,支持中文分词(N-最短路分词、CRF分词、索引分词、用户自定义词典、词性标注),命名实体
识别(中国人名、音译人名、日本人名、地名、实体机构名识别),关键词提取,自动摘要,短语提取,拼音转换,简繁转换,文本推荐,依存句法分析
(MaxEnt依存句法分析、神经网络依存句法分析)。
下载HanLP
你可以直接下载Portable版的jar,零配置。
也可以使用自定义的HanLP——HanLP由3部分组成:类库hanlp.jar包、模型data包、配置文件hanlp.properties,请前往项目主页下载最新版:https://github.com/hankcs/HanLP/releases。对于非portable版,下载后,你需要编辑配置文件第一行的root指向data的父目录,详见文档。
这里,假设新建了一个目录(假定为C:\hanlp),把hanlp.jar和hanlp.properties(portable版的话,仅需一个hanlp-portable.jar)放进去:
Python调用
下面是一份Python3的调用示例:
# -*- coding:utf-8 -*-
# Filename: main.py
# Author:hankcs
# Date: 2015/11/26 14:16
from jpype import *
startJVM(getDefaultJVMPath(), "-Djava.class.path=C:\hanlp\hanlp-1.2.8.jar;C:\hanlp", "-Xms1g", "-Xmx1g")
HanLP = JClass('com.hankcs.hanlp.HanLP')
# 中文分词
print(HanLP.segment('你好,欢迎在Python中调用HanLP的API'))
testCases = [
"商品和服务",
"结婚的和尚未结婚的确实在干扰分词啊",
"买水果然后来世博园最后去世博会",
"中国的首都是北京",
"欢迎新老师生前来就餐",
"工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作",
"随着页游兴起到现在的页游繁盛,依赖于存档进行逻辑判断的设计减少了,但这块也不能完全忽略掉。"]
for sentence in testCases: print(HanLP.segment(sentence))
# 命名实体识别与词性标注
NLPTokenizer = JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
print(NLPTokenizer.segment('中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程'))
# 关键词提取
document = "水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露," \
"根据刚刚完成了水资源管理制度的考核,有部分省接近了红线的指标," \
"有部分省超过红线的指标。对一些超过红线的地方,陈明忠表示,对一些取用水项目进行区域的限批," \
"严格地进行水资源论证和取水许可的批准。"
print(HanLP.extractKeyword(document, 2))
# 自动摘要
print(HanLP.extractSummary(document, 3))
# 依存句法分析
print(HanLP.parseDependency("徐先生还具体帮助他确定了把画雄鹰、松鼠和麻雀作为主攻目标。"))
shutdownJVM()
❷ crf++在windows下怎么运行
把你下载的CRF++的工具包里面的crf_learn.exe,crf_test.exe 和libcrfpp.dll文件复制到你这个目录下面就可以调用了该命令了。
❸ Python类库丰富但不支持中文
编码问题。
调用路径的那个函数默认用unicode。可以试试新建文本,文本保存时选择编码gbk系列的。然后重新输入代码,写coding是gbk。然后使用unicode(path,gbk)。
jieba是中文分词工具。snownlp,用于处理中文文本库。loso是中文分词函数库。genius是中文CRF基础库。
❹ python 命名实体识别怎么计算准确率 召回率
目前算法方面主流就是CRF了
效率一般
2类(不包括非专名)
几W
query/s
4类
就下降到1W-2W
query/s了
更多类别的就更少了
当然这个是优化过的crf++了
而且命名实体识别
算法不是对所有类别的都合适
比如音乐和电影
CRF的效果就不好
但是人名
地名
机构名还不错
所以工程上即使用CRF
也会使用词典+消歧的策略
!
❺ 安装Python的crf++时候遇到的错误
第一步 你会缺少crfpp.h,直接从/CRF++-0.58目录下复制过来就行
第二步 你会缺少crfpp.lib 需要自己vs编译生成比较麻烦 我已生成好了,可直接使用
第三步 你会缺少pthread.lib 也是直接提供文件下载就行
第四步 python setup.py build
python setup.py install
正常运行,但import CRFPP调用时提示缺少dll,此时复制windows包下的/CRF++-0.58的libcrfpp.dll到python\Lib\site-packages目录下即可
此时配置完成
❻ 有谁用过crf++或crfsuite工具包吗,python上用的,win7系统
文档上不是有说明吗?有SWIG interface的版本。在它的例子目录里有chunking.py, pos.py, ner.py, template.py等。你自己挑一个试试不就成了。
在swig/python目录里有一个readme,你参考着做一次编译就可以成生。
#!/usr/bin/envpython
importcrfsuite
importsys
#Inheritcrfsuite.Trainertoimplementmessage()function,whichreceives
#.
classTrainer(crfsuite.Trainer):
defmessage(self,s):
#.
sys.stdout.write(s)
definstances(fi):
xseq=crfsuite.ItemSequence()
yseq=crfsuite.StringList()
forlineinfi:
line=line.strip(' ')
ifnotline:
#.
yieldxseq,tuple(yseq)
xseq=crfsuite.ItemSequence()
yseq=crfsuite.StringList()
continue
#SplitthelinewithTABcharacters.
fields=line.split(' ')
#Appendattributestotheitem.
item=crfsuite.Item()
forfieldinfields[1:]:
p=field.rfind(':')
ifp==-1:
#Unweighted(weight=1)attribute.
item.append(crfsuite.Attribute(field))
else:
#Weightedattribute
item.append(crfsuite.Attribute(field[:p],float(field[p+1:])))
#.
xseq.append(item)
#.
yseq.append(fields[0])
if__name__=='__main__':
#.
printcrfsuite.version()
#CreateaTrainerobject.
trainer=Trainer()
#,andsetthemtotrainer.
forxseq,yseqininstances(sys.stdin):
trainer.append(xseq,yseq,0)
#UseL2-regularizedSGDand1st-orderdyadfeatures.
trainer.select('l2sgd','crf1d')
#.
fornameintrainer.params():
printname,trainer.get(name),trainer.help(name)
#.1
trainer.set('c2','0.1')
#Starttraining;.message()
#toreporttheprogress.
trainer.train(sys.argv[1],-1)
❼ 有哪位用过python的CRFsuite工具包么python2.7,Windows系统,测试文件运行不成功,应该怎么使用
在swig/python目录里有一个readme,你参考着做一次编译就可以成生。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/usr/bin/env python
import crfsuite
import sys
# Inherit crfsuite.Trainer to implement message() function, which receives
# progress messages from a training process.
class Trainer(crfsuite.Trainer):
def message(self, s):
# Simply output the progress messages to STDOUT.
sys.stdout.write(s)
def instances(fi):
xseq = crfsuite.ItemSequence()
yseq = crfsuite.StringList()
for line in fi:
line = line.strip('\n')
if not line:
# An empty line presents an end of a sequence.
yield xseq, tuple(yseq)
xseq = crfsuite.ItemSequence()
yseq = crfsuite.StringList()
continue
# Split the line with TAB characters.
fields = line.split('\t')
# Append attributes to the item.
item = crfsuite.Item()
for field in fields[1:]:
p = field.rfind(':')
if p == -1:
# Unweighted (weight=1) attribute.
item.append(crfsuite.Attribute(field))
else:
# Weighted attribute
item.append(crfsuite.Attribute(field[:p], float(field[p+1:])))
# Append the item to the item sequence.
xseq.append(item)
# Append the label to the label sequence.
yseq.append(fields[0])
if __name__ == '__main__':
# This demonstrates how to obtain the version string of CRFsuite.
print crfsuite.version()
# Create a Trainer object.
trainer = Trainer()
# Read training instances from STDIN, and set them to trainer.
for xseq, yseq in instances(sys.stdin):
trainer.append(xseq, yseq, 0)
# Use L2-regularized SGD and 1st-order dyad features.
trainer.select('l2sgd', 'crf1d')
# This demonstrates how to list parameters and obtain their values.
for name in trainer.params():
print name, trainer.get(name), trainer.help(name)
# Set the coefficient for L2 regularization to 0.1
trainer.set('c2', '0.1')
# Start training; the training process will invoke trainer.message()
# to report the progress.
trainer.train(sys.argv[1], -1)
❽ Python中文分词的原理你知道吗
中文分词,即 Chinese Word Segmentation,即将一个汉字序列进行切分,得到一个个单独的词。表面上看,分词其实就是那么回事,但分词效果好不好对信息检索、实验结果还是有很大影响的,同时分词的背后其实是涉及各种各样的算法的。
中文分词与英文分词有很大的不同,对英文而言,一个单词就是一个词,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,需要人为切分。根据其特点,可以把分词算法分为四大类:
基于规则的分词方法
基于统计的分词方法
基于语义的分词方法
基于理解的分词方法
下面我们对这几种方法分别进行总结。
基于规则的分词方法
这种方法又叫作机械分词方法、基于字典的分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配。若在词典中找到某个字符串,则匹配成功。该方法有三个要素,即分词词典、文本扫描顺序和匹配原则。文本的扫描顺序有正向扫描、逆向扫描和双向扫描。匹配原则主要有最大匹配、最小匹配、逐词匹配和最佳匹配。
最大匹配法(MM)。基本思想是:假设自动分词词典中的最长词条所含汉字的个数为 i,则取被处理材料当前字符串序列中的前 i 个字符作为匹配字段,查找分词词典,若词典中有这样一个 i 字词,则匹配成功,匹配字段作为一个词被切分出来;若词典中找不到这样的一个 i 字词,则匹配失败,匹配字段去掉最后一个汉字,剩下的字符作为新的匹配字段,再进行匹配,如此进行下去,直到匹配成功为止。统计结果表明,该方法的错误率 为 1/169。
逆向最大匹配法(RMM)。该方法的分词过程与 MM 法相同,不同的是从句子(或文章)末尾开始处理,每次匹配不成功时去掉的是前面的一个汉字。统计结果表明,该方法的错误率为 1/245。
逐词遍历法。把词典中的词按照由长到短递减的顺序逐字搜索整个待处理的材料,一直到把全部的词切分出来为止。不论分词词典多大,被处理的材料多么小,都得把这个分词词典匹配一遍。
设立切分标志法。切分标志有自然和非自然之分。自然切分标志是指文章中出现的非文字符号,如标点符号等;非自然标志是利用词缀和不构成词的词(包 括单音词、复音节词以及象声词等)。设立切分标志法首先收集众多的切分标志,分词时先找出切分标志,把句子切分为一些较短的字段,再用 MM、RMM 或其它的方法进行细加工。这种方法并非真正意义上的分词方法,只是自动分词的一种前处理方式而已,它要额外消耗时间扫描切分标志,增加存储空间存放那些非 自然切分标志。
最佳匹配法(OM)。此法分为正向的最佳匹配法和逆向的最佳匹配法,其出发点是:在词典中按词频的大小顺序排列词条,以求缩短对分词词典的检索时 间,达到最佳效果,从而降低分词的时间复杂度,加快分词速度。实质上,这种方法也不是一种纯粹意义上的分词方法,它只是一种对分词词典的组织方式。OM 法的分词词典每条词的前面必须有指明长度的数据项,所以其空间复杂度有所增加,对提高分词精度没有影响,分词处理的时间复杂度有所降低。
此种方法优点是简单,易于实现。但缺点有很多:匹配速度慢;存在交集型和组合型歧义切分问题;词本身没有一个标准的定义,没有统一标准的词集;不同词典产生的歧义也不同;缺乏自学习的智能性。
基于统计的分词方法
该方法的主要思想:词是稳定的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻出现的概率或频率能较好地反映成词的可信度。可以对训练文本中相邻出现的各个字的组合的频度进行统计,计算它们之间的互现信息。互现信息体现了汉字之间结合关系的紧密程度。当紧密程 度高于某一个阈值时,便可以认为此字组可能构成了一个词。该方法又称为无字典分词。
该方法所应用的主要的统计模型有:N 元文法模型(N-gram)、隐马尔可夫模型(Hiden Markov Model,HMM)、最大熵模型(ME)、条件随机场模型(Conditional Random Fields,CRF)等。
在实际应用中此类分词算法一般是将其与基于词典的分词方法结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。
基于语义的分词方法
语义分词法引入了语义分析,对自然语言自身的语言信息进行更多的处理,如扩充转移网络法、知识分词语义分析法、邻接约束法、综合匹配法、后缀分词法、特征词库法、矩阵约束法、语法分析法等。
扩充转移网络法
该方法以有限状态机概念为基础。有限状态机只能识别正则语言,对有限状态机作的第一次扩充使其具有递归能力,形成递归转移网络 (RTN)。在RTN 中,弧线上的标志不仅可以是终极符(语言中的单词)或非终极符(词类),还可以调用另外的子网络名字分非终极符(如字或字串的成词条件)。这样,计算机在 运行某个子网络时,就可以调用另外的子网络,还可以递归调用。词法扩充转移网络的使用, 使分词处理和语言理解的句法处理阶段交互成为可能,并且有效地解决了汉语分词的歧义。
矩阵约束法
其基本思想是:先建立一个语法约束矩阵和一个语义约束矩阵, 其中元素分别表明具有某词性的词和具有另一词性的词相邻是否符合语法规则, 属于某语义类的词和属于另一词义类的词相邻是否符合逻辑,机器在切分时以之约束分词结果。
基于理解的分词方法
基于理解的分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。目前基于理解的分词方法主要有专家系统分词法和神经网络分词法等。
专家系统分词法
从专家系统角度把分词的知识(包括常识性分词知识与消除歧义切分的启发性知识即歧义切分规则)从实现分词过程的推理机中独立出来,使知识库的维护与推理机的实现互不干扰,从而使知识库易于维护和管理。它还具有发现交集歧义字段和多义组合歧义字段的能力和一定的自学习功能。
神经网络分词法
该方法是模拟人脑并行,分布处理和建立数值计算模型工作的。它将分词知识所分散隐式的方法存入神经网络内部,通过自学习和训练修改内部权值,以达到正确的分词结果,最后给出神经网络自动分词结果,如使用 LSTM、GRU 等神经网络模型等。
神经网络专家系统集成式分词法
该方法首先启动神经网络进行分词,当神经网络对新出现的词不能给出准确切分时,激活专家系统进行分析判断,依据知识库进行推理,得出初步分析,并启动学习机制对神经网络进行训练。该方法可以较充分发挥神经网络与专家系统二者优势,进一步提高分词效率。
以上便是对分词算法的基本介绍。