自然語言處理(NLP)技術的應用日益廣泛,本文旨在介紹 NLP 的基礎任務和相關工具。文章首先介紹設定程式開發環境,建議使用 Google Colab 和 GitHub。接著,介紹了三個主要的開源 NLP 函式庫:spaCy、fast.ai 和 Hugging Face,並著重說明 spaCy 的安裝和使用。文章詳細說明瞭 spaCy 的各項功能,包括斷詞、詞性標註、依存句法分析、命名實體辨識等,並搭配程式碼範例和結果解讀,讓讀者更容易理解。最後,文章也提到了命名實體連結(NEL)的應用,為讀者展現 NLP 技術的更廣泛應用場景。
自然語言處理的基礎任務與工具介紹
在前面的章節中,我們已經對自然語言處理(NLP)有了初步的瞭解。現在,我們將探討 NLP 的基礎任務,並介紹一些優秀的開源工具來實作這些任務。
設定程式開發環境
為了進行 NLP 任務,我們首先需要設定一個適合的程式開發環境。本文將使用 Google 的 Colaboratory(簡稱 Google Colab),它是一個免費的 Jupyter Notebook 環境,可以在雲端執行。我們還將使用 GitHub 作為我們的程式碼倉函式庫。
開源 NLP 函式庫:spaCy、fast.ai 和 Hugging Face
本文將介紹三個主要的開源 NLP 函式庫:spaCy、fast.ai 和 Hugging Face。這些函式庫提供了高層次的抽象,使我們能夠快速應用 NLP 技術。
spaCy
spaCy 是由 Explosion AI 開發的開源 NLP 函式庫,於 2015 年首次發布。它以快速的效能和對多種語言的支援而聞名。spaCy 提供了預訓練的語言模型,可以用於各種 NLP 任務。
pip install -U spacy[cuda110,transformers,lookups]==3.0.3
pip install -U spacy-lookups-data==1.0.0
pip install cupy-cuda110==8.5.0
python -m spacy download en_core_web_trf
內容解密:
pip install -U spacy[cuda110,transformers,lookups]==3.0.3:安裝 spaCy 函式庫,並指定 CUDA 版本和 transformers、lookups 等額外功能。pip install -U spacy-lookups-data==1.0.0:安裝 spaCy 的額外資料包,用於提供詞彙查詢等功能。pip install cupy-cuda110==8.5.0:安裝 CuPy,一個用於 GPU 加速的 Python 函式庫。python -m spacy download en_core_web_trf:下載預訓練的英語語言模型,用於 NLP 任務。
fast.ai
fast.ai 是另一個流行的開源 NLP 函式庫,建構於 PyTorch 之上。它提供了高層次的元件,使開發者能夠快速建立最先進的 NLP 模型。
Hugging Face
Hugging Face 是一家專注於 NLP 的公司,其開源函式庫 transformers 提供了對多種預訓練模型的支援,包括 BERT、RoBERTa 等。Hugging Face 的函式庫非常適合用於生產環境中的 NLP 任務。
使用 spaCy 進行 NLP 任務
現在,讓我們使用 spaCy 來進行一些基本的 NLP 任務。首先,我們需要安裝 spaCy 和下載預訓練的語言模型。然後,我們就可以使用 spaCy 的 API 來進行分詞、實體辨識等任務。
spaCy 的預訓練語言模型分為兩類別:核心模型和起始模型。核心模型是用於一般用途的預訓練模型,而起始模型則是用於遷移學習的基底模型。
基本NLP任務:從斷詞到詞性標註
在進行自然語言處理(NLP)時,機器需要先將文字分解成可處理的單位,這個過程稱為斷詞(Tokenization)。接著,機器會為每個斷詞結果加上詞性標註(Part-of-speech tagging),以便了解每個詞彙在句子中的角色。
斷詞(Tokenization)
斷詞是NLP的第一步,將文字分割成單詞、標點符號等基本單元。我們使用spacy這個函式庫來進行斷詞。首先,載入spacy的英文模型:
import spacy
nlp = spacy.load("en_core_web_sm")
接下來,對句子進行斷詞:
sentence = nlp.tokenizer("We live in Paris.")
print("The number of tokens: ", len(sentence))
print("The tokens: ")
for word in sentence:
print(word)
輸出結果如下:
The number of tokens: 5
The tokens:
We
live
in
Paris
.
可以看到,句子被分割成五個斷詞結果,包括句尾的句號。
內容解密:
nlp.tokenizer()對輸入的句子進行斷詞處理。len(sentence)計算斷詞結果的數量。- 迴圈遍歷每個斷詞結果並列印出來。
處理更複雜的文字:以Jeopardy問題為例
接下來,我們使用spacy對一些Jeopardy問題進行斷詞。首先,載入Jeopardy問題的資料集:
import pandas as pd
import os
cwd = os.getcwd()
data = pd.read_csv(cwd+'/data/jeopardy_questions/jeopardy_questions.csv')
data = pd.DataFrame(data=data)
data.columns = map(lambda x: x.lower().strip(), data.columns)
data = data[0:1000]
data["question_tokens"] = data["question"].apply(lambda x: nlp(x))
內容解密:
pd.read_csv()載入CSV檔案中的Jeopardy問題。data.columns = map(lambda x: x.lower().strip(), data.columns)將欄位名稱轉換成小寫並去除多餘的空白。data = data[0:1000]取出前1000筆資料。data["question_tokens"] = data["question"].apply(lambda x: nlp(x))對每個問題進行斷詞處理。
檢視第一個問題及其斷詞結果:
example_question = data.question[0]
example_question_tokens = data.question_tokens[0]
print("The first question is:")
print(example_question)
print("The tokens from the first question are:")
for token in example_question_tokens:
print(token)
輸出結果如下:
The first question is:
For the last 8 years of his life, Galileo was under house arrest for espousing this man's theory
The tokens from the first question are:
For
the
last
8
years
of
his
life
,
Galileo
was
under
house
arrest
for
espousing
this
man
's
theory
內容解密:
data.question[0]取出第一個問題。data.question_tokens[0]取出第一個問題的斷詞結果。- 迴圈遍歷每個斷詞結果並列印出來。
詞性標註(Part-of-speech tagging)
在完成斷詞後,下一步是為每個斷詞結果加上詞性標註。spacy使用預先訓練好的統計模型來預測每個詞彙的詞性。
print("Here are the Part-of-speech tags for each token in the first question:")
for token in example_question_tokens:
print(token.text, token.pos_, spacy.explain(token.pos_))
輸出結果如下:
Here are the Part-of-speech tags for each token in the first question:
For ADP adposition
the DET determiner
last ADJ adjective
8 NUM numeral
years NOUN noun
of ADP adposition
his PRON pronoun
life NOUN noun
, PUNCT punctuation
Galileo PROPN proper noun
was AUX auxiliary
under ADP adposition
house NOUN noun
arrest NOUN noun
for ADP adposition
espousing VERB verb
this DET determiner
man NOUN noun
's PART particle
theory NOUN noun
內容解密:
token.pos_取得每個詞彙的詞性標註。spacy.explain(token.pos_)對詞性標註進行解釋。
詞性標註的意義
詞性標註幫助機器瞭解每個詞彙在句子中的角色,例如名詞、動詞、形容詞等。這對於後續的NLP任務(如句法分析、語意分析等)至關重要。
依存句法分析(Dependency Parsing)
依存句法分析是指在自然語言處理(NLP)中,分析句子中詞語之間的依存關係。透過這種分析,我們可以瞭解句子中詞語之間的結構關係,並進一步利用依存句法分析圖來視覺化這些關係。
首先,讓我們來檢視第一個問題中每個詞語的依存句法標籤:
# 列印第一個問題中詞語的依存句法標籤
for token in example_question_tokens:
print(token.text, token.dep_, spacy.explain(token.dep_))
輸出結果如下:
For prep 介詞修飾語
the det 限定詞
last amod 形容詞修飾語
8 nummod 數字修飾語
years pobj 介詞的賓語
of prep 介詞修飾語
his poss 所有格修飾語
life pobj 介詞的賓語
, punct 標點符號
Galileo nsubj 名詞主語
was ROOT 根節點
under prep 介詞修飾語
house compound 複合詞
arrest pobj 介詞的賓語
for prep 介詞修飾語
espousing pcomp 介詞的補語
this det 限定詞
man's poss 所有格修飾語
's case 格標記
theory dobj 直接賓語
內容解密:
For被標記為介詞修飾語,表示它與後面的名詞片語構成介詞片語。the是限定詞,用來修飾後面的名詞。last是形容詞修飾語,用來描述名詞years。8是數字修飾語,用來修飾名詞years。years是介詞For的賓語。Galileo是句子中的名詞主語,與動詞was相關聯。was是句子的根節點,表示句子的主要動詞。under house arrest和for espousing this man's theory是兩個介詞片語,分別與was相關聯。
依存句法分析圖
為了更好地理解依存句法分析的結果,我們可以使用 spacy 的內建視覺化工具來呈現依存關係圖:
# 視覺化依存句法分析結果
from spacy import displacy
displacy.render(example_question_tokens, style='dep', jupyter=True, options={'distance': 120})
這個圖表顯示了句子中詞語之間的依存關係,例如 For 和 years 在介詞片語中的重要性,以及 Galileo 與 was 之間的主謂關係。
詞塊分析(Chunking)
接下來,讓我們進行詞塊分析。詞塊分析是指將相關的詞語組合成一個單一的單位。例如,在句子 “My parents live in New York City.” 中,My parents 和 New York City 可以被視為名詞片語:
# 列印句子中的名詞片語
for chunk in nlp("My parents live in New York City.").noun_chunks:
print(chunk.text)
輸出結果如下:
My parents
New York City
內容解密:
- 詞塊分析幫助機器更好地理解句子的結構,將相關的詞語組合在一起。
- 在這個例子中,
My parents和New York City被正確地識別為名詞片語。
詞根還原(Lemmatization)
最後,我們來進行詞根還原。詞根還原是指將單詞還原為其基本形式,例如將 years 還原為 year,將 was 還原為 be:
# 列印詞根還原結果
lemmatization = pd.DataFrame(data=[], columns=["original", "lemmatized"])
i = 0
for token in example_question_tokens:
lemmatization.loc[i, "original"] = token.text
lemmatization.loc[i, "lemmatized"] = token.lemma_
i = i + 1
lemmatization
輸出結果如下:
| original | lemmatized |
|---|---|
| For | for |
| the | the |
| last | last |
| 8 | 8 |
| years | year |
| of | of |
| his | his |
| life | life |
| , | , |
| Galileo | Galileo |
| was | be |
| under | under |
| house | house |
| arrest | arrest |
| for | for |
| espousing | espouse |
| this | this |
| man | man |
| ’s | ’s |
| theory | theory |
內容解密:
- 詞根還原幫助簡化單詞,使其變為基本形式,有助於後續的文字分析。
- 在這個例子中,
years被還原為year,was被還原為be,而espousing被還原為espouse。
命名實體辨識與連結:企業級NLP任務的核心價值
在自然語言處理(NLP)的領域中,命名實體辨識(Named Entity Recognition, NER)是一項關鍵任務。NER能夠解析自然語言中的顯著實體,並為其分配適當的類別標籤。例如,將人名標記為「Person」,將城市名稱標記為「Location」。本篇文章將探討NER的核心概念、技術實作及其在企業中的應用價值,並進一步介紹命名實體連結(Named Entity Linking, NEL)的原理和實踐。
命名實體辨識(NER)的基礎
NER是根據一系列基礎NLP任務的綜合應用,包括詞彙切分(Tokenization)、詞性標注(Part-of-Speech Tagging)、依存句法分析(Dependency Parsing)、分塊(Chunking)和詞根還原(Lemmatization)。透過這些任務產生的後設資料,使得機器能夠對文字進行更複雜的分析。
spaCy的NER模型
spaCy是一個流行的NLP函式庫,其內建的NER模型能夠辨識多種型別的實體。表1-3列出了spaCy目前支援的實體型別,包括人物、地點、組織、日期等。
| 型別 | 描述 |
|---|---|
| PERSON | 人名,包括虛構人物 |
| NORP | 國籍或宗教、政治團體 |
| FAC | 建築物、機場、高速公路、橋樑等 |
| ORG | 公司、機構、組織等 |
| GPE | 國家、城市、州等 |
| LOC | 非GPE地點、山脈、水體等 |
| PRODUCT | 產品、車輛、食品等(非服務) |
| EVENT | 名稱特定的颶風、戰役、戰爭、體育賽事等 |
| WORK_OF_ART | 書籍、歌曲等的標題 |
| LAW | 成為法律的檔名稱 |
| LANGUAGE | 任何命名的語言 |
| DATE | 絕對或相對日期或期間 |
| TIME | 小於一天的時間單位 |
| PERCENT | 百分比,包括%符號 |
| MONEY | 貨幣價值,包括單位 |
| QUANTITY | 測量單位,如重量或距離 |
| ORDINAL | 「第一」、「第二」等序數詞 |
| CARDINAL | 不屬於其他型別的數字 |
NER的實踐與應用
透過spaCy的NER模型,我們可以對文字進行實體辨識。以下是一個簡單的範例,展示如何對一句話進行NER:
import spacy
# 載入spaCy的英文模型
nlp = spacy.load("en_core_web_sm")
# 定義範例句子
example_sentence = "George Washington was an American political leader, military general, statesman, and Founding Father who served as the first president of the United States from 1789 to 1797."
# 處理句子
doc = nlp(example_sentence)
# 列印NER結果
print("Text\tStart\tEnd\tLabel")
for token in doc.ents:
print(f"{token.text}\t{token.start_char}\t{token.end_char}\t{token.label_}")
結果分析
輸出結果如下:
Text Start End Label
George Washington 0 17 PERSON
American 25 33 NORP
first 119 124 ORDINAL
the United States 138 155 GPE
1789 to 1797 161 173 DATE
結果解讀
- George Washington 被標記為
PERSON,起始位置為0,結束位置為17。 - American 被標記為
NORP,起始位置為25,結束位置為33。 - first 被標記為
ORDINAL,起始位置為119,結束位置為124。 - the United States 被標記為
GPE,起始位置為138,結束位置為155。 - 1789 to 1797 被標記為
DATE,起始位置為161,結束位置為173。
內容解密:
此範例展示瞭如何使用spaCy進行NER。程式碼首先載入了英文模型,接著定義了一個範例句子並對其進行處理。最後,它遍歷處理結果中的實體,並列印出每個實體的文字、起始位置、結束位置和標籤。這種技術對於從大量文字中提取有價值資訊至關重要。
NER的視覺化
spaCy提供了內建的視覺化工具displacy,可以將NER結果以圖形化方式呈現,使結果更加直觀:
# 視覺化NER結果
from spacy import displacy
displacy.render(doc, style='ent', jupyter=True, options={'distance': 120})
圖表解讀
生成的圖表將實體以不同的顏色標記,直觀地展示了句子的結構和實體之間的關係。這種視覺化呈現方式對於理解和分析NER結果非常有幫助。
命名實體連結(NEL)
NEL是另一項重要的NLP任務,它將文字中的實體連結到知識函式庫中的唯一識別符號,從而實作實體的規範化表示。這對於企業級應用尤其重要,因為它能夠提高資訊檢索和整合的效率。