特征提取
一.分词
1.正向最大匹配法
分词目标:
在词典中进行扫描,尽可能地选择与词典中最长单词匹配的词作为目标分词,然后进行下一次匹配。
算法流程:
a.扫描字典,测试读入的子串是否在字典中
b.如果存在,则从输入中删除掉该子串,重新按照规则取子串,重复a
c.如果不存在于字典中,则从右向左减少子串长度,重复a
2.逆向最大匹配法
分词目标:
在词典中进行扫描,尽可能地选择与词典中最长单词匹配的词作为目标分词,然后进行下一次匹配。在实践中,逆向最大匹配算法性能优于正向最大匹配算法。
算法流程:
a.扫描字典,测试读入的子串是否在字典中
b.如果存在,则从输入中删除掉该子串,重新按照规则取子串,重复a
c.如果不存在于字典中,则从左向右减少子串长度,重复a
3.双向最大匹配法
分词目标:
将正向最大匹配算法和逆向最大匹配算法进行比较,从而确定正确的分词方法。
算法流程:
a.比较正向最大匹配和逆向最大匹配结果
b.如果分词数量结果不同,那么取分词数量较少的那个
c.如果分词数量结果相同。结果相同,可以返回任何一个;结果不同,返回单字数比较少的那个
二. 语言模型
n-gram是一种统计语言模型,用来根据前(n-1)个item来预测第n个item。
unigram 一元分词,把句子分成一个一个的汉字。
bigram 二元分词,把句子从头到尾每两个字组成一个词语。
trigram 三元分词,把句子从头到尾每三个字组成一个词语。
三.文本矩阵化
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