[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
你可能會有興趣的文章:
限會員,要發表迴響,請先登入