中文句法分析及LTP使用
目录
一、中文句法分析内容概述
二、基于Python的LTP句法分析
1、LTP基础
2、pyltp安装
3、pyltp实现句法分析
三、基于C++的LTP句法分析
1、LTP源码和模型
2、LTP的C++源码编译及测试
3、在Linux下使用动态库生成可执行程序
4、 构建基于LTP的句法分析类Parsing
5、使用Parsing类实现句法分析
四、LTP标注集参考
1、词性标注集
2、命名实体识别标注集
3、依存句法关系
4、语义角色类型
今天是1024,首先,祝大家节日快乐! 中文句法分析,先分析下面的一句话再进入正题哈哈:博客技术交流加QQ群:955817470
分析结果如下:
从分析结果我们可以看到每个词的词性以及句法结构,比如:交流和加这两个词构成了主谓关系(SBV),加和群这两个词构成了动宾关系(VOB),通过该结果可以分析句子的组成成分等。这个其实就是依存句法分析的一个例子,接下来看正文 ……
一、中文句法分析内容概述
主要任务:
- 词法分析:分句、分词、词性标注、命名实体识别
- 句法分析:依存句法分析
- 语义分析:语义角色标注、语义依存分析
1、分句
一般可以根据标点符号正则表达式进行分句。
2、分词
中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。
3、词性标注
词性(part-of-speech)是词汇基本的语法属性,通常也称为词性。
词性标注(part-of-speech tagging)又称为词类标注或者简称标注,是指为分词结果中的每个单词标注一个正确的词性的程序,也即确定每个词是名词、动词、形容词或者其他词性的过程。词性标注是很多NLP任务的预处理步骤,如句法分析,经过词性标注后的文本会带来很大的便利性,但也不是不可或缺的步骤。
词性标注主要可以分为基于规则和基于统计的方法,下面列举几种统计方法:基于最大熵的词性标注、基于统计最大概率输出词性、基于HMM的词性标注。
词性标注的应用:句法分析预处理、词汇获取预处理、信息抽取预处理。
4、命名实体识别
命名实体识别(Named Entity Recognition,NER)是将文本中的元素分成预先定义的类,如人名、地名、 机构名、时间、货币等等。作为自然语言的承载信息单位,命名实体识别 属于文本信息处理的基础的研究领域,是信息抽取、信息检索、机器翻译、 问答系统等多种自然语言处理技术中必不可少的组成部分。
5、依存句法分析
依存语法 (Dependency Parsing, DP) 通过分析语言单位内成分之间的依存关系揭示其句法结构。 直观来讲,依存句法分析识别句子中的“主谓宾”、“定状补”这些语法成分,并分析各成分之间的关系。
6、语义角色标注
语义角色标注(Semantic Role Labeling,SRL)是一种浅层的语义分析技术,标注句子中某些短语为给定谓词的论元 (语义角色) ,如施事、受事、时间和地点等。其能够对问答系统、信息抽取和机器翻译等应用产生推动作用。
7、语义依存分析
语义依存分析 (Semantic Dependency Parsing, SDP),分析句子各个语言单位之间的语义关联,并将语义关联以依存结构呈现。 使用语义依存刻画句子语义,好处在于不需要去抽象词汇本身,而是通过词汇所承受的语义框架来描述该词汇,而论元的数目相对词汇来说数量总是少了很多的。
语义依存分析目标是跨越句子表层句法结构的束缚,直接获取深层的语义信息。
二、基于Python的LTP句法分析
1、LTP基础
LTP提供了一系列中文自然语言处理工具,用户可以使用这些工具对于中文文本进行分词、词性标注、句法分析等工作。
LTP官网 ;LTP GitHub ;pyltp使用教程
2、pyltp安装
环境:Linux
准备:LTP模型下载
安装pyltp:pip install pyltp
注:安装成功之后,尝试import pyltp,可能报错:undefined symbol: _ZTISt19__codecvt_utf8_baseIwE
解决方法如下(参看方法):
cd ~/anaconda2/lib
rm libstdc++.so.6.0.19
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 libstdc++.so.6.0.19
3、pyltp实现句法分析
pyltp实现分句、分词、词性标注、命名实体识别、依存句法分析、语义角色标注,代码如下(ltp_analyze.py):
#!/usr/bin/env python
# coding=utf-8
import importlib,sys
importlib.reload(sys)
import os
from pyltp import SentenceSplitter,Segmentor, Postagger, NamedEntityRecognizer, Parser,SementicRoleLabeller,CustomizedSegmentor
#分句
def sentence_split(text):sents = SentenceSplitter.split(text) # 分句print('\n'.join(sents))class LtpModelAnalysis(object):def __init__(self, model_dir="/mnt/f/model/ltp_model/ltp_data_v3.4.0/"):self.segmentor = Segmentor()self.segmentor.load(os.path.join(model_dir, "cws.model")) #加载分词模型#使用自定义词典#self.segmentor.load_with_lexicon(os.path.join(model_dir, "cws.model"), 'lexicon') # 加载分词模型,第二个参数是外部词典文件路径#使用个性化分词模型 #pyltp支持使用用户训练好的个性化模型#customized_segmentor = CustomizedSegmentor() # 初始化实例#customized_segmentor.load(os.path.join(model_dir, "cws.model"), 'customized_model') # 加载模型,第二个参数是增量模型的路径#个性化分词模型的同时也可以使用外部词典#customized_segmentor = CustomizedSegmentor() # 初始化实例#customized_segmentor.load_with_lexicon(os.path.join(model_dir, "cws.model"), 'customized_model','lexicon')self.postagger = Postagger()self.postagger.load(os.path.join(model_dir, "pos.model")) #加载词性标注模型self.recognizer=NamedEntityRecognizer()self.recognizer.load(os.path.join(model_dir, "ner.model")) #加载命名实体识别模型self.parser = Parser()self.parser.load(os.path.join(model_dir, "parser.model")) #加载依存句法分析模型self.labeller=SementicRoleLabeller()self.labeller.load(os.path.join(model_dir, "pisrl.model")) #加载语义角色标注模型def analyze(self, text):#分词words = self.segmentor.segment(text)print( '\t'.join(words))#词性标注postags = self.postagger.postag(words)print( '\t'.join(postags))#命名实体识别netags = self.recognizer.recognize(words, postags) # 命名实体识别print('\t'.join(netags))#句法分析arcs = self.parser.parse(words, postags)print("\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)) #arc.head 表示依存弧的父节点词的索引,arc.relation 表示依存弧的关系。arcs_list=[]#语义角色标注roles = self.labeller.label(words, postags, arcs) #arcs 使用依存句法分析的结果for role in roles:print(role.index, "".join(["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments]))def release_model(self):# 释放模型self.segmentor.release()self.postagger.release()self.recognizer.release()self.parser.release()self.labeller.release()if __name__ == '__main__':text="你觉得我的博客写的怎么样?进一步交流请加QQ群:955817470"ltp = LtpModelAnalysis()ltp.analyze(text)ltp.release_model()#sentence_split(text)
分词、词性标注、命名实体识别、依存句法分析、语义角色标注运行结果如下
(1)依存句法结果分析
2:SBV 0:HED 5:ATT 3:RAD 6:SBV 8:ATT 6:RAD 2:VOB 2:WP 11:ADV 2:COO 11:COO 12:VOB 15:ATT 13:VOB 15:WP 13:COO
arc.head
表示依存弧的父节点词的索引。ROOT节点的索引是0,第一个词开始的索引依次为1、2、3…arc.relation
表示依存弧的关系。
(2)语音角色标注结果分析
1 A0:(0,0)A1:(2,7)
5 A1:(2,4)
10 ADV:(9,9)A1:(13,15)
11 A2:(12,16)
12 A1:(13,15)
- 第一个词开始的索引依次为0、1、2…
- 返回结果
roles
是关于多个谓词的语义角色分析的结果。由于一句话中可能不含有语义角色,所以结果可能为空。 role.index
代表谓词的索引,role.arguments
代表关于该谓词的若干语义角色。arg.name
表示语义角色类型,arg.range.start
表示该语义角色起始词位置的索引,arg.range.end
表示该语义角色结束词位置的索引。
三、基于C++的LTP句法分析
1、LTP源码和模型
环境:Linux LTP源码下载 LTP模型下载
2、LTP的C++源码编译及测试
./configure
make
编译成功后,会在 bin
目录下生成以下二进制程序
程序名 | 说明 |
---|---|
ltp_test
|
LTP主程序 |
ltp_server
|
LTP Server |
在 bin/examples
目录下生成以下二进制程序
程序名 | 说明 |
---|---|
cws_cmdline
|
分词模块命令行程序 |
pos_cmdline
|
词性标注模块命令行程序 |
ner_cmdline
|
命名实体识别模块命令行程序 |
par_cmdline
|
依存句法分析模块命令行程序 |
在 examples
目录下有C++源码和Makefile文件
使用pos_cmdline
完成词性标注测试
$ cat input
这 是 测试 样本 ,中文 句法 分析 。
$ cat input | ./bin/examples/pos_cmdline --postagger-model ./ltp_model/pos.model
TRACE: Model is loaded
TRACE: Running 1 thread(s)
WARN: Cann't open file! use stdin instead.
这_r 是_v 测试_v 样本_n ,中文_nz 句法_n 分析。_v
TRACE: consume 0.162231 seconds.
3、在Linux下使用动态库生成可执行程序
(1)分词cws.cpp代码如下
#include <iostream>
#include <string>
#include "ltp/segment_dll.h"int main(int argc, char * argv[])
{if (argc < 2) //命令行参数,没有分词模型的情况下输出{std::cerr << "cws [model path] [lexicon_file]" << std::endl;return 1;}void * engine = 0; //声明一个指向模型的指针if (argc == 2) //第一个命令行参数,为分词模型{engine = segmentor_create_segmentor(argv[1]); //分词接口,初始化分词器} else if (argc == 3) //第二个命令行参数,可以外加词典文件{engine = segmentor_create_segmentor(argv[1], argv[2]); //分词接口,初始化分词器}if (!engine) {return -1;}std::vector<std::string> words; //将分词结果存入vector中//分词的文本const char * suite[2] = {"What's wrong with you? 别灰心! http://t.cn/zQz0Rn", "台北真的是天子骄子吗?",};for (int i = 0; i < 2; ++ i) {words.clear();int len = segmentor_segment(engine, suite[i], words); //分词接口,对句子分词。for (int i = 0; i < len; ++ i) {std::cout << words[i];if (i+1 == len) std::cout <<std::endl;else std::cout<< "|";}}segmentor_release_segmentor(engine); //分词接口,释放分词器return 0;
}
(2)生成cws可执行程序
将下载的LTP置于 ltp-project 目录下,编译命令如下
$ g++ -o cws cws.cpp -I ../include/ -I ../thirdparty/boost/include/ -Wl,-dn -L ../lib/ -lsegmentor -lboost_regex -Wl,-dy
运行生成的可执行程序
$ cws ../ltp_model/cws.model
运行结果如下:
- What's|wrong|with|you|?|别|灰心|!|Sina Visitor System
- 台北|真|的|是|天子骄子|吗|?
4、 构建基于LTP的句法分析类Parsing
#include <iostream>
#include <vector>
#include "ltp/segment_dll.h"
#include "ltp/postag_dll.h"
#include "ltp/parser_dll.h"
using namespace std;//构建LTP句法分析类
class Parsing
{public:void* cws_engine = 0;void* pos_engine = 0;void* par_engine = 0;vector<string> words;vector<string> postags;vector<int> heads;vector<string> deprels;public:void get_models(char* cws, char* pos, char* par);void get_words(string str);void get_postags(string str);void get_parsing(string str);void release_model();};
//加载模型文件
void Parsing::get_models(char* cws,char* pos,char* par)
{cws_engine = segmentor_create_segmentor(cws);pos_engine = postagger_create_postagger(pos);par_engine = parser_create_parser(par);
}
//分词
void Parsing::get_words(string str)
{words.clear();segmentor_segment(cws_engine, str, words);
}
//词性标注
void Parsing::get_postags(string str)
{words.clear();postags.clear();segmentor_segment(cws_engine, str, words);postagger_postag(pos_engine, words, postags);
}
//句法分析
void Parsing::get_parsing(string str)
{words.clear();postags.clear();heads.clear();deprels.clear();segmentor_segment(cws_engine, str, words);postagger_postag(pos_engine, words, postags);parser_parse(par_engine, words, postags, heads, deprels);
}
//释放模型
void Parsing::release_model()
{segmentor_release_segmentor(cws_engine);postagger_release_postagger(pos_engine);parser_release_parser(par_engine);
}int main(int argc, char * argv[])
{Parsing pars;//pars.get_models("/mnt/f/ltp_project/ltp_model/cws.model","/mnt/f/ltp_project/ltp_model/pos.model","/mnt/f/ltp_project//ltp_model/parser.model");pars.get_models(argv[1],argv[2],argv[3]);//cout<<"测试代码"<<endl;pars.get_parsing("Welcome to my blog!");cout<<pars.words.size()<<endl;for (int i = 0; i < pars.words.size(); i++){cout << pars.words[i]<<'\t'<<pars.postags[i]<<'\t'<<pars.heads[i]<<'\t'<<pars.deprels[i]<< endl;//cout << pars.postags[i] << endl;//cout << pars.heads[i] << endl;//cout << pars.deprels[i] << endl;}pars.release_model();return 0;
}
5、使用Parsing类实现句法分析
生成Parsing可执行程序
$ g++ -o parsing parsing.cpp -I ../include/ -I ../thirdparty/boost/include/ -Wl,-dn -L ../lib/ -lsegmentor -lpostagger -lparser -lboost_regex -Wl,-dy
运行Parsing可执行程序
$ ./parsing ../ltp_model/cws.model ../ltp_model/pos.model ../ltp_model/parser.model
运行结果如下
四、LTP标注集参考
1、词性标注集
LTP 使用的是863词性标注集,其各个词性含义如下表
Tag | Description | Example | Tag | Description | Example |
---|---|---|---|---|---|
a | adjective | 美丽 | ni | organization name | 保险公司 |
b | other noun-modifier | 大型, 西式 | nl | location noun | 城郊 |
c | conjunction | 和, 虽然 | ns | geographical name | 北京 |
d | adverb | 很 | nt | temporal noun | 近日, 明代 |
e | exclamation | 哎 | nz | other proper noun | 诺贝尔奖 |
g | morpheme | 茨, 甥 | o | onomatopoeia | 哗啦 |
h | prefix | 阿, 伪 | p | preposition | 在, 把 |
i | idiom | 百花齐放 | q | quantity | 个 |
j | abbreviation | 公检法 | r | pronoun | 我们 |
k | suffix | 界, 率 | u | auxiliary | 的, 地 |
m | number | 一, 第一 | v | verb | 跑, 学习 |
n | general noun | 苹果 | wp | punctuation | ,。! |
nd | direction noun | 右侧 | ws | foreign words | CPU |
nh | person name | 杜甫, 汤姆 | x | non-lexeme | 萄, 翱 |
2、命名实体识别标注集
LTP 采用 BIESO 标注体系。B 表示实体开始词,I表示实体中间词,E表示实体结束词,S表示单独成实体,O表示不构成命名实体。
LTP 提供的命名实体类型为:人名(Nh)、地名(Ns)、机构名(Ni)
标记 | 含义 |
---|---|
O | 这个词不是NE |
S | 这个词单独构成一个NE |
B | 这个词为一个NE的开始 |
I | 这个词为一个NE的中间 |
E | 这个词位一个NE的结尾 |
3、依存句法关系
关系类型 | Tag | Description | Example |
---|---|---|---|
主谓关系 | SBV | subject-verb | 我送她一束花 (我 <– 送) |
动宾关系 | VOB | 直接宾语,verb-object | 我送她一束花 (送 –> 花) |
间宾关系 | IOB | 间接宾语,indirect-object | 我送她一束花 (送 –> 她) |
前置宾语 | FOB | 前置宾语,fronting-object | 他什么书都读 (书 <– 读) |
兼语 | DBL | double | 他请我吃饭 (请 –> 我) |
定中关系 | ATT | attribute | 红苹果 (红 <– 苹果) |
状中结构 | ADV | adverbial | 非常美丽 (非常 <– 美丽) |
动补结构 | CMP | complement | 做完了作业 (做 –> 完) |
并列关系 | COO | coordinate | 大山和大海 (大山 –> 大海) |
介宾关系 | POB | preposition-object | 在贸易区内 (在 –> 内) |
左附加关系 | LAD | left adjunct | 大山和大海 (和 <– 大海) |
右附加关系 | RAD | right adjunct | 孩子们 (孩子 –> 们) |
独立结构 | IS | independent structure | 两个单句在结构上彼此独立 |
核心关系 | HED | head | 指整个句子的核心 |
4、语义角色类型
语义角色类型 | 说明 |
---|---|
ADV | adverbial, default tag ( 附加的,默认标记 ) |
BNE | beneficiary ( 受益人 ) |
CND | condition ( 条件 ) |
DIR | direction ( 方向 ) |
DGR | degree ( 程度 ) |
EXT | extent ( 扩展 ) |
FRQ | frequency ( 频率 ) |
LOC | locative ( 地点 ) |
MNR | manner ( 方式 ) |
PRP | purpose or reason ( 目的或原因 ) |
TMP | temporal ( 时间 ) |
TPC | topic ( 主题 ) |
CRD | coordinated arguments ( 并列参数 ) |
PRD | predicate ( 谓语动词 ) |
PSR | possessor ( 持有者 ) |
PSE | possessee ( 被持有 ) |
参考:
句法分析可视化软件
腾讯文智中文语义平台
LTP使用文档
本人博文NLP学习内容目录:
一、NLP基础学习
1、NLP学习路线总结
2、TF-IDF算法介绍及实现
3、NLTK使用方法总结
4、英文自然语言预处理方法总结及实现
5、中文自然语言预处理方法总结及实现
6、NLP常见语言模型总结
7、NLP数据增强方法总结及实现
8、TextRank算法介绍及实现
9、NLP关键词提取方法总结及实现
10、NLP词向量和句向量方法总结及实现
11、NLP句子相似性方法总结及实现
12、NLP中文句法分析
二、NLP项目实战
1、项目实战-英文文本分类-电影评论情感判别
2、项目实战-中文文本分类-商品评论情感判别
3、项目实战-XGBoost与LightGBM文本分类
4、项目实战-TextCNN文本分类实战
5、项目实战-Bert文本分类实战
6、项目实战-NLP中文句子类型判别和分类实战
交流学习资料共享欢迎入群:955817470(群一),801295159(群二)
中文句法分析及LTP使用相关推荐
- 计算机句法分析的研究现状,计算机理论论文融合语义和句型信息的中文句法分析方法研究与实现...
<计算机理论论文融合语义和句型信息的中文句法分析方法研究与实现>由会员分享,可在线阅读,更多相关<计算机理论论文融合语义和句型信息的中文句法分析方法研究与实现(2页珍藏版)>请 ...
- NLP-文本处理:词性标注【使用成熟的第三方工具包:中文(哈工大LTP)、英文()】【对分词后得到的“词语列表”进行词性标注,词性标注的结果用于依存句法分析、语义角色标注】
词性: 语言中对词的一种分类方法,以语法特征为主要依据.兼顾词汇意义对词进行划分的结果, 常见的词性有14种, 如: 名词, 动词, 形容词等. 顾名思义, 词性标注(Part-Of-Speech t ...
- 中文句法分析、标记规范及其应用
一. Why句法分析 句法分析是比词高一个层级的语言单位,单个词之间通过中文语法规则进行组织,形成一个具有连贯语义的词语序列.为了揭示这种组织结构和规则,揭示出词语以及词语的成分,往往需要对其进行句法 ...
- NLP笔记:中文分词工具简介
中文分词工具简介 0. 引言 1. jieba分词 1. jieba分词的基本用法 2. jieba分词的进阶版用法 1. 全模式的分词 2. 自定义领域词表加入 3. 使用jieba进行关键词抽取 ...
- 中文依存句法分析概述及应用
句法分析是自然语言处理领域的一个关键问题,如能将其有效解决,一方面,可对相应树库构建体系的正确性和完善性进行验证;另一方面,也可直接服务于各种上层应用,比如搜索引擎用户日志分析和关键词识别,比如信息抽 ...
- 自然语言处理(三)——句法分析与依存句法分析
更多内容请至南木博客主页查看哦 文章目录 一.StanfordCoreNLP对英文进行处理 二.StanfordCoreNLP对中文进行处理 三.LTP对中文进行处理 四.结论 附录 · 本文所使用工 ...
- 中文文本分类——商品评论情感判别
目录 1.数据集下载 2.载入数据,做预处理(分词),切分训练集与测试集 3.计算训练集和测试集每条评论数据的向量并存入文件 4.获得训练集向量和标签,测试集向量和标签 5.训练SVM模型 6.构建待 ...
- 【NLP】Python NLTK结合Stanford NLP工具包进行分词、词性标注、句法分析
1 NLTK和StandfordNLP简介 NLTK:由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集的大量公开数据集.模型上提供了全面.易用的接口,涵盖了分词.词 ...
- 中文自然语言预处理总结
目录 中文文本预处理总结 1.文本数据准备 2.全角与半角的转化 3.文本中大写数字转化为小写数字 4.文本中大写字母转化为小写字母 5.文本中的表情符号去除(只保留中英文和数字) 6.去除文本中所有 ...
最新文章
- centos7上的图形化界面svn客户端_Git实战一:图形客户端规范用法小讲
- 又改ResNet | 重新思考ResNet:采用高阶方案的改进堆叠策略(附论文下载)
- 基于MFC串口编程和曲线图绘制(visual studio2008,Teechart绘图控件)的程序总结
- kingcms php 排序 标签,修改PHPCMS V9列表排序,listorder、order排序功能的方法
- javaScript ie8 不支持 new Date(2017-07);只支持new Date(2017/07/01)
- 洛谷P2501数字序列 动态规划
- mysql启动错误处理
- python字符串转整数_Python连接字符串和整数
- 【Transformer】Transformer中16个注意力头一定要比1个注意力头效果好吗?
- 内联函数与宏定义的区别
- access如何查询两张表的内容_在Excel中使用SQL语句实现精确查询
- 操作系统实验报告(四)文件系统
- 自旋玻璃(spin glass)、自旋冰(spin ice)和量子自旋液体(quantum spin liquid)(之一)
- Win10访问不了Samba网络共享的原因以及解决办法
- 【滤波器】基于时变维纳滤波器实现语音去噪含Matlab源码
- c语言计算音频分贝函数,如果用c语言程序读取一段音频文件要如何做,具体要调用哪些函数,在网上搜索了半天,乱七八糟的,找不到什么有用的信息...
- 三菱PLC排故障的方法
- react 网页截图
- Android开发地图应用--坐标转换
- vlookup匹配的文字显示0_VLOOKUP函数用法大全
热门文章
- linux 删除目录下所有指定的子目录
- 【Unity】多方式批量修改Tag值
- 安卓学习专栏——安卓报错android.support.v4.widget.DrawerLayout飘红
- 利用Python批量下载必由学答题卡
- 冒险岛数据封包分网站源程序析
- The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes
- The Ten Commandments(摩西十诫)
- 联想笔记本电脑键盘灯怎么开启_联想笔记本电脑的键盘灯怎么开
- 音乐下载器源码,需要自取
- Linux运维人,该醒醒了,2019年要变天了