廣州網(wǎng)站建設(shè)公司哪家好有哪些可以免費(fèi)推廣的平臺(tái)
目錄
步驟
SpaCy
Textacy——Text Analysis for Cybersecurity
Networkx
Dateparser
導(dǎo)入庫
寫出頁面的名稱
?編輯
自然語言處理
?詞性標(biāo)注
可能標(biāo)記的完整列表
依存句法分析(Dependency Parsing,DEP)
可能的標(biāo)簽完整列表
實(shí)例理解POS與DEP
可視化注釋?
Spacy還可執(zhí)行命名實(shí)體識(shí)別
可能的所有標(biāo)簽的完整列表
Spacy圖形工具
實(shí)體和關(guān)系抽取?
構(gòu)建圖表
網(wǎng)絡(luò)圖
使用Python和自然語言處理構(gòu)建知識(shí)圖譜。
知識(shí)圖譜被視為自然語言處理領(lǐng)域的一部分,因?yàn)橐獦?gòu)建“知識(shí)”,需要進(jìn)行“語義增強(qiáng)”過程。由于沒有人想要手動(dòng)執(zhí)行此任務(wù),因此我們需要使用機(jī)器和自然語言處理算法來完成此任務(wù)。
我們將解析維基百科并提取一個(gè)頁面,用作本數(shù)據(jù)集。
俄烏戰(zhàn)爭(zhēng)-維基百科
步驟
- 設(shè)置:使用維基百科API進(jìn)行網(wǎng)頁爬取以讀取包和數(shù)據(jù)。
- NLP使用SpaCy:對(duì)文本進(jìn)行分句、詞性標(biāo)注、依存句法分析和命名實(shí)體識(shí)別。
- 提取實(shí)體及其關(guān)系:使用Textacy庫來識(shí)別實(shí)體并建立它們之間的關(guān)系。
- 網(wǎng)絡(luò)圖構(gòu)建:使用NetworkX庫來創(chuàng)建和操作圖形結(jié)構(gòu)。
- 時(shí)間軸圖:使用DateParser庫來解析日期信息并生成時(shí)間軸圖。
SpaCy
"spaCy" 這個(gè)名稱是從 "Space"(空間) 這個(gè)詞匯中來的,它代表了 spaCy 設(shè)計(jì)的初衷,即為了提供一個(gè)輕量級(jí)、高性能的自然語言處理(NLP)庫。
SpaCy是一個(gè)自然語言處理(NLP)庫和工具包,用于處理和分析文本數(shù)據(jù)。它被設(shè)計(jì)成高效、快速且易用的工具,具有許多功能,包括分詞、命名實(shí)體識(shí)別、依存關(guān)系分析、文本分類等。SpaCy支持多種語言,并提供了預(yù)訓(xùn)練的詞向量模型。它廣泛用于文本挖掘、信息檢索、自動(dòng)化文本分類、情感分析、實(shí)體識(shí)別、機(jī)器翻譯等領(lǐng)域。
Textacy——Text Analysis for Cybersecurity
Textacy的名稱來源于"Text Analysis for Cybersecurity"(網(wǎng)絡(luò)安全文本分析),這個(gè)名稱強(qiáng)調(diào)了該庫最初的用途,即在網(wǎng)絡(luò)安全領(lǐng)域中對(duì)文本數(shù)據(jù)進(jìn)行分析。然而,隨著時(shí)間的推移,Textacy的功能擴(kuò)展到了更廣泛的自然語言處理和文本挖掘任務(wù),包括情感分析、實(shí)體識(shí)別、主題建模等,因此它的名稱也逐漸演化成了更通用的文本分析工具。
Networkx
NetworkX是一個(gè)用于創(chuàng)建、操作和研究復(fù)雜網(wǎng)絡(luò)(圖)的Python庫。它提供了豐富的功能和工具,使用戶能夠輕松地構(gòu)建、分析和可視化各種類型的網(wǎng)絡(luò),包括社交網(wǎng)絡(luò)、網(wǎng)絡(luò)拓?fù)?、生物網(wǎng)絡(luò)、交通網(wǎng)絡(luò)等。
Dateparser
"dateparser" 是一個(gè)Python庫,用于解析日期和時(shí)間字符串。它的主要功能是將各種格式的日期和時(shí)間字符串轉(zhuǎn)換成Python的datetime對(duì)象,以便在程序中進(jìn)行日期和時(shí)間的處理和計(jì)算。
導(dǎo)入庫
## for data
import pandas as pd #1.1.5
import numpy as np #1.21.0## for plotting
import matplotlib.pyplot as plt #3.3.2## for text
import wikipediaapi #0.5.8
import nltk #3.8.1
import re## for nlp
import spacy #3.5.0
from spacy import displacy
import textacy #0.12.0## for graph
import networkx as nx #3.0 (also pygraphviz==1.10)## for timeline
import dateparser #1.1.7
Wikipedia-api是一個(gè)Python庫,可輕松解析Wikipedia頁面。我們將使用這個(gè)庫來提取所需的頁面,但會(huì)排除頁面底部的所有“注釋”和“參考文獻(xiàn)”內(nèi)容。
寫出頁面的名稱
topic = "Russo-Ukrainian War"wiki = wikipediaapi.Wikipedia('en')
page = wiki.page(topic)
txt = page.text[:page.text.find("See also")]
txt[0:500] + " ..."
topic = "Russo-Ukrainian War"
:在這一行中,定義了一個(gè)名為topic
的變量,其中存儲(chǔ)了要查詢的維基百科主題,即 "Russo-Ukrainian War"(俄烏戰(zhàn)爭(zhēng))。wiki = wikipediaapi.Wikipedia('en')
:在這一行中,創(chuàng)建了一個(gè)名為wiki
的維基百科API的實(shí)例,使用了英語語言版('en'表示英語)。page = wiki.page(topic)
:這一行使用wiki
實(shí)例的page
方法來獲取與主題topic
相關(guān)的維基百科頁面。這將返回一個(gè)包含頁面內(nèi)容的對(duì)象,存儲(chǔ)在名為page
的變量中。txt = page.text[:page.text.find("See also")]
:這一行代碼從獲取的維基百科頁面文本中提取了感興趣的部分。它使用了字符串切片和.find()
方法,首先查找文本中 "See also"(通常表示相關(guān)鏈接的部分)的位置,然后將文本截?cái)嗟竭@個(gè)位置之前,從而得到了頁面的一部分文本。這部分文本存儲(chǔ)在名為txt
的變量中。txt[0:500] + " ..."
:最后一行代碼將前500個(gè)字符的文本內(nèi)容提取出來,然后附加了 " ...",以表示文本的截?cái)?。這個(gè)結(jié)果存儲(chǔ)在txt
變量中,它包含了從維基百科頁面提取的前500個(gè)字符的內(nèi)容。
自然語言處理
#python -m spacy download en_core_web_smnlp = spacy.load("en_core_web_sm")
doc = nlp(txt)
#python -m spacy download en_core_web_sm
:這是一個(gè)注釋行,用于表示在終端或命令行中執(zhí)行的操作。它指示用戶下載spaCy的英語語言模型"en_core_web_sm"。這個(gè)模型包括了一些用于處理英語文本的語言數(shù)據(jù)和算法。nlp = spacy.load("en_core_web_sm")
:在這一行代碼中,首先導(dǎo)入了spaCy庫(前提是已經(jīng)安裝了spaCy庫)。然后,使用spacy.load()
函數(shù)加載了之前下載的英語語言模型"en_core_web_sm"。加載后的模型被存儲(chǔ)在名為nlp
的變量中,以便后續(xù)對(duì)文本數(shù)據(jù)進(jìn)行處理。doc = nlp(txt)
:在這一行代碼中,使用已加載的模型nlp
對(duì)文本數(shù)據(jù)txt
進(jìn)行處理。nlp(txt)
將文本數(shù)據(jù)傳遞給已加載的模型,返回一個(gè)Doc
對(duì)象,其中包含了對(duì)文本進(jìn)行了分詞、詞性標(biāo)注、命名實(shí)體識(shí)別等自然語言處理任務(wù)的結(jié)果。這個(gè)Doc
對(duì)象存儲(chǔ)了文本的各種信息,可以用于進(jìn)一步的文本分析和處理。
看SpaCy將文本分成了多少個(gè)句子:
lst_docs = [sent for sent in doc.sents]
print("tot sentences:", len(lst_docs))
lst_docs = [sent for sent in doc.sents]
:這一行代碼使用了列表推導(dǎo)式(List Comprehension)來遍歷doc
對(duì)象中的每個(gè)句子,并將它們存儲(chǔ)在一個(gè)名為lst_docs
的列表中。列表推導(dǎo)式的語法是[expression for item in iterable]
,在這里,expression
是用于生成列表元素的表達(dá)式,item
是迭代的每個(gè)元素,iterable
是要迭代的對(duì)象。因此,這行代碼遍歷doc.sents
,它是doc
對(duì)象中句子的一個(gè)生成器(generator),并將每個(gè)句子添加到lst_docs
列表中。
?詞性標(biāo)注
即用適當(dāng)?shù)恼Z法標(biāo)簽標(biāo)記句子中的每個(gè)單詞的過程
可能標(biāo)記的完整列表
- ADJ: 形容詞,例如big,old,green,incomprehensible,first
- ADP: 介詞,例如in,to,during
- ADV: 副詞,例如very,tomorrow,down,where,there
- AUX: 助動(dòng)詞,例如is,has(done),will(do),should(do)
- CONJ: 連詞,例如and,or,but
- CCONJ: 并列連詞,例如and,or,but
- DET: 限定詞,例如a,an,the
- INTJ: 感嘆詞,例如psst,ouch,bravo,hello
- NOUN: 名詞,例如girl,cat,tree,air,beauty
- NUM: 數(shù)詞,例如1,2017,one,seventy-seven,IV,MMXIV
- PART: 助詞,例如's,not
- PRON: 代詞,例如I,you,he,she,myself,themselves,somebody
- PROPN: 專有名詞,例如Mary,John,London,NATO,HBO
- PUNCT: 標(biāo)點(diǎn)符號(hào),例如.,(,),?
- SCONJ: 從屬連詞,例如if,while,that
- SYM: 符號(hào),例如$,%,§,?,+,-,×,÷,=,:),表情符號(hào)
- VERB: 動(dòng)詞,例如run,runs,running,eat,ate,eating
- X: 其他,例如sfpksdpsxmsa
- SPACE: 空格
依存句法分析(Dependency Parsing,DEP)
模型還會(huì)嘗試?yán)斫鈫卧~對(duì)之間的關(guān)系。
可能的標(biāo)簽完整列表
- ACL:作為名詞從句的修飾語
- ACOMP:形容詞補(bǔ)語
- ADVCL:狀語從句修飾語
- ADVMOD:狀語修飾語
- AGENT:主語中的動(dòng)作執(zhí)行者
- AMOD:形容詞修飾語
- APPOS:同位語
- ATTR:主謂結(jié)構(gòu)中的謂語部分
- AUX:助動(dòng)詞
- AUXPASS:被動(dòng)語態(tài)中的助動(dòng)詞
- CASE:格標(biāo)記
- CC:并列連詞
- CCOMP:從句補(bǔ)足語
- COMPOUND:復(fù)合修飾語
- CONJ:連接詞
- CSUBJ:主語從句
- CSUBJPASS:被動(dòng)語態(tài)中的主語從句
- DATIVE:與雙賓語動(dòng)詞相關(guān)的間接賓語
- DEP:未分類的依賴
- DET:限定詞
- DOBJ:直接賓語
- EXPL:人稱代詞
- INTJ:感嘆詞
- MARK:標(biāo)記
- META:元素修飾語
- NEG:否定修飾語
- NOUNMOD:名詞修飾語
- NPMOD:名詞短語修飾語
- NSUBJ:名詞從句主語
- NSUBJPASS:被動(dòng)語態(tài)中的名詞從句主語
- NUMMOD:數(shù)字修飾語
- OPRD:賓語補(bǔ)足語
- PARATAXIS:并列結(jié)構(gòu)
- PCOMP:介詞的補(bǔ)足語
- POBJ:介詞賓語
- POSS:所有格修飾語
- PRECONJ:前置連詞
- PREDET:前置限定詞
- PREP:介詞修飾語
- PRT:小品詞
- PUNCT:標(biāo)點(diǎn)符號(hào)
- QUANTMOD:量詞修飾語
- RELCL:關(guān)系從句修飾語
- ROOT:句子主干
- XCOMP:開放性從句補(bǔ)足語
實(shí)例理解POS與DEP
i = 3
list_docs[3]
檢查 NLP 模型預(yù)測(cè)的 POS 和 DEP 標(biāo)簽
for token in lst_docs[i]:print(token.text, "-->", "pos: "+token.pos_, "|", "dep: "+token.dep_, "")
token.text
:token
對(duì)象的text
屬性表示詞匯的原始文本內(nèi)容,即單詞或標(biāo)點(diǎn)符號(hào)的字符串。"-->"
:這部分代碼只是一個(gè)字符串,用于分隔詞匯信息的不同部分,以便輸出更易讀。"pos: "+token.pos_
:token
對(duì)象的pos_
屬性表示詞匯的詞性(Part-of-Speech,POS)。該部分將詞匯的詞性標(biāo)簽添加到輸出中,例如:"pos: NOUN" 表示名詞。"|"
:這部分代碼只是一個(gè)字符串,用于分隔不同詞匯信息。"dep: "+token.dep_
:token
對(duì)象的dep_
屬性表示詞匯與句子中其他詞匯的依存關(guān)系。該部分將詞匯的依存關(guān)系標(biāo)簽添加到輸出中,例如:"dep: nsubj" 表示名詞主語。
可視化注釋?
SpaCy提供了一個(gè)圖形工具來可視化這些注釋
from spacy import displacydisplacy.render(lst_docs[i], style="dep", options={"distance":100})
displacy.render(lst_docs[i], style="dep", options={"distance":100})
:這是用于渲染句子依存關(guān)系圖的函數(shù)調(diào)用。它包括以下參數(shù):
-
lst_docs[i]
:這是要可視化的文本數(shù)據(jù),通常是一個(gè)Doc
對(duì)象,或者在這里是句子的Doc
對(duì)象,表示要可視化的句子。 -
style="dep"
:這個(gè)參數(shù)指定了可視化的樣式。在這里,我們選擇了"dep",表示依存關(guān)系圖。 -
options={"distance":100}
:這是一個(gè)字典參數(shù),用于配置可視化選項(xiàng)。在這里,我們?cè)O(shè)置了"distance"參數(shù),以控制詞匯之間的水平距離。較大的距離可以使圖更易于閱讀。您可以根據(jù)需要自定義其他可視化選項(xiàng)。
- 最重要的標(biāo)記是動(dòng)詞 (?POS=VERB?),因?yàn)樗蔷渥又泻x的詞根 (?DEP=ROOT )。
- 助詞,如副詞和副詞 (?POS=ADV/ADP?),通常作為修飾語 ( *DEP=mod?) 與動(dòng)詞相關(guān)聯(lián),因?yàn)樗鼈兛梢孕揎梽?dòng)詞的含義。例如,“?travel to?”和“?travel from?”具有不同的含義,即使詞根相同(“?travel?”)。
- 在與動(dòng)詞相連的單詞中,必須有一些名詞(POS=PROPN/NOUN)作為句子的主語和賓語( *DEP=nsubj/obj )。
- 名詞通常位于形容詞 (?POS=ADJ?) 附近,作為其含義的修飾語 (?DEP=amod?)。例如,在“好人”和“壞人”中,形容詞賦予名詞_“人”相反的含義。?
Spacy還可執(zhí)行命名實(shí)體識(shí)別
可能的所有標(biāo)簽的完整列表
- 人名: 包括虛構(gòu)人物。
- 國家、宗教或政治團(tuán)體:民族、宗教或政治團(tuán)體。
- 地點(diǎn):建筑、機(jī)場(chǎng)、高速公路、橋梁等。
- 公司、機(jī)構(gòu)等:公司、機(jī)構(gòu)等。
- 地理位置:國家、城市、州。
- 地點(diǎn):非國家地理位置,山脈、水域等。
- 產(chǎn)品:物體、車輛、食品等(不包括服務(wù))。
- 事件:命名颶風(fēng)、戰(zhàn)斗、戰(zhàn)爭(zhēng)、體育賽事等。
- 藝術(shù)作品:書籍、歌曲等的標(biāo)題。
- 法律:成為法律的指定文件。
- 語言:任何命名的語言。
- 日期:絕對(duì)或相對(duì)日期或期間。
- 時(shí)間:小于一天的時(shí)間。
- 百分比:百分比,包括“%”。
- 貨幣:貨幣價(jià)值,包括單位。
- 數(shù)量:衡量重量或距離等。
- 序數(shù): “第一”,“第二”等。
- 基數(shù):不屬于其他類型的數(shù)字。
for ent in lst_docs[i].ents:print(tag.text, f"({tag.label_})")
print(tag.text, f"({tag.label_})")
:在每次迭代中,使用 print()
函數(shù)打印每個(gè)實(shí)體的文本內(nèi)容和實(shí)體類型標(biāo)簽。
-
tag.text
:這是實(shí)體對(duì)象的text
屬性,表示實(shí)體的原始文本內(nèi)容。 -
f"({tag.label_})"
:這是一個(gè)格式化字符串,用于將實(shí)體的類型標(biāo)簽添加到輸出中。在字符串中使用了f
開頭的字符串字面值,它允許在字符串中插入表達(dá)式,這里插入了實(shí)體的類型標(biāo)簽,標(biāo)簽位于括號(hào)中。 -
花括號(hào)
{}
在格式化字符串中用于表示占位符,可以在運(yùn)行時(shí)將變量或表達(dá)式的值插入到字符串中。
在spaCy中,實(shí)體(命名實(shí)體)對(duì)象通常包含兩個(gè)重要的屬性:ent.text
和 ent.label_
,它們分別表示實(shí)體的文本內(nèi)容和實(shí)體類型標(biāo)簽。
Spacy圖形工具
displacy.render(lst_docs[i], style="ent")
實(shí)體和關(guān)系抽取?
對(duì)于每個(gè)句子,我們將提取主語和賓語以及它們的修飾語、復(fù)合詞和它們之間的標(biāo)點(diǎn)符號(hào)。
## extract entities and relations
dic = {"id":[], "text":[], "entity":[], "relation":[], "object":[]}for n,sentence in enumerate(lst_docs):lst_generators = list(textacy.extract.subject_verb_object_triples(sentence)) for sent in lst_generators:subj = "_".join(map(str, sent.subject))obj = "_".join(map(str, sent.object))relation = "_".join(map(str, sent.verb))dic["id"].append(n)dic["text"].append(sentence.text)dic["entity"].append(subj)dic["object"].append(obj)dic["relation"].append(relation)## create dataframe
dtf = pd.DataFrame(dic)## example
dtf[dtf["id"]==i]
構(gòu)建圖表
網(wǎng)絡(luò)圖
Python標(biāo)準(zhǔn)庫中用于創(chuàng)建和操作圖網(wǎng)絡(luò)的是NetworkX。我們可以從整個(gè)數(shù)據(jù)集開始創(chuàng)建圖形,但如果節(jié)點(diǎn)太多,可視化將變得混亂:
## create full graph
G = nx.from_pandas_edgelist(dtf, source="entity", target="object", edge_attr="relation", create_using=nx.DiGraph())## plot
plt.figure(figsize=(15,10))pos = nx.spring_layout(G, k=1)
node_color = "skyblue"
edge_color = "black"nx.draw(G, pos=pos, with_labels=True, node_color=node_color, edge_color=edge_color, cmap=plt.cm.Dark2, node_size=2000, connectionstyle='arc3,rad=0.1')nx.draw_networkx_edge_labels(G, pos=pos, label_pos=0.5, edge_labels=nx.get_edge_attributes(G,'relation'),font_size=12, font_color='black', alpha=0.6)
plt.show()
G = nx.from_pandas_edgelist(dtf, source="entity", target="object", edge_attr="relation", create_using=nx.DiGraph())
:這行代碼使用 NetworkX 庫創(chuàng)建了一個(gè)有向圖(DiGraph)。具體解釋如下:nx.from_pandas_edgelist(dtf, source="entity", target="object", edge_attr="relation", create_using=nx.DiGraph())
:這個(gè)函數(shù)將 Pandas 數(shù)據(jù)幀dtf
轉(zhuǎn)換為一個(gè)有向圖。在有向圖中,實(shí)體作為節(jié)點(diǎn),關(guān)系作為有向邊,而 "entity" 列和 "object" 列包含了節(jié)點(diǎn)之間的連接,"relation" 列包含了邊的屬性(關(guān)系)。plt.figure(figsize=(15,10))
:這行代碼創(chuàng)建一個(gè)新的圖形畫布,指定了畫布的大小為 15x10 像素。pos = nx.spring_layout(G, k=1)
:這行代碼使用 NetworkX 的spring_layout
函數(shù)布局圖形中的節(jié)點(diǎn)位置,其中G
是創(chuàng)建的有向圖。k=1
控制了節(jié)點(diǎn)之間的相互排斥力,影響圖形的布局。node_color
和edge_color
:這兩行代碼定義了節(jié)點(diǎn)和邊的顏色。nx.draw(...)
:這個(gè)函數(shù)用于繪制圖形。以下是參數(shù)的含義:G
:要繪制的圖形。pos=pos
:節(jié)點(diǎn)位置的布局。with_labels=True
:是否顯示節(jié)點(diǎn)的標(biāo)簽。node_color=node_color
:節(jié)點(diǎn)的顏色。edge_color=edge_color
:邊的顏色。cmap=plt.cm.Dark2
:用于定義節(jié)點(diǎn)顏色映射的顏色映射。nx.draw_networkx_edge_labels(...)
:這個(gè)函數(shù)用于在圖形上繪制邊的標(biāo)簽。以下是參數(shù)的含義:pos=pos
:節(jié)點(diǎn)位置的布局。label_pos=0.5
:標(biāo)簽相對(duì)于邊的位置。edge_labels=nx.get_edge_attributes(G,'relation')
:從圖中獲取邊的屬性(關(guān)系)作為標(biāo)簽。font_size=12
:標(biāo)簽的字體大小。font_color='black'
:標(biāo)簽的字體顏色。alpha=0.6
:標(biāo)簽的透明度。plt.show()
:這行代碼用于顯示繪制好的圖形。
知識(shí)圖譜可以讓我們從大局的角度看到所有事物的相關(guān)性,但是如果直接看整張圖就沒有什么用處。因此,最好根據(jù)我們所需的信息應(yīng)用一些過濾器。對(duì)于這個(gè)例子,我將只選擇涉及最常見實(shí)體的部分(基本上是最多連接的節(jié)點(diǎn)):
先找出最多連接的節(jié)點(diǎn)
dtf["entity"].value_counts().head()
然后進(jìn)行過濾操作并進(jìn)行可視化
## filter
f = "Russia"
tmp = dtf[(dtf["entity"]==f) | (dtf["object"]==f)]## create small graph
G = nx.from_pandas_edgelist(tmp, source="entity", target="object", edge_attr="relation", create_using=nx.DiGraph())## plot
plt.figure(figsize=(15,10))pos = nx.spring_layout(G, k=0.5)
node_color = ["red" if node==f else "skyblue" for node in G.nodes]
edge_color = ["red" if edge[0]==f else "black" for edge in G.edges]nx.draw(G, pos=pos, with_labels=True, node_color=node_color, edge_color=edge_color, cmap=plt.cm.Dark2, node_size=800, node_shape="o", width=1.0, connectionstyle='arc3,rad=0.1', font_size=8)nx.draw_networkx_edge_labels(G, pos=pos, label_pos=0.5, edge_labels=nx.get_edge_attributes(G,'relation'),font_size=8, font_color='black', alpha=0.6)
plt.show()
對(duì)于Ukraine的效果圖
???????