自然語言處理 | NLTK英文分詞嘗試

官方文檔:Natural Language Toolkit — NLTK 3.3 documentation

NLTK是一個高效的Python構建的平臺晤锹,用來處理自然語言數(shù)據(jù)奸披,它提供了易于使用的接口捂贿,通過這些接口可以訪問超過50個語料庫和詞匯資源(如WordNet)纳寂,還有一套用于分類衫哥、標記化士袄、詞干標記悲关、解析和語義推理的文本處理庫。NLTK可以在Windows娄柳、Mac OS以及Linux系統(tǒng)上使用寓辱。

1.安裝NLTK

使用pip install nltk命令安裝NLTK庫,NLTK中集成了語料與模型等的包管理器赤拒,通過在python解釋器中執(zhí)行以下代碼

import nltk
nltk.download()

便會彈出包管理界面秫筏,在管理器中可以下載語料,預訓練的模型等挎挖。

除了一些個人數(shù)據(jù)包還可以下載整個集合(使用“all”)这敬,或者僅下載書中例子和練習中使用到的數(shù)據(jù)(使用“book”),或者僅下載沒有語法和訓練模型的語料庫(使用“all-corpora”)蕉朵。

2.簡單文本分析

參考:NLTK學習之一:簡單文本分析 - CSDN博客
基本功能:

  • 分詞
  • 詞性標注
  • 命名實體識別
import nltk

#先分句再分詞
sents = nltk.sent_tokenize("And now for something completely different. I love you.")
word = []
for sent in sents:
    word.append(nltk.word_tokenize(sent))
print(word)

#分詞
text = nltk.word_tokenize("And now for something completely different.")
print(text)
#詞性標注
tagged = nltk.pos_tag(text)
print (tagged[0:6])
#命名實體識別
entities = nltk.chunk.ne_chunk(tagged)
print (entities)

>>>[['And', 'now', 'for', 'something', 'completely', 'different', '.'], ['I', 'love', 'you', '.']]
>>>['And', 'now', 'for', 'something', 'completely', 'different', '.']
>>>[('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'), ('completely', 'RB'), ('different', 'JJ')]
>>>(S And/CC now/RB for/IN something/NN completely/RB different/JJ ./.)

3.詞的概率分布類FreqDist

參考:使用Python+NLTK實現(xiàn)英文單詞詞頻統(tǒng)計 - CSDN博客
NLTK之詞頻 - CSDN博客

1.利用NLTK的FreqDist方法獲取在文本中每個出現(xiàn)的標識符的頻數(shù):

import nltk
from nltk.book import *

# 打開文件
f = open("D:\\App\\test.txt","r")
text = ""
line = f.readline()
while line:
    text += line
    line = f.readline()
f.close()
text1 = nltk.word_tokenize(text)
# 或者
text1 = nltk.word_tokenize("And now for something completely different. I love you. This is my friend. You are my friend.")

# FreqDist()獲取在文本中每個出現(xiàn)的標識符的頻率分布
fdist = FreqDist(text1)
print(fdist)
# 詞數(shù)量
print(fdist.N())
# 不重復詞的數(shù)量
print(fdist.B())

>>><FreqDist with 16 samples and 21 outcomes>
21
16

2.獲取頻率&頻數(shù):

# 獲取頻率
print(fdist.freq('friend') * 100)
# 獲取頻數(shù)
print(fdist['friend'])
#出現(xiàn)次數(shù)最多的詞
fdist.max()

>>>9.523809523809524
2
'.'

3.繪制前5個標識符崔涂,并出現(xiàn)次數(shù)累加:

fdist.tabulate(5, cumulative=True)
# 繪圖
fdist.plot(5,cumulative=True) 

>>>    .    my   friend  And  now 
       4     6     8      9   10 

4.詞組統(tǒng)計:

text = "I want go to the Great Wall. This is my friend. You are my friend. The Great Wall in China."
text1 = nltk.word_tokenize(text)

bgrams = nltk.bigrams(text1)     #返回一個generate
bgfdist = FreqDist(list(bgrams))    #返回搭配的頻率
bgfdist.plot(10)   #查看前10個出現(xiàn)頻率最高的搭配

4.詞形還原

但是統(tǒng)計英文詞頻需要考慮到詞形變化,例如move和moved始衅、is和are應該歸為一個詞而不應該分為兩個詞來統(tǒng)計冷蚂,所以需要對各種形式的單詞進行詞形還原(lemmatization)。

其中詞形還原需要用到NLTK汛闸。在NLTK中蝙茶,tag用來描述一個單詞的詞性(含詞形、時態(tài)等概念)诸老,分詞結果傳入nltk.pos_tag方法隆夯,可以獲得每一個單詞的詞性,如:('John', 'NNP')表示”John”的詞性是NNP(Proper noun, singular)别伏,即專有名詞單數(shù)吮廉。
進行詞形還原并統(tǒng)計詞頻的完整代碼:

import sys,re,collections,nltk
from nltk.stem.wordnet import WordNetLemmatizer
from nltk.tokenize import word_tokenize

# 正則表達式過濾特殊符號用空格符占位,雙引號畸肆、單引號宦芦、句點、逗號
pat_letter = re.compile(r'[^a-zA-Z \']+')
# 還原常見縮寫單詞
pat_is = re.compile("(it|he|she|that|this|there|here)(\'s)", re.I)
pat_s = re.compile("(?<=[a-zA-Z])\'s") # 找出字母后面的字母
pat_s2 = re.compile("(?<=s)\'s?")
pat_not = re.compile("(?<=[a-zA-Z])n\'t") # not的縮寫
pat_would = re.compile("(?<=[a-zA-Z])\'d") # would的縮寫
pat_will = re.compile("(?<=[a-zA-Z])\'ll") # will的縮寫
pat_am = re.compile("(?<=[I|i])\'m") # am的縮寫
pat_are = re.compile("(?<=[a-zA-Z])\'re") # are的縮寫
pat_ve = re.compile("(?<=[a-zA-Z])\'ve") # have的縮寫

