全文共3436字,预计学习时长7分钟
在学习自然语言处理(NLP)时,常常会遇到一个挑战 - 我们可以为非英语语言建立模型吗?很长一段时间以来,这个问题都没有一个确定的答案。每种语言都有自己的语法模式和语言细微的差别,并且其他语言中并没有很多数据集可用。
直到出现了斯坦福大学最新的NLP库--Sanford NLP。作者声称StanfordNLP可以支持超过53种人类语言。
它打开了一个无限可能的世界 - Stanford NLP在其原稿中包含了印度语,汉语和日语等亚洲语言的预训练模型。
所有NLP爱好者都渴望NLP库能够具有兼容多种语言的能力。在本文中,我们将了解StanfordNLP是什么,为什么它如此重要,之后启动的Python以使其生效。我们还将用印地语来研究一个案例,以此展示StanfordNLP的工作原理。
什么是StanfordNLP,
为什么要使用它?
以下是作者自己对StanfordNLP的描述:StanfordNLP是斯坦福团队在CoNLL 2018共享任务中使用的通用依赖性分析软件包的组合,以及该组合与Stanford CoreNLP软件的官方Python接口。
这里的信息量很大,让我们分解一下:
·来自世界各地的研究机构团队的代表试图解决一项基于NLP的任务。
·去年的任务之一是“从原始文本到通用依赖项的多语言解析”。简单来说,它意味着将多种语言的非结构化文本数据解析为通用依赖项中的有用注释。
·Universal Dependencies(通用依赖项)是一个保持注释一致性的框架。无论要解析的语言如何,都会为文本生成这些注释。
· 斯坦福大学由于软件故障(最终排在第4位)提交的报告在2017年排名第一,他们错失了第一名。
StanfordNLP是一系列经过预训练的最先进模型。这些模型被研究人员用于2017和2018年康奈尔大学的竞赛。所有模型都基于Py Torch来构建,可以在你自己的注释数据上进行训练和评估。听上去是不是很棒?
此外,StanfordNLP还包含流行的巨型NLP库--CoreNLP的官方包装器。到目前为止,这在某种程度上仅限于Java的生态系统。所以,本教程可以让你了解更多有关CoreNLP及其在Python的中工作原理的信息。
以下是你应该查看此库的其他几个原因:
·Native Python的实现需要设置最少的工作量
·用于强大文本分析的全神经网络通道,包括:
·符号化
·多字令牌(MWT)扩展
·词形还原
·词性(POS)和形态特征标记
·依赖性分析
·在73个个库库中支持53种(人类)语言的预训练神经模型
·一个稳定的官方维护CoreNLPPython接口
这些正是NLP爱好者所追求的。
在Python的中设置StanfordNLP
最初,库中的一些奇怪的事情使不少人感到困惑。例如,你需要Python 3.6.8 / 3.7.2或更高版本才能使用StanfordNLP。为了安全起见,可以在Anaconda for Python 3.7.1中设置一个独立的环境你可以这样做:
1.打开畅达提示符并输入以下内容:
conda create-n stanfordnlp python = 3.7.1
2.现在,激活软件包:
来源激活stanfordnlp
3.安装StanfordNLP库:
pip install stanfordnlp
4.我们需要下载一个语言的特定模型来使用它。启动python 她将导入StanfordNLP:
import stanfordnlp
然后下载英语的语言模型(“EN”):
stanfordnlp.download( '恩')
这可能需要一段时间,具体取决于你的网络连接情况。这些语言模型所占空间非常庞大(英文版本为1.96GB)。
几项重要的标注
·StanfordNLP建立在PyTorch 1.0.0之上。如果您使用旧版本,它可能会崩溃。以下是检查计算机上安装的版本的方法:
pip freeze | grep torch
其输出应为torch == 1.0.0
·作者曾在联想 ThinkpadE470(8GB RAM,Intel Graphics)上尝试使用不带GPU的库,很快Python中就出现了内存错误。因此,建议你切换到另一台支持GPU的机器上。你可以尝试谷歌 Colab,它提供免费的GPU支持。
使用StanfordNLP执行基本NLP任务
StanfordNLP内置处理器,可执行五项基本NLP任务:
·符号化
·多字令牌扩展
·词形归并
·词性标注
·依赖性分析
让我们从创建文本通道开始:
nlp = stanfordnlp.Pipeline(processors =“ token ize,mwt,lemma,pos”)
doc = nlp(“”英国3月29日有序退出欧盟的前景已经进一步消退,即使国会议员团结一致以阻止无交易的情况。对终止伦敦会员资格的法案草案的修改要求总理Theresa May将与布鲁塞尔重新谈判她的退出协议.Tory后座议员的提议呼吁政府提出替代爱尔兰支持的替代方案,这是该协议与欧盟其他国家达成协议的核心原则。“”
参数用于指定任务如果没有传递参数,则默认情况下会采用所有五个处理器以下是处理器及其功能的简要概述。:
让我们分别来看看他们的功能。
符号化
一旦运行令牌处理器,该过程就会隐式发生它实际上非常快你可以使用print_tokens查看令牌。:
文档。句子 [0] .print_tokens
令牌对象包含句子中的令牌索引和单词对象列表(在多字令牌的情况下)。每个单词对象都包含有用的信息,如单词的索引,文本的引理,POS(词性)标签和技艺(形态特征)标签。
词形归并
这涉及使用由引理处理器生成的单词的“引理”属性这是获取所有单词的引理的代码:
将pandas导入为pd
#提取物 _lemma
def extract_lemma(doc):
parsed_ text = {' word ':,'lemma':}
for doc.sentences:
for sent.words中的wrd:
#extract text和lemma
parsed_text [ '单词']。追加(wrd.text)
parsed_text [ '引理']。追加(wrd.lemma)
#return一个数据帧
return pd.DataFrame(parsed_text)
#call doc上的功能
extract_lemma(DOC)
这将返回每个单词的熊猫数据框及其各自的引理:
词性(POS)标记
销售点标记器速度非常快,并且跨语言都能很好地工作就像引理一样,销售点标签也很容易提取。:
包含pos标签及其exp lanations的#dictionary
pos_dict = {
'CC':'协调连接','CD':'基数数字','DT':'确定者',
'EX':'存在于那里(比如:\“有\”......想到它就像“存在\”)',
'FW':'外来词','IN':'介词/从属连词','JJ':'形容词''大'',
'JJR':'形容词,比较''更大''','JJS':'形容词,最高级''最大'',
'LS':'listmarker 1)','MD':'modalcould,will','NN':'noun,singular''desk \'',
'NNS':'nounplural \'desks \'','NNP':'专有名词,单数''Harrison \'',
'NNPS':'专有名词,复数''美国人','PDT':'预定者''所有孩子''',
'POS':'占有欲的结束父母','PRP':'人称代词我,他,她 ',
'PRP $':'占有代词我的,他的,她的','RB':'副词,默默地',
'RBR':'副词,比较好','RBS':'副词,最高级',
'RP':'粒子放弃','TO':'去''到商店。','UH':'interjection errrrrrrrm',
'VB':'动词,基本形式','VBD':'动词,过去时态',
'VBG':'动词,动名词/现在分词','VBN':'动词,过去分词',
'VBP':'动词,唱歌。现在,非3d取','VBZ':'动词,第三人唱。现在需要',
'WDT':'wh-determininer','WP':'wh-pronoun who,what','WP $':'占有wh代词',','
'WRB':'wh-abverb where where,when','QF':'量词,bahut,thoda,kam(印地语)','VM':'mainverb',
' PSP ':'后置位置,常见于印度语中','DEM':'示范性,常见于印度语中'
}
#extract词性
def extract_pos(doc):
parsed_text = {'word':,'pos':,'exp':}
for doc.sentences:
for sent.words中的wrd:
如果pos_dict.keys中的wrd.pos:
pos_exp = pos_dict [wrd.pos]
其他:
pos_exp ='NA'
parsed_text [ '单词']。追加(wrd.text)
parsed_text [ '正']。追加(wrd.pos)
parsed_text [ 'EXP']。追加(pos_exp)
#return pos和text的数据帧
return pd.DataF ram e(parsed_text)
#extract pos
extract_pos(DOC)
注意到上面代码中的巨型库了吗?它只是销售点标签及其含义之间的映射。这有助于更好地理解我们文档的语法结构。
输出将是一个包含三列的数据框 - word,pos和exp(说明)。解释栏为我们提供了有关文本的大部分信息(因此非常有用)。
添加解释栏可以更轻松地评估处理器的精度。标签器对于大多数单词的标记都是准确的。它甚至可以提取一个单词的时态,无论是基本形式还是复数形式。
依赖项提取
依赖项提取是StanfordNLP的另一个现有的功能您可以简单地在句子上调用print_dependencies来获取其所有单词的依赖关系:
doc.sentences [0] .print_dependencies
该库在单次运行通道期间计算上述所有内容。在启用GPU的计算机上,仅需几分钟的时间。
我们现在已经找到了一种使用StanfordNLP执行基本文本处理的方法。现在是时候利用该方法来对其他50多种语言做同样的事情啦!
在印地语上实施StanfordNLP
StanfordNLP在其性能和多语言文本解析支持方面确实非常突出。让我们深入探讨以下方面。
处理印地语文本(梵文脚本)
首先,我们必须下载印地语语言模型(相对较小):
stanfordnlp.download( 'HI')
现在,用印地语作为我们的文本文件:
hindi_doc = NLP( “” “केंद्रकीमोदीसरकारनेशुक्रवारकोअपनाअंतरिमबजटपेशकिया。कार्यवाहकवित्तमंत्रीपीयूषगोयलनेअपनेबजटमेंकिसान,मजदूर,करदाता,महिलावर्गसमेतहरकिसीकेलिएबंपरऐलानकिए。हालांकि,बजटकेबादभीटैक्सकोलेकरकाफीकन्फ्यूजनबनारहा。केंद्रसरकारकेइसअंतरिमबजटक्याखासरहाऔरकिसकोक्यामिला,आसानभाषामेंयहांसमझें” “”)
。这应该足以生成所有标签我们来看看印地语的标签:
extract _pos(hindi_doc)
PoS标记器在印地语文本上的效果也令人惊讶。以“अपना”为例,PoS标签将其标记为代词 - 我,他,她 - 这是准确的。
使用CoreNLP的API进行文本分析
CoreNLP是经过时间考验的行业级NLP工具包,以其性能和准确性而闻名.StanfordNLP已被宣布作为CoreNLP的官方蟒蛇接口。这对于这个库来说是一个巨大的胜利。
之前一直为CoreNLP创建的Python包装程序包而努力,但没有什么比作者采用自己的官方版本实现的效果更好。这意味着该库将定期更新和改进。
StanfordNLP需要三行代码才能开始使用CoreNLP的复杂API。从字面上看,只需三行代码就可以设置它。
1.下载CoreNLP包。打开Linux终端并键入以下命令:
2.解压缩下载的包:
unzipstanford-corenlp-full-2018-10-05.zip
3.启动CoreNLP 服务器:
java -mx4g-cp“*”edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000-timeout 15000
注意:CoreNLP需要运行Java8。请确保你已安装JDK和JRE 1.8.xp.
现在,确保StanfordNLP知道CoreNLP存在的位置。为此,你必须导出$ CORENLP_HOME作为文件夹的位置。在作者的例子中,这个文件夹在家里,所以路径应该是:
EXP ortCORENLP_HOME =斯坦福-corenlp-全2018年10月5日/
完成上述步骤后,你可以启动服务器并使用的Python代码发出请求。的英文下面启动服务器,发出请求以及从返回的对象访问数据的综合示例。
设置CoreNLPClient
来自stanfordnlp.server 导入 CoreNLPClient
#exampletext
打印(' - -')
打印( '的inputText')
打印('')
“克里斯·曼宁是一个很好的人。克里斯写了一个简单的句子。他给人们带来了橙子。”
打印(文本)
#设置客户端
打印(' - -')
print('启动Java Stanford CoreNLP Server ...')
#设置客户端
使用CoreNLPClient(annotators = ['tokenize','ssplit','pos',' lemma','ner','depparse','coref'],timeout = 30000,memory ='16G')作为客户端:
#将请求提交给服务器
ann = client.annotate(text)
#得到第一句话
句子= ann.sentence [0]
依赖性分析和POS
#获取第一句的依赖性解析
打印(' - -')
print('第一句的依赖解析')
dependency_parse = sentence.basicDependencies
打印(dependency_parse)
#获取第一句的第一个标记
打印(' - -')
打印('第一句的第一个标记')
token = sentence.token [0]
打印(标记)
#获取词性标签
打印(' - -')
print('令牌的词性标签')
token.pos
打印(令牌。位)
命名实体识别和共同参考链
#获取命名实体标记
打印(' - -')
print('令牌的命名实体标签')
打印(token.ner)
#从第一句中获取实体提及
打印(' - -')
打印('句子中的第一个实体提及')
打印(sentence.mentions [0])
#访问coref链
打印(' - -')
print('示例'coref链')
打印(ann.corefChain)
#使用tokensregex模式找到一个句子。
pattern ='([ner:PERSON] +)/写/ /一个?/ {0,3} /句子|文章/'
匹配=客户端。令牌 sregex(文字,图案)
#句子包含每个句子的匹配列表。
断言len(匹配[“句子”])== 3
#length告诉你这里是否有任何匹配
断言匹配[“句子”] [1] [“长度”] == 1
#您可以像大多数regexgroups一样访问匹配项。
匹配[“句子”] [1] [“0”] [“文字”] ==“克里斯写了一个简单的句子”
匹配[“sentence”] [1] [“0”] [“1”] [“text”] ==“Chris”
#使用semgrex模式直接找到whowrote什么。
pattern ='{ word:written}> nsubj {} = subject> dobj {} = object'
matches = client.semgrex(text,pattern)
#句子包含每个句子的匹配列表。
断言len(匹配[“句子”])== 3
#length告诉你这里是否有任何匹配
断言匹配[“句子”] [1] [“长度”] == 1
#您可以像大多数regexgroups一样访问匹配项。
匹配[“sentence”] [1] [“0”] [“text”] ==“写”
匹配[“sentence”] [1] [“0”] [“$ subject”] [“text”] ==“Chris”
匹配[“ sentence ”] [1] [“0”] [“$ object”] [“ text ”] ==“句子”
上面的例子几乎没有触及CoreNLP可以做什么,但它非常有趣,我们能够完成从基本的NLP任务,如词性标记,到命名实体识别,共同参考链提取和查找谁用几行的Python代码在一个句子中写了什么。
关于使用StanfordNLP的思考 - 优点和缺点
探索新提出的库肯定是一个挑战,因为几乎没有关于StanfordNLP的文档,但这却是一次非常愉快的学习经历。
关于StanfordNLP未来,有几件事会令人兴奋不已:
1.它为多种语言提供现成的支持。
2.事实上,它将成为Core NLP的官方Python接口。这意味着它会在功能和易用性方面有所改进。
3.它的速度相当快(除了内存占用量较大)
4.在Python中直接设置
然而,仍然有一些问题需要解决和改进:
1.语言模型的所占空间太大(英文为1.9 GB,中文为~1.8 GB)
2.库需要大量的代码,以生产出功能。将其与NLTK相比较,你可以在其中快速编写原型脚本 - 然而这对于StanfordNLP来说几乎是不可能的。
3.目前缺少可视化功能。对依赖项分析等函数很有用。但与SpaCy等库相比,StanfordNLP在这里还存在一些不足。
留言与评论(共有 0 条评论) |