在使用现成的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了,所以,全都被过滤掉了。 是的,就是这样愚蠢的错误。
相信很多盆友都用过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。
sklearn 对数据预处理很有帮助 比如:sklearn.model_selection 里的 train_test_split,可以分数据集。(妈妈再也不用担心我手动分数据集啦) (之后有空再详说)
