Task2

分詞的概念

正向最大匹配法

分詞思路

在詞典中進行掃描,儘可能地選擇與詞典中最長單詞匹配的詞作爲目標分詞,然後進行下一次匹配。

分詞步驟

詞典中最長的單詞爲n個,那麼最大匹配的起始子串字數也爲 n個
(1)掃描字典,測試讀入的子串是否在字典中
(2)如果存在,則從輸入中刪除掉該子串,重新按照規則取子串,重複(1)
(3)如果不存在於字典中,則從右向左減少子串長度,重複(1)

原始句子爲:
我來到北京清華大學
詞典中最長的詞條爲5個字
①從句子開頭找起,在詞典中“我來到北京”,失敗
②句子長度減一,詞典中查找“我來到北”,失敗
③重複此步驟,直到句子爲“我”,輸出“我”,句子變爲“來到北京清華大學”
④重複上述步驟
分詞結果爲"我/來到/北京/清華大學"

逆向最大匹配法

分詞思路

在句子中從後往前,逆向取詞,在詞典中進行掃描,儘可能地選擇與詞典中最長單詞匹配的詞作爲目標分詞,然後進行下一次匹配。在實踐中,逆向最大匹配算法性能優於正向最大匹配算法。

分詞步驟

假設詞典中最長的單詞爲n個,那麼最大匹配的起始子串字數也爲 5 個
(1)掃描字典,測試讀入的子串是否在字典中
(2)如果存在,則從輸入中刪除掉該子串,重新按照規則取子串,重複(1)
(3)如果不存在於字典中,則從左向右減少子串長度,重複(1)

原始句子爲:
我來到北京清華大學
詞典中最長的詞條爲5個字
①從句子後面找起,在詞典中“京清華大學”,失敗
②句子長度減一,詞典中查找“清華大學”,查找成功
③從原始句子中去掉已匹配成功的詞,即在詞典中查找“我來到北京”,失敗
④句子長度減一,詞典中查找“來到北京”,失敗
⑤句子長度減一,詞典中查找“到北京”,失敗
⑥重複上述步驟
分詞結果爲"我/來到/北京/清華大學"

雙向最大匹配法

分詞思路

將正向最大匹配算法和逆向最大匹配算法進行比較,從而確定正確的分詞方法。

分詞步驟

假設詞典中最長的單詞爲n個,那麼最大匹配的起始子串字數也爲 5 個
(1)獲取正向最大匹配結果和逆向最大匹配結果
(2)分詞結果相同的情況下,返回任意一個
(3)分詞結果不同的情況下:分詞數量不同的情況下,返回較短的結果;分詞數量相同的情況下,返回單字較少的結果

如果有一句話:
正向匹配法結果:“北京大學 / 生前 / 來 / 應聘”
逆向匹配法結果:“北京/ 大學生/ 前來 / 應聘”
根據上述規則,由於正向結果有一個單字,逆向結果沒有單字,所以取逆向結果

詞、字符頻率統計

使用python的collections.Counter可以實現

In [18]: msg = "i have a dream today, this is my dream"
In [19]: c = Counter(msg.split())
In [20]: c.most_common()
Out[20]: 
[('dream', 2),
 ('i', 1),
 ('have', 1),
 ('a', 1),
 ('today,', 1),
 ('this', 1),
 ('is', 1),
 ('my', 1)]

語言模型中unigram、bigram、trigram的概念

n-gram是一種統計語言模型,用來根據前(n-1)個item來預測第n個item。在應用層面,這些item可以是音素(語音識別應用)、字符(輸入法應用)、詞(分詞應用)或鹼基對(基因信息)。一般來講,可以從大規模文本或音頻語料庫生成n-gram模型。
unigram/bigram/trigram分別代表單個字詞、兩個字詞、三個字詞
例:
我愛我的祖國
unigram:我/愛/我/的/祖/國
bigram:我愛/愛我/我的/的祖/祖國
trigram:我愛我/愛我的/我的祖/的祖國
代碼實現

def n_gram(n,sentence):
	result = []
	len_s = len(sentence)
	if not sentence:
		return []
	for k in range(len_s):
		if k + n >len_s:
			break
		else:
			result.append(sentence[k:k+n])
	return result
def get_word_count(word_list):
	return collections.Counter(word_list)

文本矩陣化

import jieba
def get_word_count(word_list):
	return collections.Counter(word_list)

def cut_word(text):
    return list(jieba.cut(text))
	
def rm_stopword(text_list,stopwords):
	result = []
	for word in text_list:
		if word not in stopwords:
			result.append(word)
	return result

# 構建詞表	
def build_vocab(word_list,vocab_size):
	word_count = collections.Counter(word_list).most_common(vocab_size-1)
	word2index = [w:i for i,w in word_count]
	index2word = [i:w for i,w in word_count]
	return word2index,index2word

# 向量化
def vectorize(words,w2i):
	dict_len = len(w2i)
	result = []
	for word in words:
		nul = [0]*dict_len
		nul[w2i[word]] = 1
		result.append(nul)
	return result
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章