今天总结

第一个大坑 – word2vec

在使用现成的API或者package,一定要先弄清楚其属性。不然就会像最近两天,跌进大坑,爬都爬不出来。
这里写图片描述

import gensim
sentences = word2vec.Text8Corpus(u'corpus.txt')  # 加载语料
model = word2vec.Word2Vec(sentences, min_count=8)  # 训练skip-gram模型,默认window=5
model.save(u'txt.model')#训练好了存起来,之后可以直接加载
print(model.wv.vocab)#获取训练的词

我测试的时候,总是会报错:
这里写图片描述
错误提示,在训练模型之前,要先构建词库(you must first build vocabulary before using the model)。

查看corpus.txt,里面有词呀。
是我的词不够多?可是一句话也能用啊。
是我的数据没有用nltk处理?直接处理一个string也行啊。
到底发生了什么?这里面有啥问题?
这里写图片描述

女大学生退学未遂,原因竟然是它!

model = word2vec.Word2Vec(sentences, min_count=8)  # 训练skip-gram模型,默认

最开始我的语料是用nltk处理的,在去停用词、分词、取词干之后的字符串,作为了训练语料,这是没问题的。后来我将进一步处理后(删掉了低频词)的字符串,作为输入,就报错了。
前者的字符串,有重复的字符串,后者的字符串,没有重复的字符串,相当于每一个词的词频都是1了,所以,全都被过滤掉了。
是的,就是这样愚蠢的错误。
这里写图片描述

Keng 2–nltk

相信很多盆友都用过nltk做数据预处理。

disease_List = nltk.word_tokenize(str(all_words).lower())#转为小写,分词
filtered_txt = [w for w in disease_List if (w not in english_stopwords)]#去停用词
filtered_txt = [w for w in filtered_txt if (w not in english_punctuations)]  #del punctuations去标点符号和一些特殊字符
stemmed_txt = [stemmer.stem(w) for w in filtered_txt]#取词干
all_words_freq = collections.Counter(stemmed_txt).most_common()#统计词频

最后的输出里会有

'occasionally\\\\controversi'
'\\\\which'
'dwindling\\\\band'
'29'
'2005'

是的,你没有看错,就这样阵容强大的预处理,也无法阻挡花样百出的文本。
后来查才知道原来python里有可以判断是不是字符,是不是数字,是不是数字字母组合的函数

stemmed_txt = [w for w in stemmed_txt if (w.isalpha())]#判断是不是字符

加上这一句就可以完全过滤上述的文本了。

另外值得注意的是

stemmed_txt = [w for w in stemmed_txt if (w.isalpha())]

nltk.stem.PorterStemmer() 取词干之后,不是普通那种wanted 变成want的形式,而是service变成servic,以及company变为compan。

Keng 3

sklearn 对数据预处理很有帮助
比如:sklearn.model_selection 里的 train_test_split,可以分数据集。(妈妈再也不用担心我手动分数据集啦)
(之后有空再详说)

猜你喜欢

转载自blog.csdn.net/heheSakura/article/details/80008782
今日推荐