nlp任务的神经网络
nlpnet的Python项目详细描述
nlpnet -使用神经网络的自然语言处理
nlpnet是一个基于神经网络的自然语言处理任务的python库。 目前,它主要完成词性标注、语义角色标注和依存关系分析。 大多数架构都是独立于语言的,但有些功能是专门为工作而定制的 葡萄牙语。这个系统的灵感来自于 senna 。
重要提示: 要使用葡萄牙语NLP的训练模型,您需要从http://nilc.icmc.usp.br/nlpnet/models.html" rel="nofollow">http://nilc.icmc.usp.br/nlpnet/models.html下载数据。
依赖关系
nlpnet 需要 nltk 和 numpy 。此外,它还需要从nltk下载一些数据。安装后,请致电
< Buff行情>>>> nltk.download()
转到 models 选项卡并选择punkt标记器。它用于将文本分成句子。
cython用于生成c扩展并运行得更快。您可能不需要它,因为生成的
基本用法
nlpnet 既可以用作python库,也可以由其独立脚本使用。两种用法解释如下。
库的使用
您可以使用 nlpnet 作为python代码中的库,如下所示:
>>>importnlpnet>>>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')]]
在上面的示例中, postager 构造函数将其训练模型所在的目录作为第一个参数接收。第二个参数是两个字母的语言代码(目前只支持 pt 和 en )。这只会对标记化产生影响。
调用注释工具非常简单。提供的是 postager , srltagger 和 dependencParser ,它们都有一个方法 tag 来接收带有要标记的文本的字符串(在 dependencParser 中,方法 parse 有一个别名,这听起来更合适)。标记器将文本分割成句子,然后标记每个句子(因此,postagger的返回是一个列表列表)。
srltagger的输出稍微复杂一些:
< Buff行情>>>> tagger = nlpnet.SRLTagger() >>> tagger.tag(u'O rato roeu a roupa do rei de Roma.') [<nlpnet.taggers.SRLAnnotatedSentence at 0x84020f0>]
句子不是元组列表,而是由 srlannotatedstension 的实例表示。这个类基本上充当数据保持器,有两个属性:
< Buff行情>>>> 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_结构是一个包含句子中所有谓词参数结构的列表。在这个例子中,只有一个动词是roeu。它由一个带有谓词和dictio的元组表示没有将语义角色标签映射到构成参数的标记。
注意,动词作为元组的第一个成员出现,也作为标签"v"(代表动词)的内容出现。这是因为有些谓词是多字的。在这些情况下,"main"谓语词(通常是动词本身)出现在arg_structures[0]中,所有的词都出现在v键下。
下面是DependencyParser的一个示例:
< Buff行情>>>> 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
parsedEntence对象的 to戋conll() 方法以 conll 符号打印它们。可通过成员变量访问标记、标签和头索引:
< Buff行情>>>> 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个位置包含第i个令牌头的索引,根令牌除外,根令牌的头为-1。注意,这些索引是基于0的,而 to_conll() 函数中显示的索引是基于1的。
独立脚本
nlpnet 还提供用于标记文本、培训新模型和测试它们的脚本。它们被复制到python安装的 scripts 子目录中,该子目录可以包含在系统路径变量中。您可以从命令行调用它们并输入一些文本。
$ 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
如果未给出数据,脚本将在当前目录中搜索经过训练的模型。
--lang默认为
en
。如果文本已经标记化,则可以使用
带语义角色标签:
$ 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" rel="nofollow">http://nilc.icmc.usp.br/nlpnet
参考文献
下面的参考资料描述了nlpnet的设计以及所进行的实验。自代码发布以来,对其进行了一些改进。
- Fonseca、Erick和Aluísio、Sandra M. 一个用于非投射依赖性分析的深层架构。NLP矢量空间建模NAACL-HLT研讨会论文集。2015
- Fonseca,Erick and Rosa,Jo_o Luís G. 一种用于语义角色标记的两步卷积神经网络方法。神经网络国际联席会议记录。2013、
- Fonseca,Erick,Rosa,Jo_o Luís G.和Aluísio,Sandra M. 评估单词嵌入和葡萄牙语词性标注的修订语料库 。巴西计算机学会杂志。2015、