Exemple #1
0
def vector_space(stopword_path, bunch_path, space_path, train_tfidf_path=None):
    stpwrdlst = readfile(stopword_path).splitlines()
    bunch = readbunchobj(bunch_path)
    tfidfspace = Bunch(target_name=bunch.target_name,
                       label=bunch.label,
                       filenames=bunch.filenames,
                       tdm=[],
                       vocabulary={})

    if train_tfidf_path is not None:
        trainbunch = readbunchobj(train_tfidf_path)
        tfidfspace.vocabulary = trainbunch.vocabulary
        vectorizer = TfidfVectorizer(stop_words=stpwrdlst,
                                     sublinear_tf=True,
                                     max_df=0.5,
                                     vocabulary=trainbunch.vocabulary)
        tfidfspace.tdm = vectorizer.fit_transform(bunch.contents)

    else:
        vectorizer = TfidfVectorizer(stop_words=stpwrdlst,
                                     sublinear_tf=True,
                                     max_df=0.5)
        tfidfspace.tdm = vectorizer.fit_transform(bunch.contents)
        tfidfspace.vocabulary = vectorizer.vocabulary_

    writebunchobj(space_path, tfidfspace)
    print("if-idf词向量空间实例创建成功!!!")
def vector_space(filename):
    stopword_path = "upload_word_bag/hlt_stop_words.txt"
    bunch_path = "upload_word_bag/" + filename + "_set.dat"
    space_path = "upload_word_bag/" + filename + "space.dat"
    train_tfidf_path = "train_word_bag/tfdifspace.dat"
    stpwrdlst = readfile(stopword_path).splitlines()
    bunch = readbunchobj(bunch_path)
    tfidfspace = Bunch(filenames=bunch.filenames, tdm=[], vocabulary={})
    trainbunch = readbunchobj(train_tfidf_path)
    tfidfspace.vocabulary = trainbunch.vocabulary
    vectorizer = TfidfVectorizer(stop_words=stpwrdlst,
                                 sublinear_tf=True,
                                 max_df=0.5,
                                 vocabulary=trainbunch.vocabulary)
    tfidfspace.tdm = vectorizer.fit_transform(bunch.contents)

    writebunchobj(space_path, tfidfspace)
    print("if-idf词向量空间实例创建成功!!!")
def vector_space(stopword_path, bunch_path, space_path, train_tfidf_path=None):
    # 读取停用词
    stpwrdlst = readfile(stopword_path).splitlines()
    bunch = readbunchobj(bunch_path)  # 导入分词后的词向量bunch对象
    # 构建tf-idf词向量空间对象
    tfidfspace = Bunch(target_name=bunch.target_name, label=bunch.label, filenames=bunch.filenames, tdm=[],
                       vocabulary={})
    '''    
    在前面几节中,我们已经介绍了Bunch。   
    target_name,label和filenames这几个成员都是我们自己定义的玩意儿,前面已经讲过不再赘述。   
    下面我们讲一下tdm和vocabulary(这俩玩意儿也都是我们自己创建的):   
    tdm存放的是计算后得到的TF-IDF权重矩阵。
    请记住,我们后面分类器需要的东西,其实就是训练集的tdm和标签label,因此这个成员是   
    很重要的。 
    vocabulary是词典索引,例如   
    vocabulary={"我":0,"喜欢":1,"相国大人":2},这里的数字对应的就是tdm矩阵的列  
    我们现在就是要构建一个词向量空间,因此在初始时刻,这个tdm和vocabulary自然都是空的。
    如果你在这一步将vocabulary赋值了一个  
    自定义的内容,那么,你是傻逼。  
    '''
    '''  
    与下面这2行代码等价的代码是: 
    vectorizer=CountVectorizer()#构建一个计算词频(TF)的玩意儿,当然这里面不只是可以做这些 
    transformer=TfidfTransformer()#构建一个计算TF-IDF的玩意儿   
    tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus)) 
    #vectorizer.fit_transform(corpus)将文本corpus输入,得到词频矩阵 
    #将这个矩阵作为输入,用transformer.fit_transform(词频矩阵)得到TF-IDF权重矩阵  
    看名字你也应该知道:  
    Tfidf-Transformer + Count-Vectorizer  = Tfidf-Vectorizer   
    下面的代码一步到位,把上面的两个步骤一次性全部完成   
    值得注意的是,CountVectorizer()和TfidfVectorizer()里面都有一个成员叫做vocabulary_(后面带一个下划线) 
    这个成员的意义,与我们之前在构建Bunch对象时提到的自己定义的那个vocabulary的意思是一样的,
    只不过一个是私有成员,一个是外部输入,原则上应该保持一致。
    显然,我们在第45行中创建tfidfspace中定义的vocabulary就应该被赋值为这个vocabulary_
    '''

    # 构建一个快乐地一步到位的玩意儿,专业一点儿叫做:使用TfidfVectorizer初始化向量空间模型
    # 这里面有TF-IDF权重矩阵还有我们要的词向量空间坐标轴信息vocabulary_
    if train_tfidf_path is not None:
        # 导入训练集的TF-IDF词向量空间
        trainbunch = readbunchobj(train_tfidf_path)
        tfidfspace.vocabulary = trainbunch.vocabulary
        vectorizer = TfidfVectorizer(stop_words=stpwrdlst, sublinear_tf=True, max_df=0.5,
                                     vocabulary=trainbunch.vocabulary)
        tfidfspace.tdm = vectorizer.fit_transform(bunch.contents)

    else:
        vectorizer = TfidfVectorizer(stop_words=stpwrdlst, sublinear_tf=True, max_df=0.5)
        # 此时tdm里面存储的就是if-idf权值矩阵
        tfidfspace.tdm = vectorizer.fit_transform(bunch.contents)
        tfidfspace.vocabulary = vectorizer.vocabulary_
    '''   
       关于参数,你只需要了解这么几个就可以了:    
       stop_words:    
       传入停用词,以后我们获得vocabulary_的时候,就会根据文本信息去掉停用词得到    
       vocabulary:    
       之前说过,不再解释。    
       sublinear_tf:    
       计算tf值采用亚线性策略。比如,我们以前算tf是词频,现在用1+log(tf)来充当词频。   
       smooth_idf:    
       计算idf的时候log(分子/分母)分母有可能是0,smooth_idf会采用log(分子/(1+分母))的方式解决。
       默认已经开启,无需关心。    
       norm:    
       归一化,我们计算TF-IDF的时候,是用TF*IDF,TF可以是归一化的,
       也可以是没有归一化的,一般都是采用归一化的方法,默认开启.  
       max_df:   
       有些词,他们的文档频率太高了(一个词如果每篇文档都出现,那还有必要用它来区分文本类别吗?当然不用了呀),
       所以,我们可以    
       设定一个阈值,比如float类型0.5(取值范围[0.0,1.0]),
       表示这个词如果在整个数据集中超过50%的文本都出现了,那么我们也把它列  
       为临时停用词。
       当然你也可以设定为int型,例如max_df=10,表示这个词如果在整个数据集中超过10的文本都出现了,
       那么我们也把它列为临时停用词。    
       min_df:    
       与max_df相反,虽然文档频率越低,似乎越能区分文本,可是如果太低,
       例如10000篇文本中只有1篇文本出现过这个词,仅仅因为这1篇   
       文本,就增加了词向量空间的维度,太不划算。    
       当然,max_df和min_df在给定vocabulary参数时,就失效了。   
       '''
    writebunchobj(space_path, tfidfspace)
    print("if-idf词向量空间实例创建成功!!!")