Skip to content

[NLP][Python] Stanford CoreNLP 教學

Stanford CoreNLP 是一個專門用來進行『自然語言處理』(NLP) 的好用工具,顧名思義,這麼一個好用的工具自然是由 Stanford(史丹佛大學)所開發的。今天我所要紀錄的,便是該如何透過 Python 來呼叫 Stanford CoreNLP 這個工具。

Stanford CoreNLP 所囊括的功能包括:

  • 斷詞 (Tokenize)
  • 詞性標記 (POS)
  • 命名實體識別 (NER)
  • 解析器 (Parser)
  • ……

基本上,自然語言處理所需要的幾種常用工具都是一應俱全的。

當然,如果你並不想要知道該如何撰寫 Python 程式來呼叫 Stanford CoreNLP、或是以下步驟過於繁瑣,但是你又想要嘗試著使用一下這個工具,那麼,你可以前往他們官方線上 DEMO 的網站: http://corenlp.run/

使用方法非常簡單:

— Text to annotate —: 在這裡輸入你想要解析的句子。
— Annotations —: 在這裡添加你想要的功能。
— Language —: 在這裡選擇你想要解析的語言。

完成了之後按下 “Submit”,稍微等等結果就會出來了!
在這裡你可以看到解析器的視覺化圖形,可說是相當地方便。


Step 1: 下載 Stanford CoreNLP

首先,來到以下官方的網站: https://stanfordnlp.github.io/CoreNLP/

網頁的底下應該會找到有著 “Download CoreNLP 3.9.2” 字樣的按鈕,當然,你的版本號可能與我並不相同,不過大致上長得就像這個樣子:

在這裡我們所下載的是 Stanford CoreNLP 的套件,但除此之外,若你需要分析英文以外的語言,你還得再額外下載你所需要的語言模型。

這裡以中文為例,下載好 Stanford CoreNLP 的壓縮檔後首先解開壓縮,這裡我們會得到一個資料夾 “stanford-corenlp-full-2018-10-05” (再次重申,這是我下載時的版本)

然後我們將下載好的中文模型 stanford-chinese-corenlp-2018-10-05-models.jar 放入剛才解壓好的資料夾中。


Step 2: 安裝 stanfordcorenlp 套件

如果你一直以來都是用終端機安裝 Python 的 Package,那麼我們這裡也只需要用指令安裝:

pip3 install stanfordcorenlp

若你是使用 Pycharm 之類的 IDE,你就必須去 File -> Settings -> Project Interpreter -> 點擊 + 符號搜尋 stanfordcorenlp 下載。


Step 3: 使用 Python 呼叫模型

from stanfordcorenlp import StanfordCoreNLP
from opencc import OpenCC

# Preset
nlp = StanfordCoreNLP('stanford-corenlp-full-2018-10-05/', lang='zh', memory='8g')
cc = OpenCC('t2s')


首先,我們要匯入 stanfordcorenlp 這個套件。

而下方的 opencc 只是我用於繁轉簡的工具,若無需求,也可以不匯入此 Package。不過以中文為例的話,Stanford CoreNLP 在簡體中文的支援度是比較好的,這跟模型當初訓練的語料有關。

這兩行中,第一行的路徑要指向剛才解壓縮的資料夾,當然,你的名稱可能跟我不一樣。同時,如果你是要使用中文的話,還必須在後頭 lang 設定語言為 “zh” 哦。

接下來我們便可以開始使用 Stanford CoreNLP 的功能了!
以下,我們用經典的『我吃了一顆又紅又大的蘋果。』這個句子來進行測試。

# 要解析的句子
sentence = '我吃了一顆又紅又大的蘋果。'

# 詞性標記
print('詞性標記:', nlp.pos_tag(sentence))

# 斷詞
print('斷詞:', nlp.word_tokenize(sentence))

# 命名實體識別
print('命名實體識別:', nlp.ner(sentence))

# 解析器
print('句法分析:')
print(nlp.parse(sentence))
print(nlp.dependency_parse(sentence))

# 關閉 Stanford Parser
nlp.close()


Output:

詞性標記: [('我', 'PN'), ('吃', 'VV'), ('了', 'AS'), ('一', 'CD'), ('顆', 'M'), ('又', 'AD'), ('紅', 'VA'), ('又', 'AD'), ('大', 'VA'), ('的', 'DEC'), ('蘋果', 'NN'), ('。', 'PU')]
斷詞: ['我', '吃', '了', '一', '顆', '又', '紅', '又', '大', '的', '蘋果', '。']
命名實體識別: [('我', 'O'), ('吃', 'O'), ('了', 'O'), ('一', 'NUMBER'), ('顆', 'O'), ('又', 'O'), ('紅', 'O'), ('又', 'O'), ('大', 'O'), ('的', 'O'), ('蘋果', 'O'), ('。', 'O')]
句法分析:

(ROOT
  (IP
    (NP (PN 我))
    (VP (VV 吃) (AS 了)
      (NP
        (QP (CD 一)
          (CLP (M 顆)))
        (CP
          (IP
            (VP
              (VP
                (ADVP (AD 又))
                (VP (VA 紅)))
              (VP
                (ADVP (AD 又))
                (VP (VA 大)))))
          (DEC 的))
        (NP (NN 蘋果))))
    (PU 。)))

[('ROOT', 0, 2), ('nsubj', 2, 1), ('aux:asp', 2, 3), ('nummod', 11, 4), ('mark:clf', 4, 5), ('advmod', 7, 6), ('amod', 11, 7), ('advmod', 9, 8), ('conj', 7, 9), ('mark', 7, 10), ('dobj', 2, 11), ('punct', 2, 12)]

以上就是 Stanford CoreNLP 使用 Python 調用的基本程序,大家可以嘗試看看其他的功能。


References


Read more

若是在執行程式的過程中發生了問題、或是出現了無法解決的報錯,也許可以參考一下我的另外一篇問題紀錄:Stanford CoreNLP 報錯問題

Leave a Reply