Gitter是开发人员的聊天室。
nlpnet ---神经网络的自然语言处理nlpnet是基于神经网络的自然语言处理任务的Python库。当前,它执行言论的一部分标签,语义角色标签和依赖性解析。大多数架构都是独立的,但有些功能是专门针对与葡萄牙人合作的。该系统的灵感来自塞纳。
重要:要为葡萄牙NLP使用训练有素的模型,您需要从http://nilc.icmc.usp.br/nlpnet/models.html下载数据。
nlpnet需要NLTK和Numpy。此外,它需要从NLTK下载一些数据。安装后,请致电
>>> nltk.download()
转到“型号”选项卡,然后选择Punkt Tokenizer。它用于将文本分为句子。
Cython用于生成C扩展并更快地运行。您可能不需要它,因为生成的.c文件已经提供了NLPNET,但是您需要一个C编译器。在Linux和Mac系统上,这不是问题,但可能是在Windows上,因为Setuptools默认需要Microsoft C编译器。如果您还没有它,通常更容易安装MingW,然后按照此处的说明进行操作。
nlpnet既可以用作Python库,也可以通过其独立脚本使用。两种用法都在下面说明。
您可以将nlpnet用作Python代码中的库,如下所示:
> >> import nlpnet
> >> tagger = nlpnet . POSTagger ( '/path/to/pos-model/' , language = 'pt' )
> >> tagger . tag ( 'O rato roeu a roupa do rei de Roma.' )
[[( u'O' , u'ART' ), ( u'rato' , u'N' ), ( u'roeu' , u'V' ), ( u'a' , u'ART' ), ( u'roupa' , u'N' ), ( u'do' , u'PREP+ART' ), ( u'rei' , u'N' ), ( u'de' , u'PREP' ), ( u'Roma' , u'NPROP' ), ( u'.' , 'PU' )]]在上面的示例中, POSTagger构造函数将其作为第一个参数作为其训练模型所在的目录。第二个论点是两个字母语言代码(目前,支持ONLE pt和en )。这只会在令牌化中产生影响。
调用注释工具非常简单。提供的是POSTagger , SRLTagger和DependencyParser ,所有这些都有一个方法tag ,该方法带有标记的文本字符串(在DependencyParser中,对方法parse有一个别名,听起来更足够)。标记器将文本分配到句子中,然后将每个文本归为每个句子(因此,后盖的返回是列表的列表)。
Srltagger的输出稍微复杂一点:
>>> tagger = nlpnet.SRLTagger() >>> tagger.tag( u ' O rato roeu a roupa do rei de Roma. ' ) [<nlpnet.taggers.SRLAnnotatedSentence at 0x84020f0>]
句子由SRLAnnotatedSentence的实例表示,而不是元素列表。该类基本上是数据持有人,并且具有两个属性:
>>> sent = tagger.tag( u ' O rato roeu a roupa do rei de Roma. ' )[ 0 ] >>> sent.tokens [u'O', u'rato', u'roeu', u'a', u'roupa', u'do', u'rei', u'de', u'Roma', u'.'] >>> sent.arg_structures [(u'roeu', {u'A0': [u'O', u'rato'], u'A1': [u'a', u'roupa', u'do', u'rei', u'de', u'Roma'], u'V': [u'roeu']})]
arg_structures是包含句子中所有谓词argument结构的列表。此示例中唯一的一个是动词roeu。它由带有谓词和词典映射语义角色标签的元组代表,以构成该论点的令牌。
请注意,该动词是元组的第一个成员,也是标签“ V”(代表动词)的内容。这是因为某些谓词是多字。在这些情况下,“主要”谓词单词(通常是动词本身)出现在arg_structures[0]中,所有单词都出现在键'v'下。
这是依赖类动物的示例:
>>> parser = nlpnet.DependencyParser( ' dependency ' , language = ' en ' ) >>> parsed_text = parser.parse( ' The book is on the table. ' ) >>> parsed_text [<nlpnet.taggers.ParsedSentence at 0x10e067f0>] >>> sent = parsed_text[ 0 ] >>> print (sent.to_conll()) 1 The _ DT DT _ 2 NMOD 2 book _ NN NN _ 3 SBJ 3 is _ VBZ VBZ _ 0 ROOT 4 on _ IN IN _ 3 LOC-PRD 5 the _ DT DT _ 6 NMOD 6 table _ NN NN _ 4 PMOD 7 . _ . . _ 3 P
解析对象的to_conll()方法将它们打印在串联符号中。令牌,标签和头部指数可通过成员变量访问:
>>> sent.tokens [u'The', u'book', u'is', u'on', u'the', u'table', u'.'] >>> sent.heads array([ 1, 2, -1, 2, 5, 3, 2]) >>> sent.labels [u'NMOD', u'SBJ', u'ROOT', u'LOC-PRD', u'NMOD', u'PMOD', u'P']
heads成员变量是一个numpy数组。阵列中的第i-th位置包含第i-th令牌的头部的索引,除了root令牌,其头为-1。请注意,这些索引是基于0的,而to_conll()函数中显示的索引是基于1的。
nlpnet还提供用于标记文本,培训新模型和测试的脚本。它们被复制到您的Python安装的脚本子目录中,可以包含在系统路径变量中。您可以从命令行调用它们并提供一些文本输入。
$ nlpnet-tag.py pos --data /path/to/nlpnet-data/ --lang pt
O rato roeu a roupa do rei de Roma.
O_ART rato_N roeu_V a_ART roupa_N do_PREP+ART rei_N de_PREP Roma_NPROP ._PU如果没有给出--data ,则脚本将在当前目录中搜索训练有素的模型。 --lang默认为en 。如果您已经具有令牌化的文本,则可以使用-t选项;它假设令牌被白色空间分开。
具有语义角色标签:
$ nlpnet-tag.py srl /path/to/nlpnet-data/
O rato roeu a roupa do rei de Roma.
O rato roeu a roupa do rei de Roma .
roeu
A1: a roupa do rei de Roma
A0: O rato
V: roeu第一行由用户键入,第二行是令牌化的结果。
和依赖解析:
$ nlpnet-tag.py dependency --data dependency --lang en
The book is on the table.
1 The _ DT DT _ 2 NMOD
2 book _ NN NN _ 3 SBJ
3 is _ VBZ VBZ _ 0 ROOT
4 on _ IN IN _ 3 LOC-PRD
5 the _ DT DT _ 6 NMOD
6 table _ NN NN _ 4 PMOD
7 . _ . . _ 3 P要了解有关培训和测试新模型以及其他功能的更多信息,请参阅http://nilc.icmc.usp.br/nlpnet的文档
以下参考文献描述了NLPNET的设计以及进行的实验。自发布以来,已对该代码进行了一些改进。