您好,登錄后才能下訂單哦!
這篇文章主要講解了“NLP有什么用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“NLP有什么用”吧!
處理數(shù)據(jù)
實(shí)驗中使用的數(shù)據(jù)或文本語料庫(通常在NLP中稱為語料庫)是電影腳本。但是,在使用這些數(shù)據(jù)之前,需要做一下篩選。因為,心理描寫、動作描述或者場景描寫的文本,以及每句臺詞前的角色名(僅指示說話人,不作為文本分析的語料庫)都不是本次研究的對象。所以,諸如“Thanoscrushes the Tesseract, revealing the blue Space Stone…” (滅霸捏碎了宇宙魔方,獲得了藍(lán)色的空間寶石……)之類的句子都被刪除了。
此外,作為spaCy數(shù)據(jù)處理步驟的一部分,“I”(我)、“you”(你)、“an”(一個)這類被標(biāo)記為停止詞(常用的單詞,多為冠詞、介詞、副詞或連詞)的術(shù)語被將不做處理。同時,實(shí)驗過程中只使用單詞的標(biāo)準(zhǔn)形式,也就是詞根。舉例說明,動詞“talk”、“talked”和“talking”是同一個詞“talk”(說話)的不同形式,所以這些詞的詞根就是“talk”。
要在spaCy中處理一段文本,首先需要加載語言模型,然后在文本語料庫上調(diào)用模型進(jìn)行文本處理。結(jié)果會輸出一個涵蓋所有已處理文本的Doc文件。
importspacy # load a medium-sized language model nlp = spacy.load("en_core_web_md") with open('cleaned-script.txt', 'r') asfile: text = file.read() doc = nlp(text)
在spaCy中創(chuàng)建Doc文件
然后就可以獲得一個經(jīng)過處理、有效信息占比極高的語料庫。緊接著就可以開始實(shí)驗了!
整部電影中使用最頻繁的前十個動詞、名詞、副詞和形容詞
是否可能僅通過了解出現(xiàn)最頻繁的動詞就推斷出電影的整體走向和情節(jié)呢?下文的圖表證明了這一觀點(diǎn)。
“I know” (我了解……)、“you think” (你覺得……)是最常見的短語。
“know” (了解)、“go” (去)、 “come”(來)、“get” (獲得)、“think”(思考)、“tell” (告訴)、“kill” (謀殺)、“need” (需要)、“stop” (制止)、和“want” (想要) 。從中能夠推斷出什么?介于這部電影于2018年上映,相信大部分觀眾都已經(jīng)知道它講述了一個什么樣的故事:根據(jù)這些動詞推斷出《復(fù)仇者聯(lián)盟3》是關(guān)于了解、思考和調(diào)查如何去阻止某物或某人。
通過以下代碼就能統(tǒng)計各個動詞出現(xiàn)次數(shù):
importspacy #load a medium-sized language model nlp= spacy.load("en_core_web_md") withopen('cleaned-script.txt', 'r') as file: text = file.read() doc= nlp(text) #map with frequency count pos_count= {} fortoken in doc: # ignore stop words if token.is_stop: continue # pos should be one of these: # 'VERB', 'NOUN', 'ADJ' or 'ADV' if token.pos_ == 'VERB': if token.lemma_ in pos_count: pos_count[token.lemma_] += 1 else: pos_count[token.lemma_] = 1 print("top10 VERBs {}".format(sorted(pos_count.items(), key=lambda kv: kv[1],reverse=True)[:10]))
那么描述動詞的詞——副詞也會有同樣的實(shí)驗效果嗎?
“I seriously don’t know how you fit your head into that helmet.” (我真不知道那個頭盔怎么塞得進(jìn)你的腦袋。)——奇異博士。
對于一部關(guān)于阻止紫薯精毀滅半個宇宙的電影來說,臺詞中有很多類似“right”(沒錯)、“exactly”(就是這樣)、“better”(更好地)這種具有積極意向的副詞。
所以,知道了電影中的動作和動作描述,現(xiàn)在是時候看看名詞了。
“You will pay for his life with yours.Thanos willhave that stone.” (這將是以命換命,滅霸總會得到那塊寶石。)——暗夜比鄰星
結(jié)果顯示,“stones”(寶石)不出意料地出現(xiàn)次數(shù)最多,畢竟整部電影都在圍繞它們發(fā)展。出現(xiàn)次數(shù)排第二的是滅霸想要摧毀的“l(fā)ife”(生命),接著是復(fù)仇者們沒有多少的“time”(時間)(注意:出現(xiàn)次數(shù)較多也可能是因為電影中多次提到了“theTime Stone”——時間寶石)。
在進(jìn)入下一個實(shí)驗項目之間,探究一下形容詞或描述名詞的單詞。與副詞的情況類似,這里也有“good”(好的)和“right”(對的)等表達(dá)積極意義的詞匯,以及“okay”(沒問題)和“sure”(當(dāng)然)等表示肯定的詞匯。
“I'm sorry, little one.” (對不起,小家伙)——滅霸
特定角色使用最多的動詞和名詞
前面的圖片列舉了電影中最常見的動詞和名詞。雖然這些結(jié)果讓我們對電影的整體感覺和情節(jié)有了一定的了解,但它并沒有過多地講述各個角色的個人經(jīng)歷。因此,在特定角色的個人臺詞中,通過使用前面相同的程序,找到了出現(xiàn)次數(shù)前十的動詞和名詞。
由于電影中有很多角色,所以本實(shí)驗中只選擇了一些臺詞數(shù)量較多的角色。這些角色分別是鋼鐵俠、奇異博士、卡魔拉、雷神、火箭浣熊、星爵、烏木喉和滅霸。對不起,隊長沒有入選。
下圖展示了這些角色使用次數(shù)最多的10個名詞。
星爵到底為什么這么頻繁地叫德拉克斯?
意料之外的是,大多數(shù)情況下,親愛的英雄們最常提及的名詞都是同伴的名字。例如,鋼鐵俠提及“孩子”(指蜘蛛俠)9次,火箭浣熊叫了奎爾(星爵)3次,而星爵叫了(其實(shí)是大吼)德拉克斯7次。
通過進(jìn)一步的觀察,可以推斷出每個角色心中最重要的東西。拿鋼鐵俠的情況舉例,統(tǒng)計數(shù)據(jù)表明“地球”對他來說十分重要??Ю那闆r也很相似,她總是念叨著“生命”、“宇宙”和“星球”這些涵義更廣闊的實(shí)體,并為之付出了自己的生命。奇異博士反復(fù)提及他與其余英雄不甚相同的目標(biāo)——保護(hù)時間寶石。還有雷神,由于他和滅霸之間的國仇家恨,他提及滅霸的名字多達(dá)8次,當(dāng)然還少不了新的“干脆面”好友——長得像只“兔子”的火箭浣熊。一張圖的數(shù)據(jù)表明滅霸不斷念叨著要集齊所有寶石,并且多次呼喚他的女兒。
名詞表達(dá)意義,但動詞可能無法像名詞這樣鮮明地表達(dá)角色的特征。在下面的圖片中你會看到,動詞的表達(dá)能力相比名詞的來說產(chǎn)生的效果甚微。像“know”(了解)、“want”(想要)和“get”(獲得)這樣缺乏特征性的普遍被使用的單詞出現(xiàn)的頻數(shù)都很高。然而,滅霸的頭號粉絲——烏木喉可能擁有整個語料庫中最獨(dú)特的動詞。烏木喉就像一個忠仆:除了想方設(shè)法獲取時間寶石,他主要從事的工作就是用“聆聽”、“感到榮幸”等詞鼓吹他主子的使命。嘖嘖,真諂媚。
“Hear me, and rejoice. You have had the privilege of being saved by the Great Titan…”(跪下聆聽并感到榮幸吧!你有幸被最偉大的救世主拯救……)——烏木喉
末尾來個彩蛋(大霧):格魯特說得最多的是——
“I am Groot.”(我是格魯特。)
命名實(shí)體
到目前為止,我們已經(jīng)完成了全篇電影、各位英雄和反派最常用的動詞、名詞、副詞和形容詞的探索。然而,為了充分理解一直在研究的所有詞,需要加入一些上下文,即命名實(shí)體,進(jìn)行研究。
根據(jù)有關(guān)spaCy的網(wǎng)頁說明,命名實(shí)體是“指定名稱的實(shí)際對象——例如,一個人、一個國家、一個產(chǎn)品或一本書的標(biāo)題?!彼?,了解這些實(shí)體就意味著了解角色在說些什么。在spaCy程序源庫中,實(shí)體都有一個預(yù)測的標(biāo)簽,該標(biāo)簽將實(shí)體分成人、產(chǎn)品、藝術(shù)詞匯等等類型(https://spacy.io/api/annotation#named-entities),從而為后續(xù)實(shí)驗提供額外的粒度級別,有助于對實(shí)體進(jìn)行進(jìn)一步分類。但是,為了簡化過程,本次實(shí)驗中將使用實(shí)體本身而不是實(shí)體分類。
這些是出現(xiàn)次數(shù)排名前30的實(shí)體。
“MATEFAYA HU”(必勝)是瓦坎達(dá)賈巴里部落戰(zhàn)士戰(zhàn)斗前的口號。
首先,考慮到整部電影都是關(guān)于滅霸的,所以滅霸出現(xiàn)次數(shù)最多是情理之中。緊隨其后的是他的女兒、影片的核心人物之一——卡魔拉。然后在第三位的是格魯特(不需要解釋了吧),緊隨其后的是鋼鐵俠和其他復(fù)仇者,以及一些地點(diǎn),如紐約,阿斯加德和瓦坎達(dá)(瓦坎達(dá)萬歲)。除了英雄名字和地點(diǎn)之外,“六顆寶石”(“six Infnity Stones”)的“六”、時間寶石(the Time Stone)和靈魂寶石(theSoul Stone)分別出現(xiàn)在第14、15和16位。意料之外的是,將滅霸吸引到地球來的心靈寶石不在前30名之列。
可以通過以下代碼讀取Doc文件中各個單詞的實(shí)物標(biāo)簽‘ents’:
importspacy # load a medium-sized language model nlp = spacy.load("en_core_web_md") with open('cleaned-script.txt', 'r') as file: text = file.read() doc = nlp(text) # create an entity frequency map entities = {} # named entities for ent in doc.ents: #Print the entity text and its label ifent.text in entities: entities[ent.text] += 1 else: entities[ent.text] = 1 print("top entities{}".format(sorted(entities.items(), key=lambda kv: kv[1], reverse=True)[:30]))
臺詞對白間的相似性
當(dāng)討論每個角色最常用動詞時,我們意識到他們使用的動詞都非常相似,表達(dá)出了相同的感覺,而這與分析名詞得到的結(jié)論不甚相同。像“go”(去)、“come”(來)這樣的詞語,營造出角色們想要去或抵達(dá)某個特定地方的感覺和趨向;而像“kill”(謀殺)和“stop”(制止)這樣的動詞暗示著,確實(shí)存在一個巨大的威脅必須得到阻止。
考慮到這個結(jié)果,為了繼續(xù)研究相似性,實(shí)驗提出計算分?jǐn)?shù)衡量各個角色的臺詞對白的相似度。
NLP中相似度的定義為,描述兩段文本的結(jié)構(gòu)或句法涵義有相關(guān)性的度量——通常,相似度得分介于0到1之間,0表示完全不同,1表示完全相似(或者兩段文本完全相同)。從技術(shù)上講,相似性是通過測量單詞向量(單詞的多維表征)之間的距離來計算的。如果你有興趣進(jìn)一步了解單詞向量的相關(guān)內(nèi)容,建議搜索了解一下生成單詞向量的常用算法——word2vec。下圖就是各個角色臺詞對白的相似性矩陣。
這個圖再次證明,烏木喉真的是最獨(dú)特的角色。
這個結(jié)果可謂是“驚不驚喜!意不意外!”了。一方面,由于這部電影只有一個主要情節(jié),所以可以理解,對話中的關(guān)聯(lián)性導(dǎo)致所有的角色的臺詞對白相似性都接近于1。然而,沒想到的是,他們的分?jǐn)?shù)過于太接近了。實(shí)驗的研究期望是,至少滅霸與其他英雄的臺詞對白相似性較低。畢竟對于滅霸這樣一個反派來說,其他英雄都是在一個勁的討論著怎么阻止他啊??上部少R地是,蜘蛛俠的臺詞相似性得分變化起伏不定;畢竟,他只是個在上學(xué)路上被叫來拯救世界的小孩兒,所以有這樣的結(jié)果也不奇怪。
下面代碼演示了如何在spaCy環(huán)境下計算兩段臺詞對白之間的相似性:
# for the full example onhow I obtained all the similarities # see the full code at:https://github.com/juandes/infinity-war-spacy/blob/master/script.py import spacy # load a medium-sized language model nlp = spacy.load("en_core_web_md") with open('tony-script.txt', 'r') as file: tony_lines =file.read() with open('thor-script.txt', 'r') as file: thor_lines = file.read() tony_doc = nlp(tony_lines) thor_doc = nlp(thor_lines) similarity_score = tony_doc.similarity(thor_doc) print("Similarity between Tony's and Thor's docs is{}".format(similarity_score))
感謝各位的閱讀,以上就是“NLP有什么用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對NLP有什么用這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。