Mac os Pycharm 中使用Stanza進行實體識別(自然語言處理nlp)

stanza 是斯坦福開源Python版nlp庫,對自然語言處理有好大的提升,具體好在哪裡,官網裡面都有介紹,這裡就不翻譯了。下面放上對應的官網和倉庫地址。

stanza 官網地址:點擊我進入

stanza github 倉庫地址:點擊我進入

安裝步驟

1、Pycharm 中在設置中安裝 stanza 是比較慢的,因此不建議這種方法,而且也考不到進度到那裡了。

 

 

 

 

 

 

 

 

 

2、直接在pycharm中安裝也有嘗試,但是很長時間都沒看到成功,這裡推薦使用將倉庫程式碼克隆下來,在本地進行手動安裝,最主要的是速度快。

# 為了方面查找,這裡建議直接將倉庫克隆到桌面最省事。
cd ~/Destop
git clone https://github.com/stanfordnlp/stanza.git
cd stanza
pip install -e .

pip 安裝成功之後下面就是將安裝好的內容移動到pycharm使用的Interpreter,也就是下圖使用的python路徑對應的site-packages中。

 

 找到上圖對應的跟bin同一目錄的lib文件,lib->python3.7->site-packages。打開這個文件夾,將之前安裝好的 stanza 移過來。如果是克隆在桌面了,就到桌面去找對應的文件夾,會發現剛才克隆的stanza文件夾下多了兩個文件:stanza、stanza.egg-info,將這兩個文件移動到上面的 site-packages 中,這樣就可以在 pycharm 中直接導入使用。以上stanza安裝完成。

使用

Pycharm 中使用stanza也比較簡單,直接導入使用。

import stanza
# 這一步是去下載對應的英文模型,執行一下看命令行鏈接出來就可以,命令行有可能不會成功,還是老方法把命令行中的地址,放到瀏覽器中直接下載。
stanza.download('en') 

執行之後,會出現下面的鏈接,鏈接放到瀏覽器後下載完成解壓。

 

 第二個地址直接點擊去下載也行,這裡放上地址:英文模型下載

英文模型下載完成後,解壓會看到裡面有對應的文件。將文件放到下面命令執行後報錯的路徑下。

nlp = stanza.Pipeline('en')
doc = nlp("Barack Obama was born in Hawaii.  He was elected president in 2008.")

執行上面兩句會看到報錯,說在xxx路徑找不到模型包,把剛才下載的模型放到這個文件夾中,這個文件一般是在用戶目錄下stanza_resources,比如:/Users/xxxx/stanza_resources,

該目錄下有en(代表英文模型),把下載的模型放到這個目錄:/Users/xxxx/stanza_resources/en/。

以上步驟完成後,就可以使用。

 

說下stanza進行實體識別時候好處是,直接將識別的實體封裝成了json格式,識別出的實體比如:PERSON、ORG、LOCATION等,詞性為「O」的並不會出現在識別結果中,這樣方便多了,不需要在進行過濾到不想要的實體。具體效果如下:

import stanza
nlp = stanza.Pipeline('en')
doc = nlp("Barack Obama was born in Hawaii.  John studies at Stanford University in NewYork.")
for sentence in doc.sentences:
    print(sentence.ents)

輸出如下:

[{
  "text": "Barack Obama",
  "type": "PERSON",
  "start_char": 0,
  "end_char": 12
}, {
  "text": "Hawaii",
  "type": "GPE",
  "start_char": 25,
  "end_char": 31
}, {
  "text": "John",
  "type": "PERSON",
  "start_char": 34,
  "end_char": 38
}, {
  "text": "Stanford University",
  "type": "ORG",
  "start_char": 50,
  "end_char": 69
}, {
  "text": "NewYork",
  "type": "GPE",
  "start_char": 73,
  "end_char": 80
}]

這裡比stanfordcorenlp實體識別區別是:實體會進行組塊分析,比如 Barack Obama識別成一個實體(PERSON)。而stanfordcorenlp則會分開識別:Barack(PERSON)、Obama(PEROSN)。