1. 程式人生 > >NLTK學習筆記(三):NLTK的一些工具

NLTK學習筆記(三):NLTK的一些工具

ast 關註 code 值範圍 通過 自動 ive 叠代器 emma

主要總結一下簡單的工具:條件頻率分布、正則表達式、詞幹提取器和歸並器。


條件分布頻率

《自然語言學習》很多地方都用到了條件分布頻率,nltk提供了兩種常用的接口:FreqDistConditionalFreqDist 。後面很多都會用到這兩種方法,特別是第二個。因為第二個更符合定義,會智能的找到條件。
然後根據繪圖的庫,可以做出來很漂亮的圖形。

簡單的FreqDist

函數接收list類型的參數後,會自動創建字典,生成對應的值為鍵值,而value就是元素的次數。

from nltk import *
tem = [‘hello‘,‘world‘,‘hello‘,‘dear‘]
print(FreqDist(tem))
out:
FreqDist({‘dear‘: 1, ‘hello‘: 2, ‘world‘: 1})

通過 plot(TopK,cumulative=True)tabulate() 可以繪制對應的折線圖和表格(必須安裝matplotlib庫)

條件分布ConditionalFreqDist

以一個配對鏈表作為輸入,需要給分配的每個事件關聯一個條件,輸入時類似於 (條件,事件) 的元組。之後的工作交給nltk就可以了,更多的精力可以用來關註上層邏輯。

import nltk
from nltk.corpus import brown
cfd = nltk.ConditionalFreqDist((genre,word) for genre in brown.categories() for word in brown.words(categories=genre))
print("conditions are:",cfd.conditions()) #查看conditions
print(cfd[‘news‘])
print(cfd[‘news‘][‘could‘])#類似字典查詢
out:
conditions are: [‘adventure‘, ‘belles_lettres‘, ‘editorial‘, ‘fiction‘, ‘government‘, ‘hobbies‘, ‘humor‘, ‘learned‘, ‘lore‘, ‘mystery‘, ‘news‘, ‘religion‘, ‘reviews‘, ‘romance‘, ‘science_fiction‘]
<FreqDist with 14394 samples and 100554 outcomes>
86

尤其對於plot()tabulate() 有了更多參數選擇:

  • conditions:指定條件
  • samples:叠代器類型,指定取值範圍
  • cumulative:設置為True可以查看累積值
cfd.tabulate(conditions=[‘news‘,‘romance‘],samples=[‘could‘,‘can‘])
cfd.tabulate(conditions=[‘news‘,‘romance‘],samples=[‘could‘,‘can‘],cumulative=True)
        could   can 
news    86    93 
romance   193    74 

        could   can 
news    86   179 
romance   193   267 

正則表達式及其應用

記錄正則表達式在自然語言中的應用。

輸入法聯想提示(9宮格輸入法)

查找類似於hole和golf序列(4653)的單詞。

import re
from nltk.corpus import words
wordlist = [w for w in words.words(‘en-basic‘) if w.islower()]
same = [w for w in wordlist if re.search(r‘^[ghi][mno][jlk][def]$‘,w)]
print(same)

只用鍵盤的一部分搜索就是手指繞口令。例如:^[ghijklmno]+$等。像[^aeiouAEIOU]就是匹配除元音外的所有字母。

尋找字符塊

查找兩個或兩個以上的元音序列,並且確定相對頻率。

import nltk
wsj = sorted(set(nltk.corpus.treebank.words()))
fd = nltk.FreqDist(vs for word in wsj for vs in re.findall(r‘[aeiou]{2,}‘,word))
fd.items()

而且,我們也可以輔音元音序列。

查找詞幹

apples和apple對比中,apple就是詞幹。寫一個簡單腳本來查詢詞幹。

def stem(word):
    for suffix in [‘ing‘,‘ly‘,‘ed‘,‘ious‘,‘ies‘,‘ive‘,‘es‘,‘s‘,‘ment‘]:
        if word.endswith(suffix):
            return word[:-len(suffix)]
    return None

而使用正則表達式,只需要一行:

re.findall(r‘^(.*?)(ing|ly|ed|ious|ies|ive|es|s|ment)$‘,word)

詞幹提取器和歸並器

nltk提供了PorterStemmerLancasterStemmer兩個詞幹提取器,Porter比較好,可以處理lying這樣的單詞。

porter = nltk.PorterStemmer()
print(porter.stem(‘lying‘))

如果需要處理women這樣的詞,需要詞性歸並器:WordNetLemmatizer

wnl = nltk.WordNetLemmatizer()
print(wnl.lemmatize(‘women‘))

利用詞幹提取器實現索引文本(concordance)

利用到nltk.Index這個函數,nltk.Index((word , i) for (i,word) in enumerate([‘a‘,‘b‘,‘a‘]))

class IndexText:
    def __init__(self,stemmer,text):
        self._text = text
        self._stemmer = stemmer
        self._index = nltk.Index((self._stem(word),i) for (i,word) in enumerate(text))
    def _stem(self,word):
        return self._stemmer.stem(word).lower()
    def concordance(self,word,width =40):
        key = self._stem(word)
        wc = width/4 #words of context
        for i in self._index[key]:
            lcontext = ‘ ‘.join(self._text[int(i-wc):int(i)])
            rcontext = ‘ ‘.join(self._text[int(i):int(i+wc)])
            ldisplay = ‘%*s‘ % (width,lcontext[-width:])
            rdisplay = ‘%-*s‘ % (width,rcontext[:width])
            print(ldisplay,rdisplay)
porter = nltk.PorterStemmer()
grail = nltk.corpus.webtext.words(‘grail.txt‘)
text = IndexText(porter,grail)
text.concordance(‘lie‘)

NLTK學習筆記(三):NLTK的一些工具