知識圖譜:一種從文本中挖掘信息的強大數據科學技術

概覽

  • 知識圖譜是數據科學中最有趣的概念之一
  • 瞭解如何使用Wikipedia頁面上的文本構建知識圖譜
  • 我們將動手使用Python流行的spaCy庫構建我們的知識圖譜

介紹

梅西(Lionel Messi)無需介紹,甚至不喜歡足球的人都聽說過,最偉大的球員之一為這項運動增光添彩。這是他的維基百科頁面:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

那裡有很多信息!我們有文本,大量的超鏈接,甚至還有音頻剪輯。在一個頁面上有很多相關且可能有用的信息。

但是,有一個小問題。這不是要饋送到我們的計算機的理想數據源。無論如何都不是當前形式。

我們能否找到一種方法使該文本數據對計算機可讀?從本質上講,我們可以將這些文本數據轉換為機器可以使用的內容,也可以由我們輕鬆地解釋嗎?

我們可以!我們可以藉助知識圖譜(KG)來做到這一點,KG是數據科學中最引人入勝的概念之一。知識圖譜的巨大潛力和應用使我震驚,並且我相信你也會如此。

在本文中,你將瞭解什麼是知識圖譜,它們為何有用,然後我們將基於從Wikipedia提取的數據構建自己的知識圖譜,從而深入研究代碼。

什麼是知識圖譜?

讓我們先確定一件事情,在本文中,我們會經常看到圖一詞。當我說圖時,我們並不是指條形圖,餅圖和折線圖。在這裡,我們談論的是相互聯繫的實體,這些實體可以是人員,位置,組織,甚至是事件。

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

我們可以將圖定義為一組節點和邊。看下圖:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

這裡的節點A和節點B是兩個不同的實體。這些節點由代表兩個節點之間關係的邊連接。現在,這是我們可以構建的最小知識圖譜–也稱為三元圖。知識圖譜有各種形狀和大小。例如,截至2019年10月,Wikidata的知識圖譜具有59,910,568個節點。

如何在圖中表示知識?

在開始構建知識圖譜之前,瞭解信息或知識如何嵌入這些圖非常重要。讓我用一個例子來解釋一下。如果節點A = Putin ,節點B = Russia,則邊緣很可能是“president of”:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

節點或實體也可以具有多個關係。普京不僅是俄羅斯總統,還曾在蘇聯安全機構克格勃蘇聯安全局(KGB)工作。但是,我們如何將有關普京的新信息納入上面的知識圖譜中?

實際上非常簡單。只需為新實體KGB添加一個節點即可:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

新關係不僅可以從知識圖譜中的第一個節點出現,還可以從知識圖譜中的任何節點出現,如下所示:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

俄羅斯是亞太經濟合作組織(APEC)的成員。

識別實體及其之間的關係對我們來說不是一件困難的任務。但是,手動構建知識圖譜是不可擴展的。沒有人會瀏覽成千上萬的文檔並提取所有實體及其之間的關係!

這就是為什麼機器更適合執行此任務的原因,因為瀏覽甚至成百上千的文檔對於他們來說都是很簡單的事。但是,還有另一個挑戰就是機器不懂自然語言。這是自然語言處理(NLP)進入圖的地方。

要從文本構建知識圖譜,重要的是使我們的機器能夠理解自然語言。這可以通過使用NLP技術來完成,例如句子分段,依存關係分析,詞性標記和實體識別。讓我們更詳細地討論這些。

句子分割

構建知識圖譜的第一步是將文本文檔或文章拆分為句子。然後,我們將僅列出那些恰好具有1個主語和1個賓語的句子。讓我們看下面的示例文本:

“Indian tennis player Sumit Nagal moved up six places from 135 to a career-best 129 in the latest men’s singles ranking. The 22-year-old recently won the ATP Challenger tournament. He made his Grand Slam debut against Federer in the 2019 US Open. Nagal won the first set.”

讓我們將以上段落拆分為句子:

  1. Indian tennis player Sumit Nagal moved up six places from 135 to a career-best 129 in the latest men’s singles ranking
  2. The 22-year-old recently won the ATP Challenger tournament
  3. He made his Grand Slam debut against Federer in the 2019 US Open
  4. Nagal won the first set

在這四個句子中,我們將選擇第二個和第四個句子,因為它們每個包含1個主語和1個賓語。在第二句中,主語為“22-year-old”,賓語為“ATP Challenger tournament”。在第四句中,主語是“Nagal”,“first set”是賓語:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

