精通Python自然語言處理 1 :字串操作

CopperDong發表於2018-05-28

程式碼  https://github.com/PacktPublishing/Mastering-Natural-Language-Processing-with-Python

1、切分

    將文字分割成更小的並被稱作識別符號的模組的過程。sent_tokenize函式使用了NLTK包的一個叫PunktSentenceTokenizer類的例項。基於那些可以標記句子開始和結束的字母和標記符號,這個歌例項已經被訓練用於對不同的歐洲語言執行切分。

import nltk
text=" Welcom readers. I hope you find it interesting. Please do reply."
from nltk.tokenize import sent_tokenize
sent_tokenize(text)
Out[4]: [' Welcom readers.', 'I hope you find it interesting.', 'Please do reply.']

切分大批量的句子,可以載入PunktSentenceTokenizer並使用其tokenize()函式,也可載入其它語言

tokenizer=nltk.data.load('tokenizers/punkt/english.pickle')  # french.pickle
tokenizer.tokenize(text)

將句子切分為單詞,使用word_tokenize()函式,其使用NLTK包的一個叫TreebankWordTokenizer類的例項

text=nltk.word_tokenize("I hope you find it interesting.")
print(text)
['I', 'hope', 'you', 'find', 'it', 'interesting', '.']

通過分離縮略詞來實現切分

text=nltk.word_tokenize("Don't hesitate to ask questions")
print(text)
['Do', "n't", 'hesitate', 'to', 'ask', 'questions']
還可以通過載入TreebankWordTokenizer,然後呼叫tokenzie()函式來完成。
from nltk.tokenize import TreebankWordTokenizer
tokenizer = TreebankWordTokenizer()
tokenizer.tokenize("Have a nice day. I hope you find the book interesting")
Out[14]: 
['Have',
 'a',
 'nice',
 'day.',
  ...

另一個通過分離標點來切分的PunktWordTokenizer,還有一個分詞器是WordPunctTokenizer,通過將標點轉化為一個全新的識別符號來實現切分:

from nltk.tokenize import WordPunctTokenizer
tokenizer = WordPunctTokenizer()
tokenizer.tokenize("Don't hesitate to ask questions")
Out[17]: ['Don', "'", 't', 'hesitate', 'to', 'ask', 'questions']

分詞器的繼承樹:


使用正規表示式實現切分:P20,通過匹配單詞與匹配空格或間隔的方法

from nltk.tokenize import RegexpTokenizer
tokenizer=RegexpTokenizer("[\w]+")
tokenizer.tokenize("Don't hesitate to ask questions")
Out[20]: ['Don', 't', 'hesitate', 'to', 'ask', 'questions']

2、標準化

    主要涉及消除標點符號、轉為大寫或小寫、數字轉換成單詞、擴充套件縮略詞、文字的規範化等操作

    消除標點

    文字的大小寫轉換:

    處理停止詞:需要被過濾掉的詞,因為這些詞對理解句子的整體意思沒有多大的意義。搜尋引擎通過去除停止詞來工作,以便縮小搜尋範圍。可從nltk_data/corpora/stopwords中訪問停止詞列表

from nltk.corpus import stopwords
stops = set(stopwords.words('english'))
words = ["Don't", "hesitate", "to", "ask", "questions"]
[word for word in words if word not in stops]
Out[28]: ["Don't", 'hesitate', 'ask', 'questions']

3、替換和校正識別符號

    使用正規表示式替換單詞:

    用單詞的同義詞替換

4、在文字上應用Zipf定律

    Zipf定律指出,文字中識別符號出現的頻率與其在排序列表中的排名或位置成反比。該定律描述了識別符號在語言中是如何分佈的:一些識別符號非常頻繁地出現,另一些出現頻率較低,還有一些基本上不出現。

import nltk
from nltk.corpus import gutenberg
from nltk.probability import FreqDist
import matplotlib
import matplotlib.pyplot as plt 
matplotlib.use('TkAgg')
fd = FreqDist()
for text in gutenberg.fileids():
	for word in gutenberg.words(text):
		fd[word] += 1

ranks = []
freqs = []
for rank, word in enumerate(fd):
	ranks.append(rank+1)
	freqs.append(fd[word])

plt.loglog(ranks, freqs)
plt.xlabel('frequency(f)', fontsize=14, fontweight='bold')
plt.ylabel('rank(r)', fontsize=14, fontweight='bold')
plt.grid(True)
plt.show()


5、相似性度量

    ntlk.metrics包用於提供各種評估或相似性度量

    使用編輯距離演算法:

    使用Jaccard係數

    使用Smith Waterman距離

    其它字串相似性度量

     

相關文章