使用ltp_server

注意

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

搭建LTP Server

LTP Server在轻量级服务器程序mongoose基础上开发。在编译LTP源码之后,运行`./bin/ltp_server`就可以启动LTP Server。:

ltp_server in LTP 3.3.0 - (C) 2012-2015 HIT-SCIR
The HTTP server frontend for Language Technology Platform.

usage: ./ltp_server <options>

options:
  --port arg              The port number [default=12345].
  --threads arg           The number of threads [default=1].
  --last-stage arg        The last stage of analysis. This option can be used
                          when the user onlywants to perform early stage
                          analysis, like only segment without postagging.value
                          includes:
                          - ws: Chinese word segmentation
                          - pos: Part of speech tagging
                          - ne: Named entity recognization
                          - dp: Dependency parsing
                          - srl: Semantic role labeling (equals to all)
                          - all: The whole pipeline [default]
  --segmentor-model arg   The path to the segment model
                          [default=ltp_data/cws.model].
  --segmentor-lexicon arg The path to the external lexicon in segmentor
                          [optional].
  --postagger-model arg   The path to the postag model
                          [default=ltp_data/pos.model].
  --postagger-lexicon arg The path to the external lexicon in postagger
                          [optional].
  --ner-model arg         The path to the NER model [default=ltp_data/ner.model
                          ].
  --parser-model arg      The path to the parser model
                          [default=ltp_data/parser.model].
  --srl-data arg          The path to the SRL model directory
                          [default=ltp_data/srl_data/].
  --log-level arg         The log level:
                          - 0: TRACE level
                          - 1: DEBUG level
                          - 2: INFO level [default]

  -h [ --help ]           Show help information

其中较为重要的参数包括: - port:指定LTP server监听的端口 - threads:指定LTP server运行的线程数,线程数影响并发的处理能力 - log-level:指定日志级别,TRACE级别最低,显示日志信息最详细。INFO级别最高,显示日志最粗略。WARN与ERROR级日志默认显示。

其余参数用以指定模型路径,具体含义与`ltp_test`相同。

请求LTP Server

原理

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

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格式

[1]如需指定监听其他端口,请在 src/server/ltp_server.cpp 中将宏 LISTENING_PORT “12345” 设置为其他整数即可。