挑戰在於使你的機器理解文本,尤其是在多詞主語和賓語的情況下。例如,提取以上兩個句子中的對象有點棘手。你能想到解決此問題的任何方法嗎?

實體提取

從句子中提取單個單詞實體並不是一項艱鉅的任務。我們可以藉助詞性(POS)標籤輕鬆地做到這一點。名詞和專有名詞將是我們的實體。

但是,當一個實體跨越多個單詞時,僅靠POS標籤是不夠的。我們需要解析句子的依存關係樹。

你可以在以下文章中閱讀有關依賴項解析的更多信息[^1]。

讓我們獲取所選擇的一句句子的依賴項標籤。我將使用流行的spaCy庫執行此任務:

Output:

根據依賴性分析器,此句子中的主語(nsubj)為“old”。那不是想要的實體。我們想提取“22-year-old”。

“22-year”的依賴項標籤是amod,這意味著它是“old”的修飾語。因此,我們應該定義一個規則來提取這些實體。

規則可以是這樣的:提取主語/賓語及其修飾符,還提取它們之間的標點符號。

但是,然後看看句子中的賓語(dobj)。這只是“tournament”,而不是“ATP Challenger tournament”。在這裡,我們沒有修飾詞,但有複合詞。

複合詞是那些共同構成一個具有不同含義的新術語的詞。因此,我們可以將上述規則更新為⁠-提取主語/賓語及其修飾詞,複合詞,並提取它們之間的標點符號。

簡而言之,我們將使用依賴性解析來提取實體。

提取關係

實體提取是完成工作的一半。要構建知識圖譜,我們需要邊緣將節點(實體)彼此連接。這些邊緣是一對節點之間的關係。

讓我們回到上一節中的示例。我們選擇了幾個句子來構建知識圖譜:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

你能猜出這兩個句子中主語和賓語之間的關係嗎?

兩個句子具有相同的關係“won”。讓我們看看如何提取這些關係。我們將再次使用依賴項解析:

Output:

要提取該關係,我們必須找到句子的根(也是句子的動詞)。因此,從該句子中提取的關係將是“won”。最後,來自這兩個句子的知識圖譜將如下所示:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

根據文本數據構建知識圖譜

是時候開始編寫一些代碼了!

我們將使用一組與Wikipedia文章相關的電影和電影中的文本從頭開始構建知識圖譜。我已經從500多個Wikipedia文章中提取了大約4,300個句子。這些句子中的每個句子都恰好包含兩個實體-一個主語和一個賓語。你可以從這裡[^2]下載這些句子。

我建議對此實現使用Google Colab,以加快計算時間。

導入庫

讀取數據

讀取包含Wikipedia句子的CSV文件:

Output:

讓我們檢查一些示例句子:

Output:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

讓我們檢查其中一個句子的主語和賓語。理想情況下,句子中應該有一個主語和一個賓語:

Output:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

結果不錯!只有一個主語和賓語。你可以類似的方式檢查其他句子。

實體對提取

這些節點將成為Wikipedia句子中存在的實體。邊是將這些實體彼此連接的關係。我們將以無監督的方式提取這些元素,即,我們將使用句子的語法。

主要思想是通過句子,並在遇到主語和賓語時提取它們。但是,存在一些挑戰⁠–一個實體可以跨越多個單詞,例如“red wine”,並且依賴解析器僅將單個單詞標記為主語或賓語。

因此,我在下面創建了一個函數來從句子中提取主語和賓語(實體),同時也克服了上述挑戰。為了方便起見,我將代碼分為多個塊:

讓我解釋一下上面函數中的代碼塊:chunk1:我在此塊中定義了一些空變量。prvtokdep和prvtoktext將分別保存句子中前一個單詞和上一個單詞本身的依賴項標籤。prefix和modifier將保存與主語或賓語關聯的文本。chunk 2:接下來,我們將遍歷句子中的標記。我們將首先檢查標記是否為標點符號。如果是,那麼我們將忽略它並繼續下一個標記。如果標記是複合詞的一部分(dependency tag = “compound”)=“ compound”),我們將其保留在prefix變量中。複合詞是由多個詞組成的組合,這些詞鏈接在一起形成具有新含義的詞(例如,“Football Stadium”, “animal lover”)。

當我們遇到句子中的一個主語或賓語時,我們將在其前面加上這個prefix。修飾詞來也會做同樣的操作,例如 “nice shirt”, “big house”等。

