搜索引擎檢索:Python和spaCy信息提取簡介

概覽

  • 像Google這樣的搜索引擎如何理解我們的查詢並提供相關結果?
  • 瞭解信息提取的概念
  • 我們將使用流行的spaCy庫在Python中進行信息提取

介紹

作為一個數據科學家,在日常工作中,我嚴重依賴搜索引擎(尤其是Google)。我的搜索結果涉及各種查詢:Python代碼問題,機器學習算法,自然語言處理(NLP)框架的比較等。我一直很好奇這些搜索引擎如何理解我的查詢並提取相關結果,就像他們知道我在想什麼一樣。我想了解NLP方面在這裡是如何工作的:該算法如何理解非結構化文本數據並將其轉換為結構化數據並顯示相關結果?讓我們舉個例子。我在Google上輸入了兩個不同的查詢:

搜索引擎檢索:Python和spaCy信息提取簡介

首先,Google迅速確定了實體(world cup)和動作(won)。在第二個查詢中,在得到結果之前,我甚至還沒有完成句子!你認為Google如何理解這些查詢背後的上下文?這是一個令人著迷的想法,我們將在本文中對其 講解。我們將瞭解根據搜索查詢如何生成這些有意義且相關的結果的核心思想。是的,我們甚至將深入研究Python代碼並動手實踐。讓我們開始吧!

注意:我建議你閱讀這篇有關數據科學中的計算語言學和依賴樹簡介的文章[^1],以更好地瞭解我們將在此處學習的內容。

信息抽取

信息提取(IE)在自然語言處理(NLP)和語言學領域是至關重要的。它廣泛用於諸如問答系統,機器翻譯,實體提取,事件提取,命名實體鏈接,指代消解,關係提取等任務。在信息提取中,有一個重要的三元組概念。

三元組代表實體以及它們之間的關係。例如,(奧巴馬,出生於,夏威夷)是一個三元組,其中"奧巴馬"和"夏威夷"是相關實體,它們之間的關係是"出生於"。

在本文中,我們將重點介紹從給定文本中提取這些類型的三元組。

在繼續之前,讓我們看一下信息提取的不同方法。我們可以將信息提取大致分為兩個分支,如下所示:

搜索引擎檢索:Python和spaCy信息提取簡介

在傳統信息提取中,要提取的關係是預先定義的。在本文中,我們將僅介紹基於規則的方法。

在開放信息提取中,關係不是預先定義的。該系統可以自由提取在處理文本數據時遇到的任何關係。

語義關係:從非結構化文本中獲取結構化知識

看看下面的文字片段:

搜索引擎檢索:Python和spaCy信息提取簡介

你能想到從該文本中提取有意義的信息的任何方法嗎?讓我們嘗試逐句解決此問題:

搜索引擎檢索:Python和spaCy信息提取簡介

在第一句話中,我們有兩個實體 ("Food Tutorials" 和 "Wes Anderson"),這些實體通過術語 "Directed"相關起來的,因此, (Wes Anderson, directed, Food Tutorials) 是一個三元組。同樣,我們也可以從其他句子中提取關係:

搜索引擎檢索:Python和spaCy信息提取簡介

事實證明,我們可以根據文本的句法結構和語法來獲得結構化信息,如上例所示。

信息提取的不同方法

在上一節中,我們設法從幾個句子中輕鬆提取出三元組。但是,在現實世界中,數據量巨大,並且人工提取結構化信息是不可行的。因此,自動化此信息提取變得很重要。

有多種方法可以自動執行信息提取。讓我們一一理解它們:

  • 基於規則的方法:我們為自然語言的語法和其他語法屬性定義了一組規則,然後使用這些規則從文本中提取信息
  • 監督學習的方法:假設我們有一個句子S。它有兩個實體E1和E2。現在,監督機器學習模型必須檢測E1和E2之間是否存在任何關係(R)。因此,在一種有監督的方法中,關係提取的任務變成了關係檢測的任務。這種方法的唯一缺點是,它需要大量標記數據來訓練模型
  • 半監督學習的方法:當沒有足夠的標籤數據時,我們可以使用一組示例(三元組)來制定高精度模式,該模式可用於從文本中提取更多關係

使用Python和spaCy提取信息

我們在這裡對理論有所瞭解,因此讓我們進入Python代碼層面。我敢肯定,你很想了解本節內容!

我們將做一個小項目,從非結構化數據(在本例中為文本數據)中提取結構化信息。我們已經看到,文本中的信息以不同實體之間的關係形式存在。

因此,在本節中,我們將嘗試發現和提取與某種關係或另一種關聯的不同實體對。

搜索引擎檢索:Python和spaCy信息提取簡介

spaCy基於規則的匹配

在開始之前,讓我們談談Marti Hearst。她是計算語言學研究員,也是加州大學伯克利信息學院的教授。

Marti教授實際上已經對信息提取主題進行了廣泛的研究。她最有趣的研究之一是致力於建立一組文本模式,這些模式可用於從文本中提取有意義的信息。這些模式俗稱“Hearst Patterns”。

讓我們看下面的例子:

搜索引擎檢索:Python和spaCy信息提取簡介

僅通過查看句子的結構,我們就可以推斷出"Gelidium"是"red algae"的一種。

我們可以將此模式形式化為"X such as Y",其中X是上位詞,Y是下位詞。這是"Hearst Patterns"中的許多模式之一。下圖可讓你直觀瞭解該想法:

搜索引擎檢索:Python和spaCy信息提取簡介

現在,我們嘗試使用這些模式/規則來提取上位詞-下為詞對。我們將使用spaCy的基於規則的匹配器來執行此任務。

