【NLP】NLP中的消歧
作者 | Nesrine Sfar
編譯 | VK
來源 | Towards Data Science
如果你點開這篇文章,這意味著你有足夠的好奇心去學(xué)習(xí)關(guān)于NLP/NLU中解決歧義的不同方法。
背景信息是機器產(chǎn)生歧義的原因。這種模棱兩可的信息來源于人類在交流中使用的自然語言。將這種語言“翻譯”時可能會產(chǎn)生歧義。這可以用人類語言本身固有的不正式和模棱兩可來解釋。
傳統(tǒng)的方法是基于詞向量化。這里顯示的替代方法是基于知識圖。
本教程將通過一個簡單方便的應(yīng)用程序,即自然語言API(nl api),重點介紹一些可以用來解決這個問題的方法。
機器無法解釋或理解文本;要解決語言歧義,就需要對文本進行多層次的語言分析。處理歧義的現(xiàn)象稱為“消歧”。這是幫助機器檢測文本意義(語義)的過程。詞義的確定要考慮語境、句法和詞語之間的關(guān)系。
下面的文章將強調(diào)不同的方法,可以用來幫助機器減少歧義,如詞形還原,詞性標注等。
這項工作將基于一個名為expert.ai NL的API。
Expert.ai NL API
Expert.ai NL API是一個能夠通過幾行代碼在文本中提供多層次信息的應(yīng)用程序。
為了構(gòu)建NLP模塊,API提供了深入的語言處理技術(shù)。它可以進行深層語言分析,例如token化、詞形還原、詞性標注、形態(tài)/句法/語義分析。
除此之外,該庫還可以解決命名實體識別、實體間的語義關(guān)系和情感分析等問題。
1.如何使用Expert.ai NL API for Python?
庫的安裝
首先,你需要使用以下命令安裝客戶端庫:
pip?install?expertai-nlapi一旦你在developer.expert.ai網(wǎng)站上創(chuàng)建了賬號,API就可用了。Python客戶端代碼將開發(fā)人員帳戶指定為環(huán)境變量:
Linux操作系統(tǒng):
windows:
你的用戶是你在注冊期間指定的電子郵件地址。
你還可以在代碼中定義:
import?os os.environ["EAI_USERNAME"]?=?'YOUR_USER' os.environ["EAI_PASSWORD"]?=?'YOUR_PASSWORD'2.深層語言分析
語言學(xué)把語言分析分成不同的部分。所有這些分支都是相互依存的,語言中的一切都是相互聯(lián)系的。
對文檔進行多級文本分析;每一個文本被分成句子,這些句子被解析成token、詞形和詞性,尋找句法成分和謂詞之間的關(guān)系,并解釋語法以構(gòu)建完整的依賴樹。
要檢索這些信息,首先要導(dǎo)入庫的client:
from?expertai.nlapi.cloud.client?import?ExpertAiClient client?=?ExpertAiClient()讓我們舉一個例子來說明這些操作:
"Sophia is a social humanoid robot developed by Hong Kong-based company Hanson Robotics. Sophia was activated on February 14, 2016.”
a.文本細分
這個操作允許將文本從最長的形式劃分到最小的形式,在這種情況下,可以是段落、句子,短語,token。當token是一個搭配(復(fù)合詞)時,文本細分可以在分析中得到更深入的分析,直到它不能被進一步細分的原子級。
導(dǎo)入庫并實例化客戶端后,應(yīng)設(shè)置文本語言和API參數(shù):
text?=?"Sophia?is?a?social?humanoid?robot?developed?by?Hong?Kong-based?company?Hanson?Robotics.?Sophia?was?activated?on?February?14,?2016."? language=?'en'output?=?client.specific_resource_analysis(body={"document":?{"text":?text}},?params={'language':?language,?'resource':?'disambiguation' })在API請求中,應(yīng)該在主體中提到要分析的句子,在參數(shù)中提到要分析的語言。資源參數(shù)與你需要對文本執(zhí)行的操作有關(guān),例如,消除歧義。
這種多層次的文本分析通常分為三個階段:
1.詞法分析:一個文本細分階段,允許將文本分解為基本實體(token)。
2.句法分析:包括識別構(gòu)成句法實體的詞素組合(包括詞性標注)。
3.語義分析:消歧是在這個層次上進行的,它根據(jù)交際語境和它們之間可能的關(guān)系來檢測這些實體的意義。
詞匯分析從第一部分開始:
#?我們使用元素output.paragraphs分成幾個段落 #?start和end是分析文本中段落的位置 for?paragraph?in?output.paragraphs:print?(f'Paragraphs:{text[paragraph.start:paragraph.end]:{20}}') Paragraphs:?Sophia?is?a?social?humanoid?robot?developed?by?Hong?Kong-based?company?Hanson?Robotics.?Sophia?was?activated?on?February?14,?2016.因為我們的文本已經(jīng)是一個段落(這里是兩句話),所以細分的輸出提供了與輸入相同的文本。讓我們嘗試將段落分成句子級別,在本例中,我們只需要將元素.paragraphs修改為.sentences。最常見的分隔句子的方法是用點(.):
#?我們使用output.sentences把文本細分成句子 #?start和end是所分析文本中句子的位置 for?sentence?in?output.sentences:print?(f'Sentences:{text[sentence.start:sentence.end]:{20}}') Sentences:?Sophia?is?a?social?humanoid?robot?developed?by?Hong?Kong-based?company?Hanson?Robotics. Sentences:?Sophia?was?activated?on?February?14,?2016.結(jié)果我們得到了兩句話。讓我們更深入地進行細分,以檢索短語級別。我們使用與上面相同的方法,用.phrases,得到:
#?我們使用output.sentences把文本細分成短語 #?start和end是所分析文本中短語的位置 for?phrase?in?output.phrases:print?(f'Phrases:{text[phrase.start:phrase.end]:{20}}') Phrases:?Sophia?????????????? Phrases:?is?a?social?humanoid?robot Phrases:?developed??????????? Phrases:?by?Hong?Kong-based?company?Hanson?Robotics Phrases:.??????????????????? Phrases:?Sophia?????????????? Phrases:?was?activated??????? Phrases:?on?February?14,?2016 Phrases:.我們注意到,我們得到更多的元素。我們還可以得到文本中短語的數(shù)量:
#?數(shù)量 print("phrases?array?size:?",?len(output.phrases)) phrases?array?size:??10b.token化
此外,我們可以將短語級別分解為更小的單位,即token。這是“token化”任務(wù),在NLP中非常常見。它幫助機器理解文本。要使用Python執(zhí)行token化,我們可以使用.split函數(shù),如下所示:
例如,考慮以下句子:
text?=?"CNBC?has?commented?on?the?robot's??lifelike?skin?and?her?ability?to?emulate?more?than?60?facial?expressions."tokens?=?text.split() print('These?are?the?tokens?of?the?sentence',?tokens) These?are?the?tokens?of?the?sentence?['CNBC',?'has',?'commented',?'on',?'the',?"robot's",?'lifelike',?'skin',?'and',?'her',?'ability',?'to',?'emulate',?'more',?'than',?'60',?'facial',?'expressions.']如果不在split中指定分隔符,文本將按空格分隔。
通過expert.ai NL API,我們還可以執(zhí)行token化,并提供其他特性。換句話說,API提供了不同的級別token分析;API產(chǎn)生的token可以是單詞、字符(如縮寫)甚至標點符號。
讓我們看看如何使用API執(zhí)行此任務(wù),我們使用與上面相同的過程,使用.tokens修改element.phrases:
text?=?"CNBC?has?commented?on?the?robot's??lifelike?skin?and?her?ability?to?emulate?more?than?60?facial?expressions."? language=?'en'output?=?client.specific_resource_analysis(body={"document":?{"text":?text}},?params={'language':?language,?'resource':?'disambiguation' })#?打印到句子內(nèi)的token print?(f'{"TOKEN":{20}}?') print?(f'{"----":{20}}')?#?我們使用元素output.tokens將文本細分為token #?start和end是所分析文本中token的位置 for?token?in?output.tokens:print?(f'{text[token.start:token.end]:{20}}') TOKEN???????????????? ----???????????????? CNBC???????????????? has????????????????? commented??????????? on?????????????????? the????????????????? robot??????????????? 's?????????????????? lifelike???????????? skin???????????????? and????????????????? her????????????????? ability????????????? to?????????????????? emulate????????????? more???????????????? than???????????????? 60?????????????????? facial?expressions?? .我們注意到,這些token要么是像skin , ability, emulate這樣的單詞,要么是像‘s、60”這樣的縮寫,甚至是像點.這樣的標點符號。
token化會導(dǎo)致搭配,這在split函數(shù)中是不可能的。該API能夠根據(jù)單詞和上下文的位置檢測句子內(nèi)的復(fù)合詞。這種搭配還可以進一步劃分為原子級,原子級是我們可以擁有的最后一個單位:
for?token?in?output.tokens:print?(f'{text[token.start:token.end]:{20}}')#?我們對token數(shù)組進行迭代,將復(fù)合詞細分為原子級for?atom?in?token.atoms:print?(f'\t?atom:{text[atom.start:atom.end]:{20}}') CNBC???????????????? has????????????????? commented??????????? on?????????????????? the????????????????? robot??????????????? 's?????????????????? lifelike???????????? skin???????????????? and????????????????? her????????????????? ability????????????? to?????????????????? emulate????????????? more???????????????? than???????????????? 60?????????????????? facial?expressions??atom:?facial??????????????atom:?expressions????????? .c.詞性標注
token化導(dǎo)致了自然語言處理中的第二個過程,即詞性標注(詞性標注)。在這一階段,我們引入句法分析,其中包括詞性標注任務(wù)。后者包括為每個token分配一個POS或一個語法類。
POS描述了每個token的句法性質(zhì)。這些標簽可以反映文本的一部分含義。我們可以列出英語語言中常用的幾種詞性:限定詞、名詞、副詞、動詞、形容詞、介詞、連詞、代詞、感嘆詞……
一個詞與其他詞有相同的形式(同形異義詞)可能有不同的含義(多義詞)。這個詞可以有不同的位置,即使它有相同的形式。語法類別取決于單詞在文本中的位置及其上下文。讓我們考慮這兩句話:
The object of this exercise is to raise money for the charity.
A lot of people will object to the book.
從語言學(xué)的角度來看,在第一個句子中,object是名詞,而在第二個句子中,object是動詞。詞性標注是消除歧義的關(guān)鍵步驟。根據(jù)這種標注,單詞的含義可以從上下文、單詞的形式(例如,專有名詞開頭的大寫字母)、位置(SVO詞序)等推斷出來。
讓我們嘗試使用API為前兩句生成詞性標注:
from?expertai.nlapi.cloud.client?import?ExpertAiClient client?=?ExpertAiClient()我們首先導(dǎo)入庫并創(chuàng)建客戶端,如下所示:
object_noun表示object是名詞的句子,object_verb表示object是動詞的句子:
object_noun?=?"The?object?of?this?exercise?is?to?raise?money?for?the?charity." object_verb?=?"A?lot?of?people?will?object?to?the?book."單詞object在兩個句子中的形式相同,但位置不同。
首先,我們指定要進行詞性標注的文本,對于第一個句子,它是object_noun,對于第二個句子,它是object_verb。如下所示:
#?第一句話 object_noun?=?"The?object?of?this?exercise?is?to?raise?money?for?the?charity." #?第二句 object_verb?=?"A?lot?of?people?will?object?to?the?book." language?=?'en' #?請求第一句話的API output?=?client.specific_resource_analysis(body={"document":?{"text":?object_noun}},?params={'language':?language,?'resource':?'disambiguation' })#?請求第二句話的API output_2?=?client.specific_resource_analysis(body={"document":?{"text":?object_verb}},?params={'language':?language,?'resource':?'disambiguation' })一旦我們設(shè)置了這些參數(shù),就需要對token進行迭代,分別為每個示例分配一個POS;
#?第一句的POS print?(f'\t?\033[1mOutput?of?the?first?sentence?:?\033[0m?\n')? #?在輸出數(shù)組的開始部分以粗體打印TOKEN和POS: print?(f'\033[1m{"TOKEN":{20}}?{"POS":{6}}\033[0m')#?迭代token,并為第一個句子的每個token分配POS for?token?in?output.tokens:print?(f'{object_noun[token.start:token.end]:{20}}?{token.pos:{6}}')#?第二句的POS print?(f'\t?\033[1mOutput?of?the?second?sentence?:?\033[0m?\n')? #?在輸出數(shù)組的開始部分以粗體打印TOKEN和POS: print?(f'\033[1m{"TOKEN":{20}}?{"POS":{6}}\033[0m')#?迭代token,并為第一個句子的每個token分配POS for?token?in?output_2.tokens:print?(f'{object_verb[token.start:token.end]:{20}}?{token.pos:{6}}') ???????Output?of?the?first?sentence?:??TOKEN????????????????POS??? The??????????????????DET??? object???????????????NOUN?? of???????????????????ADP??? this?????????????????DET??? exercise?????????????NOUN?? is???????????????????VERB?? to???????????????????PART?? raise????????????????VERB?? money????????????????NOUN?? for??????????????????ADP??? the??????????????????DET??? charity??????????????NOUN?? .????????????????????PUNCT?Output?of?the?second?sentence?:??TOKEN????????????????POS??? A?lot?of?????????????ADJ??? people???????????????NOUN?? will?????????????????AUX??? object???????????????VERB?? to???????????????????ADP??? the??????????????????DET??? book?????????????????NOUN?? .????????????????????PUNCT一方面,賓語確實是一個名詞,前面是冠詞/限定詞(DET)。另一方面,賓語實際上是句子的動詞,它把主語“很多人”和賓語“書”聯(lián)系起來。
NLP中使用的傳統(tǒng)詞性標注工具通常使用相同類型的信息來標注文本中的單詞:其上下文和詞形。expert.Ai-NL-API中詞性標注的獨特之處不僅在于為每個token識別一個語法標簽,還在于介紹其含義。
換言之,一個詞可以和其他詞有相同的形式,但它包含多種含義(多義詞)。每一個意義都在一個概念中表達,與其他概念聯(lián)系起來,形成一個知識圖。上面看到的單詞object有不止一個含義,因此,它屬于不同的語義概念,我們在expert.ai NL API的知識圖中稱之為“Syncons”。詞性標注可以揭示同一個詞的不同標簽,從而產(chǎn)生不同的意義。
#?object_noun的Concept_ID print?(f'\t?\033[1mConcept_ID?for?object?when?NOUN?\033[0m?\n')?#?在輸出數(shù)組的開始部分以粗體打印TOKEN、POS和ID: print?(f'\033[1m{"TOKEN":{20}}?{"POS":{15}}?{"ID":{6}}\033[0m')#?Syncon代表“概念”,我們用一個ID來表示 for?token?in?output.tokens:print?(f'{object_noun[token.start:token.end]:{20}}?{token.pos:{15}}?{token.syncon:{6}}?')#?object_verb的Concept_ID print?(f'\t?\033[1mConcept_ID?for?object?when?VERB?\033[0m?\n')?#?在輸出數(shù)組的開始部分以粗體打印TOKEN、POS和ID: print?(f'\033[1m{"TOKEN":{20}}?{"POS":{15}}?{"ID":{6}}\033[0m')#?Syncon代表“概念”,我們用一個ID來表示 for?token?in?output_2.tokens:print?(f'{object_verb[token.start:token.end]:{20}}?{token.pos:{15}}?{token.syncon:{6}}?') ????????Concept_ID?for?object?when?NOUN??TOKEN????????????????POS?????????????ID???? The??????????????????DET?????????????????-1? object???????????????NOUN?????????????26946? of???????????????????ADP?????????????????-1? this?????????????????DET?????????????????-1? exercise?????????????NOUN?????????????32738? is???????????????????VERB?????????????64155? to???????????????????PART????????????????-1? raise????????????????VERB?????????????63426? money????????????????NOUN?????????????54994? for??????????????????ADP?????????????????-1? the??????????????????DET?????????????????-1? charity??????????????NOUN??????????????4217? .????????????????????PUNCT???????????????-1?Concept_ID?for?object?when?VERB??TOKEN????????????????POS?????????????ID???? A?lot?of?????????????ADJ??????????????83474? people???????????????NOUN?????????????35459? will?????????????????AUX?????????????????-1? object???????????????VERB?????????????65789? to???????????????????ADP?????????????????-1? the??????????????????DET?????????????????-1? book?????????????????NOUN?????????????13210? .????????????????????PUNCT???????????????-1可以注意到,名詞對象屬于ID為26946的概念。這個概念包括其他具有相同含義的詞(同義詞)。相比之下,它在第二句中的同形異義詞與ID 65789有關(guān)。這些ID是知識圖中每個概念的token。
因此,不同的詞性導(dǎo)致不同的意思,即使我們有相同的詞形。
請注意,以-1作為ID的單詞,如ADP(Adposition指介詞和后置詞)、PUNCT(表示標點符號)、DET(表示限定詞)等,在知識圖中不可用,因為它們不是固有的語義。
d.詞形還原
這是自然語言處理中的另一個核心任務(wù),稱為詞形還原。它與token化和詞性標注一樣重要。
簡而言之,詞形還原將每個token還原為它的規(guī)范形式:
動詞的不定式:wore, worn -> wear / ran, running, runs -> run
名詞的單數(shù)形式:mice -> mouse / die -> dice
等等。…
概念通??梢园S多詞形。在消歧過程中,文本中的每個token都返回到其基本形式。每個詞形都與知識圖中的一個概念相關(guān)聯(lián)。因此,詞形還原可以將不同的token集簡化為不同的詞形集。這可以通過這個例子來解釋;
起初,“living”這個詞的聽者幾乎是無意識地能辨別出這個詞的意思。這對于人類來說是可能的,因為人類可以根據(jù)世界的知識等做出推論。如果沒有上下文,這對于機器來說是不可能的。
為了使機器能夠預(yù)測出一個單詞在相同拼寫和相同發(fā)音的情況下產(chǎn)生的幾種意義,詞形還原是處理這種詞匯歧義的關(guān)鍵。
我們可以使用expert.ai NL API執(zhí)行此任務(wù)。讓我們考慮以下兩個例子:
She’s living her best life. What do you do for a living?
living_from_live?=?"She's?living?her?best?life" living_from_living?=?"What?do?you?do?for?a?living?"language?=?'en'#?請求API output?=?client.specific_resource_analysis(body={"document":?{"text":?living_from_live?}},?params={'language':?language,?'resource':?'disambiguation' })#?請求API output_2?=?client.specific_resource_analysis(body={"document":?{"text":?living_from_living?}},?params={'language':?language,?'resource':?'disambiguation' })#?在輸出數(shù)組的開始部分以粗體打印TOKEN、POS和ID: print?(f'\t?\033[1mOuput?of?the?first?sentence?:?\033[0m?\n')? print?(f'\033[1m{"TOKEN":{20}}?{"LEMMA":{15}}?{"POS":{6}}?\033[0m')#Syncon代表“概念”,我們用一個ID來表示 for?token?in?output.tokens:print?(f'{living_from_live?[token.start:token.end]:{20}}?{token.lemma:{15}}?{token.pos:{6}}?')print?(f'\t?\033[1mOuput?of?the?second?sentence?:?\033[0m?\n')??? print?(f'\033[1m{"TOKEN":{20}}?{"LEMMA":{15}}?{"POS":{6}}?\033[0m') for?token?in?output_2.tokens:print?(f'{living_from_living?[token.start:token.end]:{20}}?{token.lemma:{15}}?{token.pos:{6}}?') ????????Output?of?the?first?sentence?:??TOKEN????????????????LEMMA???????????POS???? She??????????????????she?????????????PRON??? 's???????????????????'s??????????????AUX???? living???????????????live????????????VERB??? her??????????????????her?????????????PRON??? best?????????????????good????????????ADJ???? life?????????????????life????????????NOUN???Output?of?the?second?sentence?:??TOKEN????????????????LEMMA???????????POS???? What?????????????????what????????????PRON??? do???????????????????do??????????????AUX???? you??????????????????you?????????????PRON??? do???????????????????do??????????????VERB??? for??????????????????for?????????????ADP???? a????????????????????a???????????????DET???? living???????????????living??????????NOUN??? ?????????????????????????????????????PUNCT如上所述,“l(fā)iving”有兩個不同的詞形,這取決于上下文及其在句子中的位置。在第一個例子中,living對應(yīng)于詞形live,live是句子的動詞。相反,living在第二句中是一個名詞,有詞形living。意思也不同,第一個詞形描述的是“活著”的概念,而另一個是一個名詞屬于“一種收入或謀生手段”的概念。
因此,詞形還原有助于機器推斷同形詞的意義。
結(jié)論
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機器學(xué)習(xí)在線手冊深度學(xué)習(xí)筆記專輯《統(tǒng)計學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯溫州大學(xué)《機器學(xué)習(xí)課程》視頻 本站qq群851320808,加入微信群請掃碼:總結(jié)
以上是生活随笔為你收集整理的【NLP】NLP中的消歧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机uc浏览器夜间模式怎么设置调成全黑
- 下一篇: 风林火山win11 64位官方版iso镜