命名实体识别
命名实体识别(NER)是一项NLP任务,旨在将文本中提到的实体定位和分类为预定义的类别(例如人名,组织,位置等)。有许多不同的方法可以处理达到高精度的任务:基于规则的系统,训练深度神经网络的方法或细化预训练的语言模型的方法。例如,Spacy嵌入了一个预先训练的命名实体识别系统,该系统能够从文本中识别常见类别。
现在,我们着手建立一个NER系统,该系统能够识别属于某个Wikipedia类别的文本。让我们考虑以下示例语句:
“Named Entity Recognition and Topic Modeling are two tasks of Natural Language Processing”
这句话可能包含三个实体:“Named Entity Recognition”,“Topic Modeling”和“Natural Language Processing”。这三个实体具有属于某些类别的各自的Wikipedia页面。
在这张图片中,我们可以看到不同的类别如何在三个实体之间分布。在这种情况下,类别可以看作是我们要从文本中提取的实体的标签。现在,我们可以利用SpikeX的两个功能来构建一个自定义NER系统,该系统接受输入两个变量:句子的(i)文本和我们要检测的(ii)类别。
fromwasabiimportmsgfromspacyimportloadasspacy_loadfromspikex.wikigraphimportloadaswg_loadfromspikex.pipesimportWikiPageXdefwiki_entity_recognition(text, entity_root): entities= [] wg=wg_load("enwiki_core") #loadWikiGraphwikipagex=WikiPageX(wg) #createWikiPageXnlp=spacy_load("en_core_web_sm") doc=wikipagex(nlp(text)) #getdocwithwikipagesextractedentity_root=entity_root.replace(" ", "_") #fixspaces, justincase#getcontextasroot's categories at distance 2context = set(wg.get_categories(entity_root, distance=2))for span in doc._.wiki_spans:page_seen = set()for page in span._.wiki_pages:# avoid redirect duplicatespageid = wg.get_pageid(page)if pageid in page_seen:continuepage_seen.add(pageid)# check intersection with contextcategories = set(wg.get_categories(page))if len(set.intersection(categories, context)) == 0:continue# good entityentities.append((span, page))return entities#define the texttext = "Named Entity Recognition and Topic Modeling are two tasks of Natural Language Processing"#define the categoryentity_root = "Computational linguistic"for ent in wiki_entity_recognition(text, entity_root):print("%s - %s"%(ent[0],ent[1].upper()))
将打印如下结果:
NamedEntityRecognition-COMPUTATIONALLINGUISTICTopicModeling-COMPUTATIONALLINGUISTICNaturalLanguageProcessing-COMPUTATIONALLINGUISTIC
将wikipedia的类别定义为NER任务的标签,可以定义一个NER系统,从而避免数据训练问题。通过使用我们的基于Wikipedia类别的NER系统来表示提取的实体,还展示了一个进一步的示例。
在这个例子中,类别“Programming Language”和“Computational Linguistics”作为输入给出,然后在文本中搜索。
主题建模
当谈到主题建模时,我们通常指的是一种NLP工具,它能够发现文本主体的“隐藏语义结构”。最近,已经讨论了“为了自动文本分析的目的,主题的确切定义在某种程度上取决于所采用的方法” [1]。LDA(Latent Dirichlet Allocation潜在狄利克雷分布,注意:这里说的不是线性判别分析)是一种流行的主题建模方法,该方法使用概率模型在文档集中提取主题。另一个著名的方法是TextRank,它是一种使用网络分析来检测单个文档中主题的方法。最近,在NLP中的高级研究还引入了能够在句子级别提取主题的方法。语义超图(Semantic Hypergraphs)就是一个例子,“一种新颖的技术结合了机器学习和符号方法的优势,可以从句子的含义中推断出话题” [1]。
现在,我们看到如何使用Wikipedia在句子和文档级别执行主题建模。
让我们考虑专利US20130097769A1的以下内容。
Encapsulated protective suits may be worn in contaminated areas to protect the wearer of the suit. For example, workers may wear an encapsulated protective suit while working inside of a nuclear powered electrical generating plant or in the presence of radioactive materials. An encapsulated protective suit may be a one-time use type of system, wherein after a single use the suit is disposed of. An encapsulated protective suit may receive breathing air during normal operating conditions via an external air flow hose connected to the suit. The air may be supplied, for example, by a power air purifying respirator (PAPR) that may be carried by the user.
topics=Counter() forsentindoc.sents: topics=Counter() sent=nlp(sent.text) sent=wikipagex(sent) print(sent) print('Topics in the sentence:') forspaninsent._.wiki_spans: if ( len(span._.wiki_pages) >1orspan[0].pos_notingood_posorspan[-1].pos_notingood_pos ): continuetopics.update(wg.get_categories(span._.wiki_pages[0], distance=2)) fortopic, countintopics.most_common(): print('\t',topic.replace('Category:',''), "->", count) print('----')
结果如下:
Sentence: Encapsulatedprotectivesuitsmaybewornincontaminatedareastoprotectthewearerofthesuit. Topicsinthesentence: Safety->1Euthenics->1----Sentence: Forexample, workersmaywearanencapsulatedprotectivesuitwhileworkinginsideofanuclearpoweredelectricalgeneratingplantorinthepresenceofradioactivematerials. Topicsinthesentence: Safety->1Euthenics->1Electricity->1Electromagnetism->1Locale_(geographic) ->1Electric_power_generation->1Power_stations->1Infrastructure->1Energy_conversion->1Chemistry->1Radioactivity->1----Sentence: Anencapsulatedprotectivesuitmaybeaone-timeusetypeofsystem, whereinafterasingleusethesuitisdisposedof. Topicsinthesentence: Safety->1Euthenics->1Transportation_planning->1Feminist_economics->1Schools_of_economic_thought->1Land_management->1Architecture->1Planning->1Transport->1Feminism->1Urban_planning->1Feminist_theory->1Urbanization->1Spatial_planning->1Social_sciences->1----Sentence: Anencapsulatedprotectivesuitmayreceivebreathingairduringnormaloperatingconditionsviaanexternalairflowhoseconnectedtothesuit. Topicsinthesentence: Safety->1Euthenics->1Chemical_industry->1Gases->1Industrial_gases->1Breathing_gases->1Diving_equipment->1Respiration->1Electromechanical_engineering->1Heat_transfer->1Home_appliances->1Engineering_disciplines->1Automation->1Building_engineering->1Temperature->1Heating,_ventilation,_and_air_conditioning->1----Sentence: Theairmaybesupplied, forexample, byapowerairpurifyingrespirator (PAPR) thatmaybecarriedbytheuser.Topicsinthesentence: Personal_protective_equipment->1Air_filters->1Respirators->1Protective_gear->1----
专利文本的每个句子都使用SpikeX处理,并且从句子中检测到的相应Wikipedia页面中提取了Categories。我们将主题视为Wikipedia的类别。这样,我们就可以首次对主题进行简单的检测。与语义超图,文本等级或LDA不同,此方法无需直接引用术语即可查找句子主题的标签。提取的主题标签是指与SpikeX匹配的Wikipedia页面的类别。如果我们使用这种方法汇总每个句子的主题,那么整个文档将有更好的表示形式。
通过增加句子中类别的频率,可以更广泛地查看文本的主题分布。“Safety”和“Euthenics”出现的频率高于其他类别。
现在,我们使用整个专利文本(可在Google Patent中找到)来查找分类分布。
如我们所见,我们可以自动检测整个文档的主题(或类别)(在这种情况下为专利)。展望前5个类别,我们可以推断出专利的含义。无需任何预训练任务即可完成此操作。
总结
十多年来,维基百科已被用作知识的来源,并已在多种应用中反复使用:文本注释,分类,索引,聚类,搜索和自动分类法生成。维基百科的结构实际上具有许多有用的功能,使其成为这些应用程序的理想之选。
这篇文章演示了如何使用这一强大的资源来改进NLP的简单任务。但是,并未声称此方法优于其他最新方法。这篇文章中未显示评估NLP任务准确性的典型精度和召回率度量。
而且,这种方法具有优点和缺点。主要优点在于避免了训练,从而减少了耗时的注释任务。可以将Wikipedia视为一项庞大的培训课程,其贡献者遍布全球。对于有监督的任务(例如NER)和无监督的任务(例如主题建模),这是正确的。这种方法的缺点是双重的。首先,维基百科是一项公共服务,由专家和非专家共同为知识库提供服务。其次,从主题建模结果可以看出,自然语言的歧义会导致性能出现偏差。词义歧义消除和非专家驱动的数据整理显然会影响整个系统的可靠性。
但是,还有很大的改进空间。将Wikipedia视为针对NLP任务的大型开放式知识库,这与新的即将发生的范式转换是一致的:所谓的人工智能(AGI),即系统理解或学习人类可以执行的任何智力任务的假设能力。