Skip to content
Yijia Liu edited this page Jan 22, 2014 · 6 revisions

重要注意

本文档中提到的LTP Server与语言云服务不同。语言云建立在LTP Server之上,并封装了一层REST API接口。语言云API(ltp-cloud-api)的请求方式与LTP Server不同。

搭建LTP Server

LTP Server在轻量级服务器程序mongoose基础上开发。在编译LTP源码之后,运行ltp_server就可以启动LTP Server。LTP Server启动后,将会监听12345(*)端口的HTTP请求。

(*注:如需指定监听其他端口,请在src/server/ltp_server.cpp中将宏LISTENING_PORT "12345"设置为其他整数即可。)

请求LTP Server

原理

在ltp web service中,client与server之间采用http协议通信。client以post方式提交的数据到server,server将数据以xml的方式返回给client。

client在提交数据时,首先需要在http请求头部中添加用户名密码以做验证。

client提交的post请求主要有以下几个字段。

字段名 含义
s 输入字符串,在xml选项x为n的时候,代表输入句子;为y时代表输入xml
x 用以指明是否使用xml
c 用以指明输入编码方式
t 用以指明分析目标,t可以为分词(ws),词性标注(pos),命名实体识别(ner),依存句法分析(dp),语义角色标注(srl)或者全部任务(all)

数据表示

LTP 数据表示标准称为LTML。下图是LTML的一个简单例子:

<?xml version="1.0" encoding="utf-8" ?>
<xml4nlp>
    <note sent="y" word="y" pos="y" ne="y" parser="y" wsd="y" srl="y" />
    <doc>
        <para id="0">
            <sent id="0" cont="我们都是中国人">
                <word id="0" cont="我们" pos="r" ne="O" parent="2" relate="SBV" />
                <word id="1" cont="都" pos="d" ne="O" parent="2" relate="ADV" />
                <word id="2" cont="是"  pos="v" ne="O" parent="-1" relate="HED">
                    <arg id="0" type="A0" beg="0" end="0" />
                    <arg id="1" type="AM-ADV" beg="1" end="1" />
                </word>
                <word id="3" cont="中国" pos="ns" ne="S-Ns" parent="4" relate="ATT" />
                <word id="4" cont="人" pos="n" ne="O" parent="2" relate="VOB" />
            </sent>
        </para>
    </doc>
</xml4nlp>

LTML 标准要求如下:结点标签分别为 xml4nlp, note, doc, para, sent, word, arg 共七种结点标签:

  1. xml4nlp 为根结点,无任何属性值;
  2. note 为标记结点,具有的属性分别为:sent, word, pos, ne, parser, srl;分别代表分句,分词,词性标注,命名实体识别,依存句法分析,词义消歧,语义角色标注;值为”n”,表明未做,值为”y”则表示完成,如pos=”y”,表示已经完成了词性标注;
  3. doc 为篇章结点,以段落为单位包含文本内容;无任何属性值;
  4. para 为段落结点,需含id 属性,其值从0 开始;
  5. sent 为句子结点,需含属性为id,cont;id 为段落中句子序号,其值从0 开始;cont 为句子内容;
  6. word 为分词结点,需含属性为id, cont;id 为句子中的词的序号,其值从0 开始,cont为分词内容;可选属性为 pos, ne, parent, relate;pos 的内容为词性标注内容;ne 为命名实体内容;parent 与relate 成对出现,parent 为依存句法分析的父亲结点id 号,relate 为相对应的关系;
  7. arg 为语义角色信息结点,任何一个谓词都会带有若干个该结点;其属性为id, type, beg,end;id 为序号,从0 开始;type 代表角色名称;beg 为开始的词序号,end 为结束的序号;

各结点及属性的逻辑关系说明如下:

  1. 各结点层次关系可以从图中清楚获得,凡带有id 属性的结点是可以包含多个;
  2. 如果sent=”n”即未完成分句,则不应包含sent 及其下结点;
  3. 如果sent=”y” word=”n”即完成分句,未完成分词,则不应包含word 及其下结点;
  4. 其它情况均是在sent=”y” word=”y”的情况下:
    1. 如果 pos=”y”则分词结点中必须包含pos 属性;
    2. 如果 ne=”y”则分词结点中必须包含ne 属性;
    3. 如果 parser=”y”则分词结点中必须包含parent 及relate 属性;
    4. 如果 srl=”y”则凡是谓词(predicate)的分词会包含若干个arg 结点;

示例程序

下面这个python程序例子显示如何向LTP Server发起http请求,并获得返回结果。

# -*- coding: utf-8 -*-
#!/usr/bin/env python
import urllib, urllib2

uri_base = "http://127.0.0.1:12345/ltp"

data = {
    's': '我爱北京天安门',
    'x': 'n',
    't': 'all'}
 
request = urllib2.Request(uri_base)
params = urllib.urlencode(data)
response = urllib2.urlopen(request, params)
content = response.read().strip()
print content

错误返回

如果请求有不符合格式要求,LTP Server会返回400错误。下面的表格显示了LTP Server返回的错误类型以及原因呢。

code reason 解释
400 EMPTY SENTENCE 输入句子为空
400 ENCODING NOT IN UTF8 输入句子非UTF8编码
400 BAD XML FORMAT 输入句子不符合LTML格式
Clone this wiki locally