lmtzr = WordNetLemmatizer()

def replace_abbreviations(text):
    new_text = text
    new_text = pat_letter.sub(' ', text).strip().lower()
    new_text = pat_is.sub(r"\1 is", new_text)
    new_text = pat_s.sub("", new_text)
    new_text = pat_s2.sub("", new_text)
    new_text = pat_not.sub(" not", new_text)
    new_text = pat_would.sub(" would", new_text)
    new_text = pat_will.sub(" will", new_text)
    new_text = pat_am.sub(" am", new_text)
    new_text = pat_are.sub(" are", new_text)
    new_text = pat_ve.sub(" have", new_text)
    new_text = new_text.replace('\'', ' ')
    return new_text

# pos和tag有相似的地方轴脐,通過tag獲得pos
def get_wordnet_pos(treebank_tag):
    if treebank_tag.startswith('J'):
        return nltk.corpus.wordnet.ADJ
    elif treebank_tag.startswith('V'):
        return nltk.corpus.wordnet.VERB
    elif treebank_tag.startswith('N'):
        return nltk.corpus.wordnet.NOUN
    elif treebank_tag.startswith('R'):
        return nltk.corpus.wordnet.ADV
    else:
        return ''

def merge(words):
    new_words = []
    for word in words:
        if word:
            tag = nltk.pos_tag(word_tokenize(word)) # tag is like [('bigger', 'JJR')]
            pos = get_wordnet_pos(tag[0][1])
            if pos:
                # lemmatize()方法將word單詞還原成pos詞性的形式
                lemmatized_word = lmtzr.lemmatize(word, pos)
                new_words.append(lemmatized_word)
            else:
                new_words.append(word)
    return new_words

def get_words(file):  
    with open (file) as f:  
        words_box=[]
        # pat = re.compile(r'[^a-zA-Z \']+') # 過濾特殊符號
        for line in f:                           
            #if re.match(r'[a-zA-Z]*',line): 
            #    words_box.extend(line.strip().strip('\'\"\.,').lower().split())
            # words_box.extend(pat.sub(' ', line).strip().lower().split())
            words_box.extend(merge(replace_abbreviations(line).split()))
    return collections.Counter(words_box) # 返回單詞和詞頻

def append_ext(words):
    new_words = []
    for item in words:
        word, count = item
        tag = nltk.pos_tag(word_tokenize(word))[0][1] # tag is like [('bigger', 'JJR')]
        new_words.append((word, count, tag))
    return new_words

# 將統(tǒng)計結果寫入文件
def write_to_file(words, file="D:\\App\\result.txt"):
    f = open(file, 'w')
    for item in words:
        for field in item:
            f.write(str(field)+',')
        f.write('\n')


if __name__=='__main__':
    print ("counting...")
    words = get_words("D:\\App\\test.txt")
    print ("writing file...")
    write_to_file(append_ext(words.most_common()))

統(tǒng)計結果:

除NLTK之外调卑,stanford提供的CoreNLP自然語言處理工具包也常被使用抡砂,有需要的可以進一步了解。

  • 官網地址:http://stanfordnlp.github.io/CoreNLP/
  • CoreNLP版本:3.9.1恬涧,下載stanford-corenlp-full-2018-02-27.zip壓縮包
  • 功能:
    • 分詞(tokenize)注益、分句(split)
    • 詞性標注(pos)
    • 詞形還原(lemma)
    • 命名實體識別(ner)
    • 語法解析(parse)
    • 情感分析(sentiment)
  • 支持語言:中文、英文溯捆、法語丑搔、德語、西班牙語提揍、阿拉伯語等啤月。
  • 編程要求:Java1.8+
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市劳跃,隨后出現(xiàn)的幾起案子谎仲,更是在濱河造成了極大的恐慌,老刑警劉巖刨仑,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郑诺,死亡現(xiàn)場離奇詭異,居然都是意外死亡杉武,警方通過查閱死者的電腦和手機辙诞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轻抱,“玉大人飞涂,你說我怎么就攤上這事∈穑” “怎么了封拧?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵志鹃,是天一觀的道長夭问。 經常有香客問我,道長曹铃,這世上最難降的妖魔是什么缰趋? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮陕见,結果婚禮上秘血,老公的妹妹穿的比我還像新娘。我一直安慰自己评甜,他們只是感情好灰粮,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忍坷,像睡著了一般粘舟。 火紅的嫁衣襯著肌膚如雪熔脂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天柑肴,我揣著相機與錄音霞揉,去河邊找鬼。 笑死晰骑,一個胖子當著我的面吹牛适秩,可吹牛的內容都是我干的。 我是一名探鬼主播硕舆,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼秽荞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了岗宣?” 一聲冷哼從身側響起蚂会,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耗式,沒想到半個月后胁住,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡刊咳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年彪见,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娱挨。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡余指,死狀恐怖,靈堂內的尸體忽然破棺而出跷坝,到底是詐尸還是另有隱情酵镜,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布柴钻,位于F島的核電站淮韭,受9級特大地震影響,放射性物質發(fā)生泄漏贴届。R本人自食惡果不足惜靠粪,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毫蚓。 院中可真熱鬧占键,春花似錦、人聲如沸元潘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翩概。三九已至牲距,卻和暖如春袖订,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嗅虏。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工洛姑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人皮服。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓楞艾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親龄广。 傳聞我的和親對象是個殘疾皇子硫眯,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容