首先,我們將導入所需的庫:

接下來,加載一個spaCy模型:

我們將根據這些Hearst Patterns從文本中挖掘信息。

模式: X such as Y

為了能夠從上面的句子中提取所需的信息,理解其句法結構(例如主語,賓語,修飾語和詞性(POS))非常重要。

通過使用spaCy,我們可以輕鬆地探索句子中的這些語法細節:

output:

看看術語"such"和"as"。它們跟在一個名詞("countries")後。在它們之後,我們有一個專有名詞("Vietnam")充當下位詞。因此,讓我們使用依賴項標籤和詞性標籤創建所需的模式:

讓我們從文本中提取模式:

output:

好像不錯。但是,如果我們可以得到 "developing countries"而不只是"countries",那麼輸出將更有意義。

因此,我們現在還將通過使用以下代碼來捕獲"such as"之前的名詞的修飾語:

ouutput:

在這裡,"developing countries"是上位詞,"Vietnam’"是下位詞。兩者在語義上都是相關的。

注意:以上模式中的鍵" OP":"?"表示修飾符("amod")可以出現一次,也可以不出現。

以類似的方式,我們可以從其他文本中獲得:

  • Fruits such as apples
  • Cars such as Ferrari
  • Flowers such as rose

現在,讓我們使用其他一些Hearst Patterns來提取更多的上位詞和下位詞。

模式: X and/or Y

output:

output:

讓我們嘗試相同的代碼來捕獲"X or Y"模式:

其餘代碼將保持不變:

output:

模式: X, including Y

output:

output:

模式: X, especially Y

output:

output:

2.子樹匹配以進行關係提取

簡單的基於規則的方法非常適合信息提取任務。但是,它們有一些缺點和不足。

我們必須極富創造力,以提出新的規則來捕獲不同的模式。很難建立能在不同句子之間很好地概括的模式。

為了增強基於規則的關係/信息提取方法,我們應該嘗試瞭解現有句子的依存關係結構。讓我們以示例文本為例,構建其依賴關係圖表樹:

output:

搜索引擎檢索:Python和spaCy信息提取簡介

你能在這句話中找到任何有趣的關係嗎?如果你查看句子中的實體:Tableau和Salesforce,它們與術語"acquired"相關。因此,我可以從這句話中提取的模式是" Salesforce acquired Tableau"或" X acquired Y"。

現在考慮以下說法:Careem, a ride-hailing major in the middle east, was acquired by Uber."

其依賴圖將如下所示:

搜索引擎檢索:Python和spaCy信息提取簡介

很嚇人吧?不過不用擔心我們需要檢查的是,多個句子之間有哪些共同依賴路徑。此方法稱為子樹匹配。

例如,如果我們將此語句與上一個語句進行比較:

搜索引擎檢索:Python和spaCy信息提取簡介

搜索引擎檢索:Python和spaCy信息提取簡介

我們將僅考慮公共依賴路徑,並提取實體以及它們之間的關係(acquired)。因此,從這些句子中提取的關係為:

Salesforce acquired TableauUber acquired Careem

讓我們嘗試在Python中實現此技術。我們將再次使用spaCy,因為它很容易遍歷依賴樹。

我們將首先查看句子中單詞的依賴項標籤和POS:

output:

在這裡," Tableau"的依賴項標籤是nsubjpass,它表示被動主語(因為它是被動句子)。另一個實體"Salesforce"是該句子中的賓語,術語"acquired"是句子的根,這意味著它以某種方式將賓語和主語聯繫起來。

讓我們定義一個函數來執行子樹匹配:

在這種情況下,我們只需要查找所有符合以下條件的句子:

  • 有兩個實體,並且"acquired"一詞是句子中唯一的根

然後,我們可以從句子中捕獲主語和賓語。讓我們調用上面的函數:

output:

這裡,主語是收購者,賓語是被收購的實體。讓我們使用相同的函數subtree_matcher()來提取通過相同關係(“acquired”)關聯的實體:

output:

你看到這裡發生了什麼嗎?這句話有更多的單詞和標點符號,但我們的邏輯仍然有效併成功地提取了相關實體。

但是,等等-如果我將句子從被動語態更改為主動語態怎麼辦?我們的邏輯仍然有效嗎?

output:

那不是我們所期望的。該功能未能捕獲" Salesforce",並錯誤地將" Tableau"返回為收購方。

那麼是什麼問題了?讓我們瞭解一下這句話的依賴關係樹:

output:

事實證明," Salesforce"和" Tableau"這兩個術語的語法功能(主語和賓語)已經在主動語態中互換了。但是,現在該主語的依賴項標籤已從" nsubjpass"更改為" nsubj"。他的標籤表明句子是主動語態。

我們可以使用此屬性來修改子樹匹配功能。下面給出的是子樹匹配的新功能:

讓我們在主動語句子上嘗試這個新函數:

output:

輸出正確。讓我們將之前的被動語句傳遞給此函數:

output:

這正是我們想要的。我們使函數稍微更通用。我希望你深入研究不同類型句子的語法結構,並嘗試使此功能更加靈活。

結語

在本文中,我們瞭解了信息提取,關係和三元組的概念以及關係提取的不同方法。就我個人而言,我真的很樂於對此主題進行研究,並計劃撰寫更多有關更高級信息提取方法的文章。

[^1]: https://www.analyticsvidhya.com/blog/2017/12/introduction-computational-linguistics-dependency-trees/?utm_source=blog&utm_medium=introduction-information-extraction-python-spacy


分享到:


相關文章: