【火爐煉AI】機器學習037-NLP文字分塊

煉丹老頑童發表於2018-10-10

【火爐煉AI】機器學習037-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(result[0])
print(len(result[0]))
print(result[-1])
print(len(result[-1]))
複製程式碼

--------------------------------輸---------出------------------------

192427 ['[', 'Emma', 'by', 'Jane', 'Austen', '1816', ']', 'VOLUME', 'I', 'CHAPTER', 'I', 'Emma', 'Woodhouse', ',', 'handsome', ',', 'clever', ',', 'and', 'rich', ',', 'with', 'a', 'comfortable', 'home', 'and', 'happy', 'disposition', ',', 'seemed'] 30 ['more', 'the', 'intimacy', 'of', 'sisters', '.', 'Even', 'before', 'Miss', 'Taylor', 'had', 'ceased', 'to', 'hold', 'the', 'nominal', 'office', 'of', 'gover'] 19

-------------------------------------完---------------------------------

可以看出split之後的第一個元素長度是30,而最後一個元素的長度是19,並且split函式準確的將文字進行了分塊。

########################小**********結###############################

1,本例中文字分塊貌似沒有用到NLTK模組中的任何函式,只用python字串處理函式就可以。但在其他應用場景中,可能會需要更復雜的函式來完成特定的分塊功能。

2,本例中使用空格來區分一個單詞,這種分詞方式並不一定準確,可以使用前面講到的word_tokenize函式來分詞,可能更準確一些。

3,如果是中文的分塊,可以先用jieba對文字進行分詞,然後在獲取特定的單詞數來進行文字分塊,仿照上面的split函式很容易擴充套件到中文方面,此處省略。

#################################################################


注:本部分程式碼已經全部上傳到(我的github)上,歡迎下載。

參考資料:

1, Python機器學習經典例項,Prateek Joshi著,陶俊傑,陳小莉譯

相關文章