Contents ...
udn網路城邦
[NLTK][NLP][Text Analysis] nltk 基本教學
2019/11/14 01:17
瀏覽471
迴響0
推薦0
引用0

【標注:目前部落格已搬到了別的的地方,如果想看比較大的版面以及(可能)有更新的此篇文章,請到這裡

《前言》

nltk 全文是 Nature Language Tool Kit (NLTK), 是 Python 上一個能夠進行自然語言處理的 Package。雖然也能進行中文的處理,但是對於中文的支援度並沒有英文來得那麼好,故今天的範例全部都由英文來進行。

首先我們先來闡述一下 nltk 進行文本前處理的幾個流程項目:

  • - sentence segmentation (斷句)
  • - word segmentation (斷詞)
  • - pos (詞性標記)
  • - lemmatization (字型還原)
  • - stopword (停用詞)
  • - ner (命名實體辨識)

當然,文本的前處理還有許多的種類與面向、今天只是簡單地拿幾個比較簡單的範例來解說。pos


 

《Sentence segmentation (斷句)》

首先,假設我們有個要分析的文本:

text = """I went to Japan. (NOT I went to the Japan.)
He played tennis with Ben. (NOT He played tennis with the Ben.)
They had breakfast at 9 o’clock. (NOT They had a breakfast at 9 o'clock.)
(Some words don't have an article. We don't usually use articles for countries, meals or people.)"""

我們只需要呼叫 nltk 的函式便可以簡單地進行斷句:

sentences = nltk.sent_tokenize(text)

 

《Word Segmentation (斷詞)》

考量到後續進行的工作,斷詞我們得從原先斷句的輸出開始進行。

tokens = [tokenizer.tokenize(sent) for sent in sentences]

這樣就完成了基本斷詞的工作,這樣還沒有結束,我們可能還得考慮進行所謂的『字型還原』、『停用詞』等等的工作。


 

pos (詞性標記)》

但在進行『字型還原』跟『停用詞』之前,也許我們應該先進行 pos『詞性標記』的工作——若是在字型還原了以後,很有可能我們分析的詞性會出現問題,而且,要進行良好的字型還原,我們也需要這個詞在文本中的詞性(等一下會在程式碼中看到)。

故我們先進行 pos 的工作。

pos = [nltk.pos_tag(token) for token in tokens]

 

《Lemmatization (字型還原)》

字型還原的程式比較長,也許是我寫得不怎麼精簡,請各位多多包涵。

wordnet_pos = []

for pos in pos_sent:
    for word, tag in pos:
        if tag.startswith('J'):
            wordnet_pos.append(wordnet.ADJ)
        elif tag.startswith('V'):
            wordnet_pos.append(wordnet.VERB)
        elif tag.startswith('N'):
            wordnet_pos.append(wordnet.NOUN)
        elif tag.startswith('R'):
            wordnet_pos.append(wordnet.ADV)
        else:
            wordnet_pos.append(wordnet.NOUN)

tokens = [lemmatizer.lemmatize(pos[n][0], pos=wordnet_pos[n]) for pos in pos_sent for n in range(len(pos))]

 

《StopWord (停用詞)》pos

停用詞相當簡單易懂,基本上就是 import 進 nltk 的停用詞列表,然後再用 for 迴圈將不在停用詞列表裡的詞存起來即可。

tokens = [token for token in tokens if token not in nltk_stopword]

 

《NER (命名實體辨識)》

ne_chunked_sents = [nltk.ne_chunk(tag) for tag in pos]
named_entities = []

for ne_tagged_sentence in ne_chunked_sents:
    for tagged_tree in ne_tagged_sentence:
        if hasattr(tagged_tree, 'label'):
            entity_name = ' '.join(c[0] for c in tagged_tree.leaves())
            entity_type = tagged_tree.label()
            named_entities.append((entity_name, entity_type))
            named_entities = list(set(named_entities))

ner = named_entities

 


 

文章標籤


限會員,要發表迴響,請先登入