中文的分词工具相对来说多点,比较有名的是计算所的ICTCLAS,哈工大的LTP,斯坦福的Parser等。但是命名实体识别、句法分析等的工具却不多,我所知的有哈工大的LTP、Stanford Parser。由于Stanford Parser最先是针对英文的处理工具,在中文上效果相对来说比LTP差些。下面我介绍一些个人对LTP的简单认识及初步使用。
不同于Stanford Parser的java版本,LTP的原始程序是用C++开发的(也提供了python版)。提供的接口使得能输入字符串文本或文件名,文本可以是单句,也可以是段落或文章(但需要先调用分句模块)。然后是分词、词性标注、句法分析,还包括其他功能如命名实体识别、词义消歧、语义角色标注。LTP底层以XML表示文本,以DOM处理文本。看其说明的好处是首先可以保留处理结果而不需要以后重新运行(牺牲空间换取时间),另外xml文件存储的处理结果可以用LTP提供的工具通过浏览器以图形化界面查看,具有直观效果。写的这些其实算是多此一举,详细内容可以参考下载的LTP中的"LTP使用文档v*.0.pdf"。
注意点:
如何扩展分词模块的词表?
在ltp_data/irlas_data/extend_dict.dat中的相应词性下添加新词即可。(它需要我们添加的新词给出词性,所以词性的正确与否将影响结果。)
LTP路径配置
test_vs2008文件夹下的ltp_all_modules.conf中设置。(我用的一个版本的初始设置有错,需要修正)
LTP依存关系
据我个人观察,句子中一般只有一个中心词,父亲节点编号-1,依存关系HED,一般词性为v。但是句子中可能存在多个主谓宾关系,一个主谓宾关系的小句子中的中心词为大句子的宾或主。Stanford Parser中则似乎最多只有一个主谓宾,其他动词则成为修饰。
抽取句子主谓宾(最外围)
void extract_action(vector<const char *> vecWord, vector<int> vecDep,vector<string> vecRel)
{
int i,j,hed = -1;
for(i = 0;i < vecDep.size();i ++)
if(vecDep[i] == -1)