參考csdn
1.句子分割 text_to_word_sequence
keras.preprocessing.text.text_to_word_sequence(text, filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n', lower=True, split=" ")
本函數將一個句子拆分成單詞構成的列表。使用filters參數中定義的標點符號和split參數中定義的分隔符作為分割句子的標准。
text_to_word_sequence,將文本轉換為一個字符序列,即將文本轉換為序列(即單詞在字典中的下標構成的列表,從1算起)。
參數:
text:字符串,待處理的文本
filters:需要濾除的字符的列表或連接形成的字符串,例如標點符號。
默認值為 '!"#$%&()*+,-./:;<=>?@[]^_`{|}~\t\n',包含標點符號,制表符和換行符等。
lower:布爾值,是否將序列設為小寫形式
split:字符串,單詞的分隔符,如空格
返回值:字符串列表
>>> import keras
>>> text="我愛你!!你愛我么??"
>>> keras.preprocessing.text.text_to_word_sequence(text, filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n', lower=True, split=" ")
['我愛你', '你愛我么']
>>> text="好好學習,天天向上!!"
>>> keras.preprocessing.text.text_to_word_sequence(text, filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n', lower=True, split=" ")
['好好學習', '天天向上']
#使用了中文形式的標點符號,因此filters參數中也應加上中文形式的標點符號,才能正常分割句子
>>> text="好好學習,天天向上!!"
>>> keras.preprocessing.text.text_to_word_sequence(text, filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n,!', lower=True, split=" ")
['好好學習', '天天向上']
2.one-hot編碼
keras.preprocessing.text.one_hot(text, n, filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n', lower=True, split=" ")
本函數將一段文本編碼為one-hot形式的碼,即僅記錄詞在詞典中的下標。
從定義上,當字典長為n時,每個單詞應形成一個長為n的向量,其中僅有單詞本身在字典中下標的位置為1,其余均為0,這稱為one-hot。
為了方便起見,函數在這里僅把“1”的位置,即字典中詞的下標記錄下來。
這個函數表示把一個string的文本編碼成一個index的list,這里的index指的是在字典中的index。字典的規模可以制定,就是n。
使用filters參數中定義的標點符號和split參數中定義的分隔符作為分割句子的標准。
one_hot,對字符串序列進行獨熱編碼。所謂的獨熱編碼就是在整個文本中,根據字符出現的次數進行排序,以序號作為字符的索引構成詞頻字典,
在一個字典長度的全零序列中將序號對應的元素置1來表示序號的編碼。比如“我”的序號是5,全字典長度為10,
那么“我”的獨熱編碼為[0,0,0,0,1,0,0,0,0,0]。
參數:
text:字符串,待處理的文本
n:整數,字典長度
filters:需要濾除的字符的列表或連接形成的字符串,例如標點符號。
默認值為 '!"#$%&()*+,-./:;<=>?@[]^_`{|}~\t\n',包含標點符號,制表符和換行符等。
lower:布爾值,是否將序列設為小寫形式
split:字符串,單詞的分隔符,如空格
返回值:整數列表,每個整數是[1,n]之間的值,代表一個單詞(不保證唯一性,即如果詞典長度不夠,不同的單詞可能會被編為同一個碼)。
>>> import keras
#使用filters參數中定義的標點符號和split參數中定義的分隔符把句子進行分割之后,n為字典長度,每個被分割出來的單詞先是被one-hot化,
#相同的單詞具有相同的one-hot碼,其中單詞會被放到字典中,單詞在字典中的索引index作為one-hot向量中值為1的索引index,
#函數返回值便是這個單詞在one-hot向量中值為1的索引index,也同樣為單詞在字典中的索引index,最終封裝為列表返回全部單詞的索引。
>>> text='Near is a good name, you should always be near to someone to save'
>>> keras.preprocessing.text.one_hot(text, 20, filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n', lower=True, split=" ")
[19, 12, 8, 15, 1, 4, 9, 14, 13, 19, 15, 3, 15, 12]
3.特征哈希hashing_trick
keras.preprocessing.text.hashing_trick(text, n, hash_function=None, filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n', lower=True, split=' ')
將文本轉換為固定大小的哈希空間中的索引序列。
hashing_trick,對文本或者字符串進行哈希計算,將計算所得的哈希值作為存儲該文本或者字符串的索引。
參數
text:字符串,待處理的文本
n: 哈希空間的維度
hash_function: 默認為 python hash 函數, 可以是 'md5' 或任何接受輸入字符串, 並返回 int 的函數。
注意 hash 不是一個穩定的哈希函數, 因此在不同執行環境下會產生不同的結果, 作為對比, 'md5' 是一個穩定的哈希函數。
filters:需要濾除的字符的列表或連接形成的字符串,例如標點符號。
默認值為 '!"#$%&()*+,-./:;<=>?@[]^_`{|}~\t\n',包含標點符號,制表符和換行符等。
lower:布爾值,是否將序列設為小寫形式
split:字符串,單詞的分隔符,如空格
返回值:整數列表
>>> import keras
>>> text='Near is a good name, you should always be near to someone to save'
>>> keras.preprocessing.text.hashing_trick(text, 20, hash_function='md5', filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n', lower=True, split=' ')
[5, 19, 14, 15, 15, 3, 13, 12, 7, 5, 6, 16, 6, 11]
4.填充序列pad_sequences
keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None, dtype='int32', padding='pre', truncating='pre', value=0.)
將長為nb_samples的序列(標量序列)轉化為形如(nb_samples,nb_timesteps)2D numpy array。
如果提供了參數maxlen,nb_timesteps=maxlen,否則其值為最長序列的長度。其他短於該長度的序列都會在后部填充0以達到該長度。
長於nb_timesteps的序列將會被截斷,以使其匹配目標長度。padding和截斷發生的位置分別取決於padding和truncating.
參數
sequences:浮點數或整數構成的兩層嵌套列表
maxlen:None或整數,為序列的最大長度。大於此長度的序列將被截短,小於此長度的序列將在后部填0.
dtype:返回的numpy array的數據類型
padding:‘pre’或‘post’,確定當需要補0時,在序列的起始還是結尾補
truncating:‘pre’或‘post’,確定當需要截斷序列時,從起始還是結尾截斷
value:浮點數,此值將在填充時代替默認的填充值0
返回值
返回形如(nb_samples,nb_timesteps)的2D張量
5.tensorflow中的分詞器Tokenizer
enc_vocab_size = 20000
tokenizer = tf.keras.preprocessing.text.Tokenizer(num_words=enc_vocab_size, oov_token=3)
tokenizer.fit_on_texts(texts)
tensor = tokenizer.texts_to_sequences(texts)
Tokenizer,一個將文本進行數字符號化的方法類,在進行神經網絡訓練時需要輸入的數據是數值,因此需要將文本字符轉換為可進行數學計算的數值。
在這個方法類中提供了fit_on_sequences、fit_on_texts、get_config、sequences_to_matrix、sequences_to_texts和sequences_to_texts_generator等方法。
在使用Tokenizer時,可以配置如下參數。
• num_words:配置符號化的最大數量。
• filters:配置需要過濾的文本符號,比如逗號、中括號等。
• lower:配置是否需要將大寫全部轉換為小寫。這個配置是相對於英文來說的,中文不存在大小寫的問題。
• split:配置進行分割的分隔符。
• char_level:配置字符串的級別。如果配置為True,那么每個字符都會作為一個token。
• oov_token:配置不在字典中的字符的替換數字,一般使用“3”這個數字來代替在字典中找不到的字符。
6.keras中的分詞器Tokenizer
keras.preprocessing.text.Tokenizer(num_words=None, filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n', lower=True, split=" ", char_level=False)
Tokenizer是一個用於向量化文本,或將文本轉換為序列(即單詞在字典中的下標構成的列表,從1算起)的類。
1.參數:
num_words: None或整數,處理的最大單詞數量。若被設置為整數,則分詞器將被限制為待處理數據集中最常見的num_words個單詞
filters:需要濾除的字符的列表或連接形成的字符串,例如標點符號。
默認值為 '!"#$%&()*+,-./:;<=>?@[]^_`{|}~\t\n',包含標點符號,制表符和換行符等。
lower:布爾值,是否將序列設為小寫形式
split:字符串,單詞的分隔符,如空格
char_level: 如果為 True, 每個字符將被視為一個標記
2.類方法
fit_on_texts(texts)
texts:要用以訓練的文本列表
texts_to_sequences(texts)
texts:待轉為序列的文本列表
返回值:序列的列表,列表中每個序列對應於一段輸入文本
texts_to_sequences_generator(texts)
本函數是texts_to_sequences的生成器函數版
texts:待轉為序列的文本列表
返回值:每次調用返回對應於一段輸入文本的序列
texts_to_matrix(texts, mode):
texts:待向量化的文本列表
mode:‘binary’,‘count’,‘tfidf’,‘freq’之一,默認為‘binary’
返回值:形如(len(texts), nb_words)的numpy array
fit_on_sequences(sequences):
sequences:要用以訓練的序列列表
sequences_to_matrix(sequences):
sequences:待向量化的序列列表
mode:‘binary’,‘count’,‘tfidf’,‘freq’之一,默認為‘binary’
返回值:形如(len(sequences), nb_words)的numpy array
3.屬性
Tokenizer對象.word_counts: 獲取字典{單詞:單詞出現次數},將單詞(字符串)映射為它們在訓練期間出現的次數。僅在調用fit_on_texts之后設置。
Tokenizer對象.word_docs: 獲取字典{單詞:單詞出現次數},將單詞(字符串)映射為它們在訓練期間所出現的文檔或文本的數量。僅在調用fit_on_texts之后設置。
Tokenizer對象.word_index: 獲取字典{單詞:單詞在字典中的索引值},將單詞(字符串)映射為它們的排名或者索引。僅在調用fit_on_texts之后設置。
Tokenizer對象.index_word[index]: 獲取單詞(字符串),根據傳入單詞所在字典中的索引值來獲取該單詞。
Tokenizer對象.word_index[word]: 獲取單詞在字典中的索引值,根據傳入單詞,獲取單詞所在字典中的索引值。
Tokenizer對象.document_count: 獲取整數。分詞器被訓練的文檔(文本或者序列)數量。僅在調用fit_on_texts或fit_on_sequences之后設置。
>>> import keras
>>> tokenizer = keras.preprocessing.text.Tokenizer(num_words=10, filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n', lower=True, split=" ", char_level=False)
>>> text = ["今天 北京 下雨 了", "我 今天 加班"]
>>> tokenizer.fit_on_texts(text)
>>> tokenizer.word_counts
OrderedDict([('今天', 2), ('北京', 1), ('下雨', 1), ('了', 1), ('我', 1), ('加班', 1)])
>>> tokenizer.word_docs
defaultdict(<class 'int'>, {'下雨': 1, '了': 1, '今天': 2, '北京': 1, '加班': 1, '我': 1})
#word_index返回每個被分割的單詞在字典中的索引值,從1算起。
>>> tokenizer.word_index
{'今天': 1, '北京': 2, '下雨': 3, '了': 4, '我': 5, '加班': 6}
>>> tokenizer.document_count
2
#texts_to_sequences返回每個被分割的單詞在字典中的索引值,從1算起。
#每個句子對應一個列表,每個列表中元素值為該句子中的單詞在字典中的索引值。
>>> tokenizer.texts_to_sequences(text)
[[1, 2, 3, 4], [5, 1, 6]]
#每個句子所轉換為列表,如果列表中單詞所對應的索引值數量不滿maxlen,則默認補0,可指定padding='post'在后面做填充
>>> keras.preprocessing.sequence.pad_sequences(tokenizer.texts_to_sequences(text), maxlen=10, padding='post')
array([[1, 2, 3, 4, 0, 0, 0, 0, 0, 0],
[5, 1, 6, 0, 0, 0, 0, 0, 0, 0]])
真的知識不容許你太快了還是扎實一些,一步一個腳印吧