斯坦福命名实体识别工具中misc是什么实体

The page is temporarily unavailable
nginx error!
The page you are looking for is temporarily unavailable.
Please try again later.
Website Administrator
Something has triggered an error on your
This is the default error page for
nginx that is distributed with
It is located
/usr/share/nginx/html/50x.html
You should customize this error page for your own
site or edit the error_page directive in
the nginx configuration file
/etc/nginx/nginx.conf.#自测#斯坦福深度学习课程第五弹:作业与解答2_大数据文摘-爱微帮
&& &&& 【自测】斯坦福深度学习课程第五弹:作业与…
本文为斯坦福大学CS224d课程的中文版内容笔记,已获得斯坦福大学课程Richard Socher教授的授权翻译与发表。大数据文摘作品,未经授权禁止转载,转载具体要求见文末。翻译:胡杨&&面包君&Fantzy同学&解答:寒小阳&&&龙心尘编者按:本期文章是我们为读者带来的【斯坦福大学CS224d课程】专题第五期。文章内容为斯坦福cs224d 作业测验的内容的第二部分,供有兴趣的读者感受、学习或自测。我们将课程内容制作成了PDF格式,有兴趣的读者可后台留言回复“斯坦福”下载。并且题目的代码解答也已放到了百度云盘,有兴趣的朋友可以一并下载。此外,对于有兴趣进一步学习交流的读者,我们将通过QQ群(鉴于微信人数限制问题)组织进行学习交流。长按以下二维码将直接跳转至QQ加群或者通过群号码进群◆&◆&◆【Test 1】Softmax和Tensorflow (10 分)在本题中,我们会执行一个线性分类器,并会用到下面的交叉熵损失函数:&(请注意,这里行x的是行特征向量)。我们会通过Tensorflow 的自动微分功能来训练数据。part a.(4分)&在脚本q1_softmax.py中,通过TensorFlow来构造softmax 函数。softmax的公式如下:请注意,你不能使用Tensorflow内建的tf.nn.softmax函数或者其他相关内建函数。这道题目做好的标准是你能够通过运行Python&q1_softmax.py命令将这个函数跑起来(需要跑通一个测试用例。当然,不要求完全详尽的测试。)part b. (4分)&在脚本q1_softmax.py中,通过TensorFlow来构造交叉熵损失函数(Cross Entropy Loss)。交叉熵损失函数的公式长这个样子:在这里&y∈R5&是一个one-hot标签向量,Nc是所有类目的数量。请注意,你不能使用Tensorflow内建的cross-entropy函数或者其他相关内建函数。这道题目做好的标准是你能够通过运行Python&q1_softmax.py脚本将这个函数跑起来(需要写一个测试用例。当然,这同样不要求完全详尽的测试。)part c. (4分)&请仔细学习model.py脚本中的model类。并简要解释一下其中占位符变量 (place holder vaiables)和填充字典(feed dictionaries)函数的目的. 在q1_classifier.py中填充好add_palceholders和creat_feed_dict这两个函数。提示: 请注意配置变量(configuration variables)在config类中已经储存好了,而在代码中你会用到它们。&答案:在Tensorflow 计算图中,占位符变量是作为其输入节点而存在的。而填充字典函数说明了在计算的时候怎么给这些占位符(或者其他)变量赋值。part d. (4分)&在脚本ql_classifier.py中的add_model函数里完成一个用softmax进行分类的基本流程。并在同一个脚本中的函数add_loss_op中补充好交叉熵损失函数。 请注意,使用本题之前提供的函数,而不是&Tensorflow 内建函数。part e. (4分)&在脚本ql_classifier.py中填充完成add_training_op&函数。 并解释为什么Tensorflow 的自动微分功能能省去我们直接求梯度的工作。你可以在我们提供的数据上顺利运行python ql_classifier.py命令,并且确保能够跑通测试用例。这样你才能保证你的模型是合适的。&提示:请一定要使用在config类中定义的学习率。答案:只要正确定义好了计算图,Tensorflow就能自动应用反向传播算法来计算梯度。◆&◆&◆【Test 2】神经网络在命名实体识别的作用(10 分)这一节中,我们会练习反向传播算法和训练深度神经网络,通过它们来实现命名实体识别。命名实体识别是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。&这其实就是一个5类分类问题(5选1的单选题)。这5类包括上面这4类和1个非实体类——也就是不代表任何实体的类(大部词语都属于这类)。&这个模型是一个单隐藏层神经网络,它有一个类似我们在word2vec中看到的表示层。 这里我们不需要求平均值或者抽样,而是明确地将上下文定义为一个“窗口”,这个“窗口”包含目标词和它左右紧邻的词,是一个3d维度的行向量:&这里的xt-1,xt,xt+1是one-hot行向量(|V|维),而L∈R|V|×d是嵌入矩阵,它的每一行Li其实就代表一个特定的词i。我们然后做如下预览:i。我们然后做如下预测:&之后通过交叉熵损失函数来评估误差:&为了计算整个训练集的损失,我们在对每个训练样本计算J(θ)之后将其求和(或者求平均值)。&对于本题,令d=50作为词向量的长度。3个向量组成了一个宽度为3×50=150的窗口。隐藏层有100个神经元,输出层有5个神经元.part a(5分)请计算损失函数J(θ)在下列模型各个参数上的梯度,这里矩阵的维度分别是:提示:为了能够清晰的表示反向传播的过程,我们给您推荐两个小trick:●&使用激活函数的值来代替激活函数的微分。就像作业1中的sigmoid函数一样●&使用“残差向量”的形式来表示某一层的梯度。这意味着我们的链式法则,现在可以写成用括号括起来的向量(矩阵)乘法的形式,这将使您的分析过程大大简化。值得注意的是,损失函数在模型各参数上的梯度应该化简到可以使用矩阵运算的形式。(通过作业1,相信您已经掌握的很熟练了:))答案:&由提示公式可得:&可得偏微分如下:&我们令i=xt,j=xt-1,k=xt+1,可得:&part b(5分)&神经网络的训练过程往往不是一帆风顺的,许多小问题都会影响模型的性能,例如神经网络中参数过多会导致训练太慢,神经元之间相关性太强会导致模型陷入局部最优。为了避免上述两种情况的发生,我们在(part a)损失函数的基础上增加一个高斯先验。可别小看这个高斯先验,它能使我们的模型参数/权重不会有那么夸张的幅度(更向0值靠拢),同时又能保证大部分参数都有取值(不会对起作用的特征产生太大影响),从而保证了模型在实际场景中的可用性(泛化能力强一些)。混合后的损失函数就长这样。&有了混合损失函数,下面就可以开始将似然函数求最大化了(就像上面我们对交叉熵求最大化那样),高斯先验在这个过程中就会变成一个平方项的形式(L2正则化项)。要对似然函数求极大,我们所采用的方法是梯度上升,所以本题的任务还是请您来求一下梯度。与(part a)中不同的是,我们这里的损失函数多了一个由高斯先验得来的正则化项。所以,聪明的你,给我个答案吧。&答案:将W和V的梯度代入即可。part c(5分)&在part b中我们了解到,如果神经元之间的相关性太强,模型就容易陷入局部最优,从而降低了模型的泛化能力。对此,我们的解决方法是使用L2正则化项对模型参数加以限制。在本题中,我们提供另外一种方法,叫做“参数随机初始化”。在众多参数随机初始化的方法中,我们使用最多的是Xavier方法。&Xavier方法的原理是这样的:给定一个m×n的矩阵A和一个区间[-?,?],从该范围中进行均匀采样作为Aij,其中好了,根据算法原理,请你在q2_initialization.py的xavier_weight_init中,用代码来实现一下吧。part d(20分)&在q2_NER.py中,我们实现了一个命名实体窗口(NER Window)模型。模型的输入是sections(小编注:sections在特定情况下可以看作是一句查询,每个section由一些tokens组成,即分词),输出就是命名实体的标签。您可以看一下代码,您刚刚推导的反向传播过程在代码中已经被实现了,是不是很神奇!?&以下工作需要您来完成:您需要在q2_NER.py中实现命名实体窗口模型部分的代码,我们会根据算法正确性和程序是否可执行来进行打分。您需要说明模型最佳的参数的值,主要有正则化项、特征维度、学习速率和SGD批量的大小等。您还需要说明模型在交叉验证集上的误差,本课程要求模型在交叉验证集上的误差不高于0.2。您需要将测试集的预测结果保存在q2_test.predicted文件中,格式为一行一个label,我们会根据真实结果来评估您模型的泛化能力。提示1:在debug模式中,请将参数max_epchs设为1,并且将load_data中debug参数设为True。提示2:请注意程序的时间复杂度,保证在GPU上不超过15分钟,CPU上不超过1小时。◆&◆&◆【Test 3】递归神经网络:语言建模(45分)在这一节,你将首次实现一个用于建立语言模型的递归神经网络。语言模型的建立是NLP技术的核心部分,语言模型被广泛使用于语音识别,机器翻译以及其他各类系统。给出一串连续的词x1,…,xt,关于预测其后面紧跟的词xt+1的建模方式是:&其中,υj是词库中的某个词。你的任务是实现一个递归神经网络,此网络利用隐层中的反馈信息对“历史记录”xt,xt-1,…,x1进行建模。关于t=1,…,n-1形式化的表示如文献[3]所描述:&其中,h(0)=h0∈RDh是隐藏层的初始化向量,x(t)L是以x(t)为one-hot行向量与嵌入矩阵L的乘积,这个one-hot行向量就是当前处理词汇的索引。具体的一些参数设置如下:&其中,L是词嵌入矩阵,I是输入词表征矩阵,H是隐藏转化矩阵,还有U是输出词表征矩阵。b1,b2是偏置值。d是词嵌入的维数,|V|代表词库的规模,然后Dh是隐层的维数。输出向量y^(t)∈R|V|是面向整个词库的概率分布,我们需要最优化交叉熵(非正则化的)的损失率:&其中,y(t)是与目标词(这里表示为xt+1)对应的one-hot向量。正如注释[2]所描述的,它是一个对于单个样本点的损失率,然后我们对序列中全部样例的交叉熵损失值做求和(或求平均)计算,对数据集中的全部序列[4]均采取上述操作以衡量模型的性能。part a&(5分)&通常地,我们使用困惑度来评估语言模型的性能,其定义形式如下:&即通过模型分布P?得到词预测正确的逆概率。给出你是如何从交叉熵的损失率中得到困惑度的(提示:不要忘了向量y(t)是one-hot形式的!),因此如果要进行最小化操作(从算术上)意味着(从几何上讲)交叉熵损失率将被最小化,就得到了在训练集上的困惑度。在这一部分要处理的是一个非常短小的问题-所以并不需要过大的困惑度!&对于一个词库|V|中的词汇,如果你的模型做出的预测是完全随机的,你将如何预测你的困惑度呢?计算词库规模为|V|=2000和|V|=10000时对应的交叉熵损失率,并且将其作为基准牢记于心。解答:使用的样例y(t)为one-hot模型,且假定y(t)i是y(t)中唯一的非零元素。于是,记:&因此,上式可以被联立为如下形状:这条公式展示了交叉熵在数学意义上的最小化目标,同时表达了困惑度在几何意义上的最小值。当模型的预测值完全随机化时,会有E[y^(t)i]=1|V|。所给的向量y(t)是one-hot模型,所对应困惑度的期望值是|V|。由于困惑度的对数即为交叉熵,那么交叉熵的期望值在面对上述两个词库规模时分别应为log和log1。part b (5分)&正如注释[2]所描述的操作,在时刻t关于单点全部模型参数的梯度计算如下:&其中,Lx(t)是词嵌入矩阵L中对应到当前处理词汇x(t)的列,符号|(t)表示时刻t该参数的显式梯度。(同样地,h(t-1)的取值是固定的,而且你现在也不需要在早先的迭代时刻中实现反向传播算法——这是c小节的任务)。此外,还要计算代表前趋隐层权值的导数:&part c (5分)&下面为一步迭代的网络框图:&绘制下面三次迭代所“展开”的网络,并且计算迭代时后向传播的梯度:&这里|(t-1)代表模型参数在(t-1)时刻的显式梯度。由于这些参数在前馈计算中要被多次使用,我们需要在每次迭代时都计算一下它们的梯度。最好参考讲义[5]所描述的后向传播原理去将这些梯度表达成残差的形式:&(同样的表达方式在迭代时刻t-2,t-3以及更多的时候都同样适用)。注意一个训练样本的实际梯度是需要我们将直到t=0时刻的整条后向路径都使用后向传播算法迭代完成后才能得到的。在练习中,我们通常只需截取固定数值\tau\approx3-5的后向传播步骤即可。还是延续前一节的条件&part d(3分)&对于给定的h(t-1),执行一轮前向传播计算J(t)(θ)需要多少操作?执行一轮后向传播又会如何呢?执行τ轮呢?对于维度参数组d,Dh和|V|,使用符号“大写-O”来表示你的答案(如公式14)。是否该慎重考虑这一步?回忆各个参数的设置:h(t-1)大小为Dh,e(t)大小为d,还有y^(t)的大小为|V|。计算e(t)花费的时间O(d)视矩阵L而定。计算h(t)花费的时间O(D2h+dDh),计算y^(t)花费时间O(Dh|V|)。后向传播和前向传播算法具有相同的时间复杂度,于是,计算τ轮的前向或后向传播复杂度仅通过τ与先前得到的复杂度值相乘即可。由于|V|比较大的原因,计算y^(t)的“较慢的一步”计算需花费时长O(Dh|V|)。part e (20分)&在代码q3_RNNLM.py中实现以上的模型。其中已经实现了数据加载器和其它的初始化功能代码。顺着已有代码的指引来补充缺失的代码。执行命令行python q3_RNNLM.py将运行该模型。注意,在运行过程中你不能用到tensorflow库的内置函数,如rnn_cell模块。在ptb-train数据集中训练该模型,其中包含Penn Treebank中WSJ语料集的前20节语料。正如在Q 2部分中所说的,你应该最大限度地提高该模型在实际生产中数据集上的泛化性能(即最小化交叉熵损失率)。关于模型的性能,我们将通过未知但类似的句子集来进行评估。撰写实验报告的一些要求:在你实验报告中,应包括最优超参数(如训练框架、迭代次数、学习率、反馈频率)以及在ptb-dev数据集上的困惑度。正常情况应当保持困惑度值低于175。在报告中还应当包含最优模型的相关参数;方便我们测试你的模型。提示:在调试过程中把参数max_epochs的值设为1。在_init_方法中通过设置参数关键字debug=True来开启对load_data方法的调用。提示:该模型代码在GPU上运行很快(低于30分钟),而在CPU上将耗时多达4小时。part f (7分)&作业1和该作业中的q2部分所示的神经网络是判别模型:他们接收数据之后,对其做出预测。前面你实现的RNNLM模型是一个生成式模型,因为它建模了数据序列x1,…,xn的分布状况。这就意味着我们不仅能用它去评估句子生成概率,而且还能通过它生成概率最优的语句!训练完成后,在代码q3 RNNLM.py&中实现函数generate_text()。该函数首先运行RNN前向算法,在起始标记&eos&处建立索引,然后从每轮迭代的y^(t)分布对新词xt+1进行采样。然后把该词作为下一步的输入,重复该操作直至该模型遇到一个结束标志(结束标志记为&/eos&)。撰写实验报告的一些要求:在你的实验报告中至少包含2-3条的生成语句。看看你是否能产生一些妙趣横生的东西!一些参考建议:&如果你想用语言模型继续实验,非常欢迎你上传自己的文档和对其训练成果——有时会是一个令人惊喜的实验结果!(可从网站&上获取以纪念版《圣经》和书籍《计算机程序设计与实现》为混合语料进行训练的伟大成果。)&[1]Optional (not graded): The interested reader should prove that this is indeed the maximum-likelihood objective when we let&Wij~N(0,1/λ)&for all&i,j.&[2]This is also referred to as Glorot initialization and was initially described in&[3]这个模型可以参考Toma Mikolov的论文, 发表于2010年:&[4]我们使用Tensorflow库函数计算此处的损失率。&[5]关于转载如需转载,请在开篇显著位置注明作者和出处(转自:大数据文摘|bigdatadigest),并在文章结尾放置大数据文摘醒目二维码。无原创标识文章请按照转载要求编辑,可直接转载,转载后请将转载链接发送给我们;有原创标识文章,请发送【文章名称-待授权公众号名称及ID】给我们申请白名单授权。未经许可的转载以及改编者,我们将依法追究其法律责任。联系邮箱:。◆&◆&◆大数据文章斯坦福深度学习课程战队专栏主编译者战队项目管理内容运营:魏子敏统筹:汪德诚往期精彩文章推荐,点击图片可阅读翻译斯坦福大学课程:深度学习与自然语言处理斯坦福深度学习课程第二弹:词向量内部和外部任务评价斯坦福深度学习课程第三弹:神经网络与反向传播斯坦福深度学习课程第四弹:作业与解答
点击展开全文
普及数据思维,传播数据文化
您的【关注和订阅】是作者不断前行的动力
本站文章来自网友的提交收录,如需删除可进入
删除,或发送邮件到 bang@ 联系我们,
(C)2014&&版权所有&&&|&&&
京ICP备号-2&&&&京公网安备34I Love Natural Language Processing
斯坦福大学自然语言处理组是世界知名的NLP研究小组,他们提供了一系列开源的Java文本分析工具,包括分词器(),词性标注工具(),命名实体识别工具(),句法分析器()等,可喜的事,他们还为这些工具训练了相应的中文模型,支持中文文本处理。在使用NLTK的过程中,发现当前版本的已经提供了相应的斯坦福文本处理工具接口,包括词性标注,命名实体识别和句法分析器的接口,不过可惜的是,没有提供器的接口。在google无果和阅读了相应的代码后,我决定照猫画虎为NLTK写一个斯坦福器接口,这样可以方便的在Python中调用斯坦福文本处理工具。
首先需要做一些准备工作,第一步当然是安装NLTK,这个可以参考我们在gensim的相关文章中的介绍《》,不过这里建议check github上最新的NLTK源代码并用“python setup.py install”的方式安装这个版本:。这个版本新增了对于斯坦福句法分析器的接口,一些老的版本并没有,这个之后我们也许还会用来介绍。而我们也是在这个版本中添加的斯坦福分词器接口,其他版本也许会存在一些小问题。其次是安装Java运行环境,以Ubuntu 12.04为例,安装Java运行环境仅需要两步:
sudo apt-get install default-jre
sudo apt-get install default-jdk
最后,当然是最重要的,你需要下载的相应文件,包括源代码,模型文件,词典文件等。注意斯坦福分词器并不仅仅支持中文分词,还支持阿拉伯语的分词,需要下载的zip打包文件是这个: ,下载后解压。
准备工作就绪后,我们首先考虑的是在nltk源代码里的什么地方来添加这个接口文件。在nltk源代码包下,斯坦福词性标注器和命名实体识别工具的接口文件是这个:nltk/tag/stanford.py ,而句法分析器的接口文件是这个:nltk/parse/stanford.py , 虽然在nltk/tokenize/目录下有一个stanford.py文件,但是仅仅提供了一个针对英文的tokenizer工具PTBTokenizer的接口,没有针对斯坦福分词器的接口,于是我决定在nltk/tokenize下添加一个stanford_segmenter.py文件,作为nltk斯坦福中文分词器的接口文件。NLTK中的这些接口利用了Linux 下的管道(PIPE)机制和subprocess模块,这里直接贴源代码了,感兴趣的同学可以自行阅读:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Natural Language Toolkit: Interface to the Stanford Chinese Segmenter
# Copyright (C)
NLTK Project
# Author: 52nlp &&
# URL: &http://nltk.org/&
# For license information, see LICENSE.TXT
from __future__ import unicode_literals, print_function
import tempfile
import json
from subprocess import PIPE
from nltk import compat
from nltk.internals import find_jar, config_java, java, _java_options
from nltk.tokenize.api import TokenizerI
class StanfordSegmenter(TokenizerI):
& & Interface to the Stanford Segmenter
& & &&& from nltk.tokenize.stanford_segmenter import StanfordSegmenter
& & &&& segmenter = StanfordSegmenter(path_to_jar=&stanford-segmenter-3.4.1.jar&, path_to_sihan_corpora_dict=&./data&, path_to_model=&./data/pku.gz&, path_to_dict=&./data/dict-chris6.ser.gz&)
& & &&& sentence = u&这是斯坦福中文分词器测试&
& & &&& segmenter.segment(sentence)
& & &&& u'\u8fd9 \u662f \u65af\uf \u4e2d\u6587 \u5206\u8bcd\u5668 \u6d4b\u8bd5\n'
& & &&& segmenter.segment_file(&test.simp.utf8&)
& & &&& u'\u \u65b0 \u4e16\u7eaa \uff0c \u4e16\u754c \u5404\u56fd ...
& & _JAR = 'stanford-segmenter.jar'
& & def __init__(self, path_to_jar=None,
& & & & & & path_to_sihan_corpora_dict=None,
& & & & & & path_to_model=None, path_to_dict=None,
& & & & & & encoding='UTF-8', options=None,
& & & & & & verbose=False, java_options='-mx2g'):
& & & & self._stanford_jar = find_jar(
& & & & & & self._JAR, path_to_jar,
& & & & & & env_vars=('STANFORD_SEGMENTER',),
& & & & & & searchpath=(),
& & & & & & verbose=verbose
& & & & self._sihan_corpora_dict = path_to_sihan_corpora_dict
& & & & self._model = path_to_model
& & & & self._dict = path_to_dict
& & & & self._encoding = encoding
& & & & self.java_options = java_options
& & & & options = {} if options is None else options
& & & & self._options_cmd = ','.join('{0}={1}'.format(key, json.dumps(val)) for key, val in options.items())
& & def segment_file(self, input_file_path):
& & & & &&&
& & & & &&&
& & & & cmd = [
& & & & & & 'edu.stanford.nlp.ie.crf.CRFClassifier',
& & & & & & '-sighanCorporaDict', self._sihan_corpora_dict,
& & & & & & '-textFile', input_file_path,
& & & & & & '-sighanPostProcessing', 'true',
& & & & & & '-keepAllWhitespaces', 'false',
& & & & & & '-loadClassifier', self._model,
& & & & & & '-serDictionary', self._dict
& & & & stdout = self._execute(cmd)
& & & & return stdout
& & def segment(self, tokens):
& & & & return self.segment_sents([tokens])
& & def segment_sents(self, sentences):
& & & & &&&
& & & & &&&
& & & & encoding = self._encoding
& & & & # Create a temporary input file
& & & & _input_fh, self._input_file_path = tempfile.mkstemp(text=True)
& & & & # Write the actural sentences to the temporary input file
& & & & _input_fh = os.fdopen(_input_fh, 'wb')
& & & & _input = '\n'.join((' '.join(x) for x in sentences))
& & & & if isinstance(_input, compat.text_type) and encoding:
& & & & & & _input = _input.encode(encoding)
& & & & _input_fh.write(_input)
& & & & _input_fh.close()
& & & & cmd = [
& & & & & & 'edu.stanford.nlp.ie.crf.CRFClassifier',
& & & & & & '-sighanCorporaDict', self._sihan_corpora_dict,
& & & & & & '-textFile', self._input_file_path,
& & & & & & '-sighanPostProcessing', 'true',
& & & & & & '-keepAllWhitespaces', 'false',
& & & & & & '-loadClassifier', self._model,
& & & & & & '-serDictionary', self._dict
& & & & stdout = self._execute(cmd)
& & & & # Delete the temporary file
& & & & os.unlink(self._input_file_path)
& & & & return stdout
& & def _execute(self, cmd, verbose=False):
& & & & encoding = self._encoding
& & & & cmd.extend(['-inputEncoding', encoding])
& & & & _options_cmd = self._options_cmd
& & & & if _options_cmd:
& & & & & & cmd.extend(['-options', self._options_cmd])
& & & & default_options = ' '.join(_java_options)
& & & & # Configure java.
& & & & config_java(options=self.java_options, verbose=verbose)
& & & & stdout, _stderr = java(cmd,classpath=self._stanford_jar, stdout=PIPE, stderr=PIPE)
& & & & stdout = stdout.decode(encoding)
& & & & # Return java configurations to their default values.
& & & & config_java(options=default_options, verbose=False)
& & & & return stdout
def setup_module(module):
& & from nose import SkipTest
& & & & StanfordSegmenter()
& & except LookupError:
& & & & raise SkipTest('doctests from nltk.tokenize.stanford_segmenter are skipped because the stanford segmenter jar doesn\'t exist')
Update: 自NLTK 3.2版本起,这个接口已经被正式加进去了,所以大家可以直接下载安装官方版本,以下这段话可以忽略:
我在github上fork了一个最新的NLTK版本,然后在这个版本中添加了,感兴趣的同学可以自行下载这个代码,放到nltk/tokenize/目录下,然后重新安装NLTK:sudo python setpy.py install. 或者直接clone我们的这个版本,安装后就可以使用斯坦福中文分词器了。
现在就可以在Python NLTK中调用这个斯坦福中文分词接口了。为了方便起见,建议首先进入到解压后的斯坦福分词工具目录下:cd stanford-segmenter-,然后在这个目录下启用ipython,当然默认python解释器也可:
# 初始化斯坦福中文分词器
In [1]: from nltk.tokenize.stanford_segmenter import StanfordSegmenter
# 注意分词模型,词典等资源在data目录下,使用的是相对路径,
# 在stanford-segmenter-的目录下执行有效
# 注意,斯坦福中文分词器提供了两个中文分词模型:
# ctb.gz是基于宾州中文树库训练的模型
# pku.gz是基于北大在2005backoof上提供的人名日报语料库
# 这里选用了pku.gz,方便最后的测试
In [2]: segmenter = StanfordSegmenter(path_to_jar=”stanford-segmenter-3.4.1.jar”, path_to_sihan_corpora_dict=”./data”, path_to_model=”./data/pku.gz”, path_to_dict=”./data/dict-chris6.ser.gz”)
# 测试一个中文句子,注意u
In [3]: sentence = u”这是斯坦福中文分词器测试”
# 调用segment方法来切分中文句子,这里隐藏了一个问题,我们最后来说明
In [4]: segmenter.segment(sentence)
Out[4]: u’\u8fd9 \u662f \u65af\uf \u4e2d\u6587 \u5206\u8bcd\u5668 \u6d4b\u8bd5\n’
# 由于分词后显示的是unicode编码,我们把这个结果输出到文件中
In [5]: outfile = open(‘outfile’, ‘w’)
In [6]: result = segmenter.segment(sentence)
# 注意写入到文件的时候要encode 为 UTF-8编码
In [7]: outfile.write(result.encode(‘UTF-8’))
In [8]: outfile.close()
打开这个outfile文件:
这 是 斯坦福 中文 分词器 测试
这里同时提供了一个segment_file的调用方法,方便直接对文件进行切分,让我们来测试《》中介绍的backoff2005的测试集pku_test.utf8,来看看斯坦福分词器的效果:
In [9]: result = segmenter.segment_file(‘pku_test.utf8’)
In [10]: outfile = open(‘pku_outfile’, ‘w’)
In [11]: outfile.write(result.encode(‘UTF-8’))
In [12]: outfile.close()
打开结果文件pku_outfile:
共同 创造 美好 的 新 世纪 ——二○○一年 新年 贺词
( 二○○○年 十二月 三十一日 ) ( 附 图片 1 张 )
女士 们 , 先生 们 , 同志 们 , 朋友 们 :
2001年 新年 钟声 即将 敲响 。 人类 社会 前进 的 航船 就要 驶入 21 世纪 的 新 航程 。 中国 人民 进入 了 向 现代化 建设 第三 步 战略 目标 迈进 的 新 征程 。
在 这个 激动人心 的 时刻 , 我 很 高兴 通过 中国 国际 广播 电台 、 中央 人民 广播 电台 和 中央 电视台 , 向 全国 各族 人民 , 向 香港 特别 行政区 同胞 、 澳门 特别 行政区 同胞 和 台湾 同胞 、 海外 侨胞 , 向 世界 各国 的 朋友 们 , 致以 新 世纪 第一 个 新年 的 祝贺 !
我们用backoff2005的测试脚本来测试一下斯坦福中文分词器在这份测试语料上的效果:
./icwb2-data/scripts/score ./icwb2-data/gold/pku_training_words.utf8 ./icwb2-data/gold/pku_test_gold.utf8 pku_outfile & stanford_pku_test.score
结果如下:
=== SUMMARY:
=== TOTAL INSERTIONS: 1479
=== TOTAL DELETIONS: 1974
=== TOTAL SUBSTITUTIONS: 3638
=== TOTAL NCHANGE: 7091
=== TOTAL TRUE WORD COUNT: 104372
=== TOTAL TEST WORD COUNT: 103877
=== TOTAL TRUE WORDS RECALL: 0.946
=== TOTAL TEST WORDS PRECISION: 0.951
=== F MEASURE: 0.948
=== OOV Rate: 0.058
=== OOV Recall Rate: 0.769
=== IV Recall Rate: 0.957
### pku_outfile 38
.946 0.951 0.948 0.058 0.769 0.957
准确率是95.1%, 召回率是94.6%, F值是94.8%, 相当不错。感兴趣的同学可以测试一下其他测试集,或者用宾州中文树库的模型来测试一下结果。
最后我们再说明一下这个接口存在的问题,因为使用了Linux PIPE模式来调用斯坦福中文分词器,相当于在Python中执行相应的Java命令,导致每次在执行分词时会加载一遍分词所需的模型和词典,这个对文件操作时(segment_file)没有多大的问题,但是在对句子执行分词(segment)的时候会存在很大的问题,每次都加载数据,在实际产品中基本是不可用的。虽然发现斯坦福分词器提供了一个 –readStdin 的读入标准输入的参数,也尝试通过python subprocess中先load 文件,再用的communicate方法来读入标准输入,但是仍然没有解决问题,发现还是一次执行,一次结束。这个问题困扰了我很久,google了很多资料也没有解决问题,欢迎懂行的同学告知或者来解决这个问题,再此先谢过了。That’s all!
注:原创文章,转载请注明出处“”:
本文链接地址:
此条目发表在, , 分类目录,贴了, , , , , , , , , , , , , , , , , , , , , , , , 标签。将加入收藏夹。
NLP相关网站
本站架设在
上, 采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本站内容必须也遵循“署名-非商业用途-保持一致”的创作共用协议.

我要回帖

更多关于 中文命名实体识别工具 的文章

 

随机推荐