使用Wikipedia来改进NLP任务,如命名实体识别和主题建模
介绍
自然语言处理(NLP)正在兴起。计算语言学和人工智能正在加入它们的力量,促进突破性发现。虽然研究集中在显著提高NLP技术上,但企业正在把这项技术视为一项战略资产。这种由NLP引导的突破性创新的主要作用是大量可用的文本数据。谈到数字化时,尤其是对于企业来说,重要的是要记住文档是知识的主要来源。
但是,当训练自然语言处理任务时,最大的瓶颈之一就是训练的数据。当涉及诸如特定领域的实词应用程序时,我们面临着资源匮乏的数据问题。训练数据有两个主要问题:(i)难以获取大量数据,以及(ii)在注释可用数据以进行训练和测试时费时的过程。
面对这些问题已经引起了计算机科学的广泛关注。特别是,最新的计算进展提出了两种解决低资源数据问题的方法:
微调预先训练好的语言模型,如BERT或GPT-3;
利用高质量的开放数据存储库,如Wikipedia或ConceptNet。
现在,大多数可用的计算语言学开放库都提供了基于这两种方法之一来开发NLP工具的体系结构。现在,我们演示如何利用Wikipedia来提高两个NLP任务的性能:命名实体识别和主题建模。
从维基百科中提取信息
有几种工具可用于处理来自Wikipedia的信息。对于涉及文本数据自动处理的问题,我们使用了一个名为SpikeX的spaCy项目。
SpikeX是由一家意大利公司(Erre Quadro Srl)开发的,旨在帮助构建知识提取工具。SpikeX可以理解为一个可以进行spaCy pipeline操作的集合。
pipinstall--no-cache-Ugit+https://github.com/erre-quadro/spikex.git@developspikexdownload-wikigraphenwiki_corespacydownloaden_core_web_sm
SpikeX有两个好用的功能:
1、给定一个维基百科页面,它会提取出所有相应的类别。
fromwasabiimportmsgfromtimeimportprocess_timeastimepage="Natural_Language_Processing"print(f"Categories for `{page}`:") t=time() forcinwg.get_categories(page): print("\t", c) forccinwg.get_categories(c): print("\t\t->", cc) msg.good(f"Success in {time() - t:.2f}s")
结果如下:
Categoriesfor`Natural_Language_Processing`: Category:Artificial_intelligence->Category:Emerging_technologies->Category:Cybernetics->Category:Subfields_of_computer_science->Category:Computational_neuroscience->Category:Futures_studies->Category:Cognitive_science->Category:Personhood->Category:Formal_sciencesCategory:Speech_recognition->Category:Artificial_intelligence_applications->Category:Computational_linguistics->Category:Human–computer_interaction->Category:Digital_signal_processing->Category:SpeechCategory:Natural_language_processing->Category:Artificial_intelligence_applications->Category:Computational_linguisticsCategory:Computational_linguistics->Category:Computational_social_science
2、给定一个句子,它会找到与维基百科页面标题匹配的文本块。
fromspacyimportloadasspacy_loadfromspikex.wikigraphimportloadaswg_loadfromspikex.pipesimportWikiPageX#loadaspacymodelandgetadocnlp=spacy_load('en_core_web_sm') doc=nlp('Elon Musk runs Tesla Motors') #loadaWikiGraphwg=wg_load('enwiki_core') #getaWikiPageXandextractallpageswikipagex=WikiPageX(wg) doc=wikipagex(doc) #seeallpagesextractedfromthedocforspanindoc._.wiki_spans: print(span) print(span._.wiki_pages) print('------')
结果如下:
ElonMusk('Elon_Musk', 'Elon_musk', 'Elon_Musk_(book)', 'Elon_Musk_(2015_book)', 'Elon_Musk_(2015)', 'Elon_Musk_(biography)', 'Elon_Musk_(2015_biography)', 'Elon_Musk_(Ashlee_Vance)') ------Elon('Elon_(Judges)', 'Elon_(name)', 'Elon_(Hebrew_Judge)', 'Elon_(Ilan)', 'Elon_(disambiguation)', 'Elon_(biblical_judge)', 'Elon_(chemical)', 'Elon') ------Musk('Musk', 'MuSK', 'Musk_(wine)', 'Musk_(song)', 'Musk_(Tash_Sultana_song)', 'Musk_(disambiguation)') ------runs('Runs_(baseball_statistics)', 'Runs', 'Runs_(cricket)', 'Runs_(music)', 'Runs_(baseball)', 'Runs_(Baseball)', 'Runs_(musical)') ------TeslaMotors('Tesla_motors', 'Tesla_Motors') ------Tesla('Tesla_(band)', 'Tesla_(unit)', 'Tesla_(Czechoslovak_company)', 'Tesla_(crater)', 'Tesla_(microarchitecture)', 'Tesla_(2020_film)', 'Tesla_(car)', 'Tesla_(GPU)', 'TESLA', 'Tesla_(physicist)', 'Tesla_(group)', 'Tesla_(opera)', 'Tesla_(Bleach)', 'Tesla_(company)', 'Tesla_(disambiguation)', 'Tesla_(2016_film)', 'TESLA_(Czechoslovak_company)', 'Tesla_(unit_of_measure)', 'Tesla_(vehicles)', 'Tesla_(vehicle)', 'Tesla_(film)', 'Tesla_(album)', 'Tesla_(Flux_Pavilion_album)', 'Tesla_(surname)', 'Tesla') ------Motors ('Motors')
如我们所见,在第一个示例中,SpikeX提取了Wikipedia页面“Natural_language_processing”所属的所有类别。例如,“Natural_language_processing”属于“人工智能”、“语音识别”和“计算语言学”的类别。可以通过更深层次的检查进一步探索Wiki类别的树形结构。
在第二个例子中,对于“Elon Musk runs Tesla Motors”这句话,SpikeX抽取了这句话中所有可能在维基百科上有页面的页面。
现在,我们将看到如何使用这两个处理特性来执行命名实体识别和主题建模。