【火爐煉AI】機器學習034-NLP對文字進行分詞
(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, NLTK 3.3)
文字分塊是將一大段文字分割成幾段小文字,其目的是比如想獲取一段文字中的一小部分,或分割得到固定單詞數目的小部分等,經常用於非常大的文字。注意文字分塊和分詞不一樣,分詞的目的是把一段文字分割成單詞,而文字分塊的目的是把一大段文字分割成多個小段文字。
1. NLP文字分塊
在不用的應用中,可能需要按照不同的規則對大段文字進行分塊,此處我們需要得到單詞數相等的塊,故而可以編寫函式來實現這種規則的分塊。程式碼如下。
from nltk.tokenize import word_tokenize def split(dataset,words_num): ''' 將dataset這一整段文字分割成N個小塊, 使得每個小塊中含有單詞的數目等於words_num''' words=dataset.split(' ') # 此處用空格來區分單詞是否合適? # words=word_tokenize(dataset) # 用分詞器來分詞是否更合適一些? rows=int(np.ceil(len(words)/words_num)) # 即行數 result=[] # 預計裡面裝的元素是rows行words_num列,最後一行可能少於words_num,故不能用np.array # words是list,可以用切片的方式獲取 for row in range(rows): result.append(words[row*words_num:(row+1)*words_num]) return result 複製程式碼
然後用簡·奧斯丁的《愛瑪》中的文字作為資料集,由於這個資料集太大,長度有192427,故而我們此處只獲取前面的1000個單詞做測試。
# 測試一下 # 資料集暫時用簡·奧斯丁的《愛瑪》中的文字 dataset=nltk.corpus.gutenberg.words('austen-emma.txt') print(len(dataset)) # 192427 代表讀入正常 result=split(" ".join(dataset[:1000]), 30) # 只取前面的1000個單詞,每30個單詞分一個塊,一共有34個塊 print(len(result)) print(result[0]) print(len(result[0])) print(result[-1]) print(len(result[-1])) 複製程式碼
--------------------輸---------出--------------------------------
192427 34 ['[', 'Emma', 'by', 'Jane', 'Austen', '1816', ']', 'VOLUME', 'I', 'CHAPTER', 'I', 'Emma', 'Woodhouse', ',', 'handsome', ',', 'clever', ',', 'and', 'rich', ',', 'with', 'a', 'comfortable', 'home', 'and', 'happy', 'disposition', ',', 'seemed'] 30 ['its', 'separate', 'lawn', ',', 'and', 'shrubberies', ',', 'and', 'name', ','] 10
---------------------------完-------------------------------------
可以看出split之後的分成了34塊,第一個塊長度是30,而最後一塊的長度是10,並且split函式準確的將文字進行了分塊。
########################小**********結###############################
1,本例中文字分塊貌似沒有用到NLTK模組中的任何函式,只用python字串處理函式就可以。但在其他應用場景中,可能會需要更復雜的函式來完成特定的分塊功能。
2,本例中使用空格來區分一個單詞,這種分詞方式並不一定準確,可以使用前面講到的word_tokenize函式來分詞,可能更準確一些。
3,如果是中文的分塊,可以先用jieba對文字進行分詞,然後在獲取特定的單詞數來進行文字分塊,仿照上面的split函式很容易擴充套件到中文方面,此處省略。
#################################################################
注:本部分程式碼已經全部上傳到(ofollow,noindex"> 我的github )上,歡迎下載。
參考資料:
1, Python機器學習經典例項,Prateek Joshi著,陶俊傑,陳小莉譯