chunk 3:在這裡,如果標記是主語,那麼它將被捕獲作為第一個實體存儲在ent1變量中,prefix, modifier, prvtokdep, 和 prvtoktext等變量將被重置。

chunk 4:在這裡,如果標記是賓語,那麼它將被捕獲作為第二個實體存儲在ent2變量中。prefix, modifier, prvtokdep, 和 prvtoktext等變量將再次被重置。

chunk 5:一旦捕獲了句子中的主語和賓語,我們將更新先前的標記及其依賴項標籤。

讓我們在一個句子上測試此函數:

Output:

目前都在在按計劃進行中。在以上句子中,‘film’ 是主語,“ 200 patents”是賓語。現在,我們可以使用此函數為數據中的所有句子提取這些實體對:

Output:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

如你所見,這些實體對中有一些代詞,例如 ‘we’, ‘it’, ‘she’等。我們希望使用專有名詞或名詞。也許我們可以進一步改進get_entities()函數以過濾代詞。目前,讓我們保持現狀,繼續進行關係提取部分。

關係/謂詞提取

這將是本文的一個非常有趣的方面。我們的假設是謂詞實際上是句子中的主要動詞。

例如,在句子“Sixty Hollywood musicals were released in 1929”中,動詞是“released in” ,這就是我們將要用作該句子所產生的三元組的謂詞。下面的函數能夠從句子中捕獲此類謂語。在這裡,我使用過spaCy基於規則的匹配:

函數中定義的模式試圖在句子中找到根詞或主要動詞。識別出根後,該模式將檢查是否緊跟著介詞(“prep”)或代理詞。如果是,則將其添加到ROOT詞中。

讓我向你展示一下此功能:

Output:

同樣,讓我們​​從所有Wikipedia句子中獲取關係:

讓我們看一下我們剛剛提取的最常見的關係或謂詞:

Output:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

事實證明,最常見的關係是“A is B” 和 “A was B”。一些示例是 “composed by”, “released in”, “produced”, “written by”等等。

建立知識圖譜

最後,我們將從提取的實體(主語-賓語對)和謂詞(實體之間的關係)創建知識圖譜。

讓我們創建一個實體和謂詞的dataframe:

接下來,我們將使用networkx庫從此dataframe創建網絡。節點將代表實體,節點之間的邊或連接將代表節點之間的關係。

這將是有向圖。換句話說,任何連接的節點對之間的關​​系不是雙向的,它只是從一個節點到另一個節點。例如,“John eats pasta”:

繪製這個網絡:

Output:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

好吧,這並不是我們所希望的(儘管看起來仍然很美!)。

事實證明,我們已經創建了一個具有所有關係的圖形。很難想象具有許多關係或謂詞的圖。

因此,建議僅使用一些重要的關係來可視化圖形。我每次只建立一種關係。讓我們從“composed by”的關係開始:

Output:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

那是一張更清晰的圖表。這裡的箭頭指向作曲家。例如著名音樂作曲家拉A.R. Rahman在上圖中與“soundtrack score”, “film score”, and “music” 相關聯。

看看更多的關係。

由於寫作在任何電影中都扮演著重要的角色,因此我想形象化“written by”關係的圖表:

Output:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

太棒了!該知識圖譜為我們提供了一些非凡的信息。Javed Akhtar,Krishna Chaitanya和Jaideep Sahni等人都是著名的歌詞家,這張圖很好地體現了這種關係。

我們來看看另一個重要謂詞的知識圖譜,即“released in”:

Output:

知識圖譜:一種從文本中挖掘信息的強大數據科學技術

在此圖中,我可以看到很多有趣的信息。例如,看一下這種關係- “several action horror movies released in the 1980s” 和 “pk released on 4844 screens”。這些都是事實,它向我們表明,我們可以從文本中挖掘這些事實。太神奇了!

結語

在本文中,我們學習瞭如何以三元組的形式從給定文本中提取信息並從中構建知識圖譜。

但是,我們限制自己使用僅包含2個實體的句子。即便如此,我們仍然能夠構建內容豐富的知識圖譜。

[^1]: https://www.analyticsvidhya.com/blog/2019/09/introduction-information-extraction-python-spacy/?utm_source=blog&utm_medium=how-to-build-knowledge-graph-text-using-spacy[^2]: https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2019/10/wiki_sentences_v2.csv


分享到:


相關文章: