分詞器你真的搞明白了嘛


參考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]])

真的知識不容許你太快了還是扎實一些,一步一個腳印吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM