下面是一些典型的 NER 系统可以标记的对象类型:
人名
公司名称
地理位置(物理和政治)
产品名称
日期与时间
金钱数量
事件名称
NER 有大量的用途,因为它可以很容易地从文本中获取结构化数据。这是从 NLP 流水线中快速获取有价值信息的最简单方法之一。
步骤 8:共指解析
到此,我们对句子已经有了一个很好的表述。我们知道每个单词的词性、单词如何相互关联、哪些词在谈论命名实体。
然而,我们还有一个大问题。英语里充满了人称代词,比如他、她,还有它。这些是我们使用的快捷表述方法,而不需要在每个句子中一遍又一遍地写名字。人类可以根据上下文来记录这些词所代表的内容。但是我们的 NLP 模型不知道人称代词是什么意思,因为它一次只检查一个句子。
让我们看看文档中的第三句话:
「It was founded by the Romans, who named it Londinium.」
如果我们用 NLP 流水线来解析这个句子,我们就会知道「it」是由罗马人建立的。但知道「London」是由罗马人建立的则更为有用。
人类阅读这个句子时,可以很容易地理解「it」的意思是「London」。共指解析的目的是通过追踪句子中的代词来找出相同的映射。我们想找出所有提到同一个实体的单词。
下面是我们的文档中对「London」一词的共指解析的结果:
利用共指信息与解析树和命名实体信息相结合,我们可以从文档中提取大量信息。
共指解析是 NLP 流水线实现中最困难的步骤之一。这比句子分析更困难。深度学习的最新进展研究出了更精确的新方法,但还不完善。如果您想了解更多关于它是如何工作的,请查看:https://explosion.ai/demos/displacy-ent。
NLP 流水线的 PYTHON 实现
下面是我们完整的 NLP 流水线的概述:
共指解析是一个不一定要完成的可选步骤。
哟,看起来有好多步骤!
注意:在我们继续之前,值得一提的是,这些是典型的 NLP 流水线中的步骤,但是您可以将跳过某些步骤或重新排序步骤,这取决于您想做什么以及如何实现 NLP 库。例如,像spaCy 这样的一些库是在使用依赖性解析的结果后才在流水线中进行句子分割。
那么,我们应该如何对这个流水线进行编码呢?感谢像 spaCy 这样神奇的 Python 库,它已经完成了!这些步骤都是编码过的,可以随时使用。
首先,假设已经安装了 Python 3,可以这样安装 spaCy:
#InstallspaCy pip3install-Uspacy #DownloadthelargeEnglishmodelforspaCy python3-mspacydownloaden_core_web_lg #Installtextacywhichwillalsobeuseful pip3install-Utextacy
然后,在一段文本上运行 NLP 流水线的代码看起来如下:
importspacy #LoadthelargeEnglishNLPmodel nlp=spacy.load('en_core_web_lg') #Thetextwewanttoexamine text="""LondonisthecapitalandmostpopulouscityofEnglandand theUnitedKingdom.StandingontheRiverThamesinthesoutheast oftheislandofGreatBritain,Londonhasbeenamajorsettlement fortwomillennia.ItwasfoundedbytheRomans,whonameditLondinium. """ #ParsethetextwithspaCy.Thisrunstheentirepipeline. doc=nlp(text) #'doc'nowcontainsaparsedversionoftext.Wecanuseittodoanythingwewant! #Forexample,thiswillprintoutallthenamedentitiesthatweredetected: forentityindoc.ents: print(f"{entity.text}({entity.label_})")
如果你运行到 z 这里,你将得到一个在我们的文档中检测到的命名实体和实体类型的列表:
London(GPE) England(GPE) theUnitedKingdom(GPE) theRiverThames(FAC) GreatBritain(GPE) London(GPE) twomillennia(DATE) Romans(NORP) Londinium(PERSON)
您可以在这里查找这些代码:https://spacy.io/usage/linguistic-features#entity-types。
注意它在「Londinium」上犯了一个错误,认为它是一个人的名字而不是一个地方。这可能是因为在训练数据集中没有类似的东西,所以它做了最好的猜测。命名实体检测通常需要一小段模型微调(https://spacy.io/usage/training#section-ner),如果您正在解析具有独特或专用术语的文本。
让我们来检测实体并使用它来建立一个数据洗涤器。假设你正试图遵守新的 GDPR 隐私规则(https://medium.com/@ageitgey/understand-the-gdpr-in-10-minutes-407f4b54111f),并且你发现你有数以千计的文件,其中包含有个人可识别的信息,比如人的名字。你接到了移除文档中所有名字的任务。
通过数以千计的文件去搜寻并删除所有的名字,人工可能需要几年。但是使用 NLP,这是很容易实现的。这里有一个简单的洗涤器,去除它检测到的所有名字:
importspacy #LoadthelargeEnglishNLPmodel nlp=spacy.load('en_core_web_lg') #Replaceatokenwith"REDACTED"ifitisaname defreplace_name_with_placeholder(token): iftoken.ent_iob!=0andtoken.ent_type_=="PERSON": return"[REDACTED]" else: returntoken.string #Loopthroughalltheentitiesinadocumentandcheckiftheyarenames defscrub(text): doc=nlp(text) forentindoc.ents: ent.merge() tokens=map(replace_name_with_placeholder,doc) return"".join(tokens) s=""" In1950,AlanTuringpublishedhisfamousarticle"ComputingMachineryandIntelligence".In1957,NoamChomsky’s SyntacticStructuresrevolutionizedLinguisticswith'universalgrammar',arulebasedsystemofsyntacticstructures. """ print(scrub(s))
如果你运行它,你会发现它的结果是符合你的预期的:
In1950,[REDACTED]publishedhisfamousarticle"ComputingMachineryandIntelligence".In1957,[REDACTED] SyntacticStructuresrevolutionizedLinguisticswith'universalgrammar',arulebasedsystemofsyntacticstructures.
提取事实
你能用 spaCy 做的事情是非常多的。但是,您也可以使用 spaCy 解析的输出作为更复杂的数据提取算法的输入。有一个 Python 库叫做 textacy,它在 spaCy 之上实现了几种常见的数据抽取算法。这是一个很好的起点。
它实现的一种算法被称为半结构化语句提取。我们可以用它来搜索解析树,用于简单的语句,其中主语是「London」,动词是「be」的形式。这将有助于我们找到有关伦敦的事实。
以下是它的代码实现:
importspacy importtextacy.extract #LoadthelargeEnglishNLPmodel nlp=spacy.load('en_core_web_lg') #Thetextwewanttoexamine text="""LondonisthecapitalandmostpopulouscityofEnglandandtheUnitedKingdom. StandingontheRiverThamesinthesoutheastoftheislandofGreatBritain, Londonhasbeenamajorsettlementfortwomillennia.ItwasfoundedbytheRomans, whonameditLondinium. """ #ParsethedocumentwithspaCy doc=nlp(text) #Extractsemi-structuredstatements statements=textacy.extract.semistructured_statements(doc,"London") #Printtheresults print("HerearethethingsIknowaboutLondon:") forstatementinstatements: subject,verb,fact=statement print(f"-{fact}")
结果如下:
HerearethethingsIknowaboutLondon: -thecapitalandmostpopulouscityofEnglandandtheUnitedKingdom. -amajorsettlementfortwomillennia.
也许这不太令人印象深刻。但是如果你在整个伦敦维基百科的文章文本上运行相同的代码而不仅仅是三个句子,你会得到更令人印象深刻的结果:
HerearethethingsIknowaboutLondon: -thecapitalandmostpopulouscityofEnglandandtheUnitedKingdom -amajorsettlementfortwomillennia -theworld'smostpopulouscityfromaround1831to1925 -beyondallcomparisonthelargesttowninEngland -stillverycompact -theworld'slargestcityfromabout1831to1925 -theseatoftheGovernmentoftheUnitedKingdom -vulnerabletoflooding -"oneoftheWorld'sGreenestCities"withmorethan40percentgreenspaceoropenwater -themostpopulouscityandmetropolitanareaoftheEuropeanUnionandthesecondmostpopulousinEurope -the19thlargestcityandthe18thlargestmetropolitanregionintheworld -Christian,andhasalargenumberofchurches,particularlyintheCityofLondon -alsohometosizeableMuslim,Hindu,Sikh,andJewishcommunities -alsohometo42Hindutemples -theworld'smostexpensiveofficemarketforthelastthreeyearsaccordingtoworldpropertyjournal(2015)report -oneofthepre-eminentfinancialcentresoftheworldasthemostimportantlocationforinternationalfinance -theworldtopcitydestinationasrankedbyTripAdvisorusers -amajorinternationalairtransporthubwiththebusiestcityairspaceintheworld -thecentreoftheNationalRailnetwork,with70percentofrailjourneysstartingorendinginLondon -amajorglobalcentreofhighereducationteachingandresearchandhasthelargestconcentrationofhighereducationinstitutesinEurope -hometodesignersVivienneWestwood,Galliano,StellaMcCartney,ManoloBlahnik,andJimmyChoo,amongothers -thesettingformanyworksofliterature -amajorcentrefortelevisionproduction,withstudiosincludingBBCTelevisionCentre,TheFountainStudiosandTheLondonStudios -alsoacentreforurbanmusic -the