本文為 AI 研習社編譯的技術博客,原標題 :
Natural Language Processing — Event Extraction
作者 | Rodrigo Nader
翻譯 | 胡瑛皓 編輯 | 醬番梨、王立魚
原文連結:
https://towardsdatascience.com/natural-language-processing-event-extraction-f20d634661d3
每天產生的文本信息令人嘆為觀止。數百萬數據源以新聞稿、博客、消息、手稿和無數其他形式發布,因而自動組織和處理就必不可少。
隨著神經網絡算法的改進、計算機算力的顯著提升以及大量湧現的理解框架,自然語言處理的能力正被前所未有的探索。其中一個常見應用稱為事件提取,即處理收集蘊藏在文本中的一個階段內發生的事件,自動識別發生了什麼和什麼時候發生。
比如:
2018/10 — President Donald Trump’s government banned countries from importing Iranian oil with exemptions to seven countries.
2019/04 — US Secretary of State Mike Pompeo announced that his country would open no more exception after the deadline.
2019/05 — The United States ended with exemptions that allowed countries to import oil from Iran without suffering from US sanctions.
憑藉獲得信息上下文的能力,可以關聯時間上互相獨立的事件,汲取其影響,發現事件序列如何隨著時間推移展開。這些科技洞見力正驅動諸如 EventRegistry和 Primer.AI等組織,用科技服務各個市場。
本文將構建一個簡單的事件提取腳本,接收新聞輸入處理後輸出事件。
首先需要收集數據。我們可以用任何形式的文本,只要這些文字的內容可通過時間線表示。本文選用 newsapi,從該數據源獲取數據很容易,其開發者計劃每天可獲取500個免費請求。以下是處理請求的代碼:
最後一個函數,返回特定查詢的結果列表,大約包含2000篇文章。我們的目的是抽取這些文章總的事件。為簡化這一過程,只保留文章標題 (理論上,標題應該蘊涵新聞的核心內容)。
執行後得到一個data frame,其內容如下,包括日期、標題和描述
前面拿到了文章的標題,現在需要將其轉換為算法能理解的形式。注,本文跳過了整個文本預處理環節,因為與本文不太相關。不過,如果你是新手,應用模型前務必作預處理 → 請打開原文查看一篇很好的教程。
SpaCy的預訓練詞嵌入模型,可幫助獲取獨立詞語的含義,進一步獲得整句句子的含義。具體來說用的是SpaCy large model (en_core_web_lg), 其中包含了685k英語單詞的預訓練詞向量。當然也可以用任意其他預訓練詞向量表示 (諸如Word2Vec, FastText, GloVe等等)。
SpaCy中默認將詞向量的平均值作為句子向量,這是一種簡易處理方法,忽略了句子中的詞序信息。如想使用更精巧的策略,可以看一下Sent2Vec、SkipThoughts等模型。這篇文章 詳細介紹了SkipThoughts如何用無監督方法提取摘要。
本文中使用SpaCy自帶的方法:
可以看到每篇文章被表示為300維的數組,如下:
即便採用搜索方式過濾獲取數據,同一查詢中會出現不同的主題。比如,搜索關鍵詞 「Paris」 可以得到:
或:
現在用聚類算法分組不同的主題。
本例中,我使用DBSCAN算法,該算法不需要指定聚類簇的數量。算法自己決定聚類簇的數量和規模。
算法中 epsilon 參數決定兩個樣本間的最大距離,以此決定是否臨近,這意味著如果 eps 設置太大形成的簇就比較少,如果設置太小大多數點都無法被臨近聚類,於是被分到默認簇 (-1)裡,產生的簇也不多。下圖顯示聚類簇的數量與的epsilon關係:
給 eps 調參是最為精巧的一步,因為聚類的結果會改變很多,也就是如何確定句子是相似的。通過試驗找到恰當的值,能保持句子間的相似度,同時不把相近的句子分到不同組去。
總的來說,由於我們期望同一組中包含非常相似的句子,也就是得到一個較高的分類數。因此選取 0.08 ~ 0.12之間。參見 Scikit Learn 中關於 eps 和其他參數的說明。
現在看一下每個類中包含的數量:
-1 類表示未明確聚類的句子,其他是已被分類的句子。我們分析一下最大的類,表示最重要的主題 (或者評論最多的那個)。
抽樣一下其中一個類:
對於每個分類我們得到如上形式的data frame。接下來是以時間線排列這些句子,並過濾掉相似的句子。每天只呈現一篇文章,這樣實現出來的時間線就乾淨而統一。
由於每天關於同一主題會產生許多標題,會用一個條件去過濾。該句子將最好的表達事件,也就是蘊涵著這些標題代表的核心內容。
按天聚類句子,在每個組中選擇其最靠近中心的句子。以下是從一組向量中找出中心向量的函數:
乾淨整潔。最後用Plotly繪製一下時間線圖:雷鋒網(公眾號:雷鋒網)雷鋒網雷鋒網
就是這樣,用一個腳本從2000篇文章中提取和組織事件。現在可以想像每天將這一技術應用於上百萬篇文章有多大用處。僅以股票市場每日新聞影響為例,事件提取可以說非常有價值。
可以增加許多步驟提升事件提取的效果,諸如更好的預處理包括POS tagging和NER,使用更好的句子向量模型等等。不過本文的方法,已經可以快速達到理想的結果。
感謝閱讀本文。本文聚焦NLP及事件提取。如果想了解更多有關數據科學和機器學習的信息,請follow我的帳號。有任何想法、評論或問題,請給我留言。
想要繼續查看該篇文章相關連結和參考文獻?
點擊【一文帶你讀懂自然語言處理-事件提取】即可訪問:
https://ai.yanxishe.com/page/TextTranslation/1704
社長今日推薦:AI入門、大數據、機器學習免費教程
35本世界頂級原本教程限時開放,這類書單由知名數據科學網站 KDnuggets 的副主編,同時也是資深的數據科學家、深度學習技術愛好者的Matthew Mayo推薦,他在機器學習和數據科學領域具有豐富的科研和從業經驗。
點擊連結即可獲取:https://ai.yanxishe.com/page/resourceDetail/417
雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。