使用stanza完成自然语言分析处理任务

Posted ArkonLu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用stanza完成自然语言分析处理任务相关的知识,希望对你有一定的参考价值。

安装stanza

直接使用pip命令即可安装stanza package

pip install stanza

构建管道

stanza中的管道用于构建NLP任务的模型加载序列、文本处理序列。需要注意,当本地不存在指定的Processor模型时,Pipeline对象会执行一个自动下载程序,将模型下载到本地。

Pipeline的初始化示例

import stanza
nlp = stanza.Pipeline(\'en\')# 加载全部英文模型,包括分词、序列标注、句法依赖,语义角色标注等
nlp = stanza.Pipeline(\'zh\', processors=\'tokenize,pos\')# 加载中文分词,序列标注模型

详细的processors列表见 processor_name_list

Pipeline的客制化设置

package 指定模型的训练数据集gsd

nlp = stanza.Pipeline(\'de\', processors=\'tokenize,mwt\', package=\'gsd\')

设定采用conll02数据集训练出的模型进行NER任务,默认的模型完成其他分析任务

nlp = stanza.Pipeline(\'nl\', processors=\'ner\': \'conll02\')

设定采用winker数据集训练出的模型进行NER任务,lassysmall训练的模型完成其他分析任务

nlp = stanza.Pipeline(\'nl\', processors=\'ner\': \'wikiner\', package=\'lassysmall\')

只将部分子任务添加到管道,并且为各子任务指定模型来源,注意package=None,若不设置,Pipline中会增加多余的子任务

processor_dict = 
    \'tokenize\': \'gsd\', 
    \'pos\': \'hdt\', 
    \'ner\': \'conll03\', 
    \'lemma\': \'default\'

nlp = stanza.Pipeline(\'de\', processors=processor_dict, package=None)

控制模型运行的设备CPU/GPU

stanza中的模型默认在GPU上运行,可以在构建管道时,通过use_gpu = False使得任务得以在CPU上展开。

nlp = stanza.Pipeline(\'en\', use_gpu=False)

执行标注

句子级标注(一个句子结束符)

句子级文档标注直接将要标注的句子放入构建好的Pipeline对象中,执行即可。

nlp = stanza.Pipeline(\'zh\',processors=\'tokenize,pos,ner\')
doc = nlp(\'今天也是元气满满的一天。\')
print(\'doc:\')
doc

得到元素长度为1的doc对象,其结构如下,doc对象中包含了标注结果和对应的span结果

文档级标注

单一文档标注(多个结束符)

单一文档标注与句子级文档标注类似,差别在于输入的文档中包含了多个句子,每个句子都会单独作为标注的结果,存放在返回的doc对象list中

nlp = stanza.Pipeline(\'zh\',processors=\'tokenize,pos,ner\')
doc = nlp(\'今天也是元气满满的一天。明天应该还是元气满满的一天。\')# 返回一个doc对象,该doc的长度是2
# 访问标注结果
for sentence in doc.sentences:
    for word in sentence.words:
        print(word.ner, word.pos)

多文档标注

多文档标注借助stanza.Document()类实现,返回的标注结果是每个单一文档的doc组成的list

import stanza
nlp = stanza.Pipeline(lang="en") # 初始化默认的英文Pipeline
documents = ["This is a test document.", "I wrote another document for fun."] # 要处理的文档
in_docs = [stanza.Document([], text=d) for d in documents] #将每个文档构造出对应的stanza.Document对象,放入输入列表
out_docs = nlp(in_docs) # 开始标注
print(out_docs[1]) # 得到标注结果,返回的标注结果是每个单一文档的doc组成的list

Reference

https://stanfordnlp.github.io/stanza/getting_started.html#basic-example

基于正则表达式的词行词法分析|自然语言处理


1.任务一:邮箱地址和网址提取

1.1任务描述

∙ \\bullet 实现基于正则表达式的字符串抽取,完成对 string文本的邮箱地址和网址,并按下面格式输出。

测 试 输 入 {\\color{Violet}测试输入}

(1)我的邮箱:nlp@nudt.com
(2)please click https://www.educoder.net

测 试 输 出 {\\color{Violet}测试输出}

(1)提取邮箱地址如下:
nlp@nudt.com
(2)提取网址如下:
https://www.educoder.net

1.2代码

import re
string =input()

#分别生成对应正则表达式对象
regex1 = re.compile(r'\\w+@\\w+.\\w+')
regex2 = re.compile(r'ht{2}ps://w{3}.\\w+.\\w+')

res = regex1.findall(string)
if len(res):
    print('提取邮箱地址如下:')
for i in res:
    print(i)

res1 = regex2.findall(string)
if len(res1):
    print('提取网址如下:')
for i in res1:
    print(i)

2.任务二:密码提取

2.1任务描述

∙ \\bullet 实现基于正则表达式的字符串抽取,完成对 string文本的密码提取,并按下面格式输出。

测 试 输 入 {\\color{Violet}测试输入}

密码是:NUDT_NLP2021

测 试 输 出 {\\color{Violet}测试输出}

提取密码是
NUDT_NLP2021

2.2代码

import re
string =input()

#提取密码代码,密码中包含字母、数字、下划线
print("提取密码是")
p = re.compile('[a-z]|[A-Z]|_|\\d')
t = re.findall(p,string)
if t:
    for i in t:
        print(i,end="")

以上是关于使用stanza完成自然语言分析处理任务的主要内容,如果未能解决你的问题,请参考以下文章

LTP 4.0!单模型完成6项自然语言处理任务

处理收到的Stanzas

基于正则表达式的词行词法分析|自然语言处理

这个自然语言处理“工具”,玩得停不下来

BERT源码分析PART III

API分享|适合文本分析自然语言处理和情感分析的API