zoukankan      html  css  js  c++  java
  • sklearn.feature_extraction.text 的TfidfVectorizer函数

    TfidfVectorizer函数主要用于,将文档(句子)等通过 tf-idf值来进行表示,也就是用一个tf-idf值的矩阵来表示文档(句子也可)。

    from sklearn.feature_extraction.text import TfidfVectorizer

    1. 其函数源代码很长,这里只展示:

    class TfidfVectorizer(CountVectorizer):
        """Convert a collection of raw documents to a matrix of TF-IDF features.
    
        Equivalent to CountVectorizer followed by TfidfTransformer.
    
        Read more in the :ref:`User Guide <text_feature_extraction>`.

    其参数主要有:

    input,encoding,decode_error,strip_accents,analyzer,preprocessor,tokenizer,ngram_range,stop_words,lowercase,token_pattern,max_df,min_df,max_features,vocabulary,binary,dtype,norm,use_idf,smooth_idf,sublinear_tf

    其属性主要有:

    vocabulary_,idf_,stop_words_

    2. 常用的参数意义:

    encoding:编码格式,默认是 utf-8

    ngram_range:N元Gram,元组形式 tuple (min_n, max_n),表示最后得到的特征可以由几个单部分(词/句子等)构成,min_n <= n <= max_n,例如(1,2)表示,得到的特征可以由1个或者2个连续的部分构成

    stop_words:string {'english'}, list, or None (default),停用词,可以用列表导入自己的停用词

    lowercase:将英文全部小写,默认是True

    max_df:float in range [0.0, 1.0] or int, default=1.0,表示得到的词/部分出现在文档中的最大次数,如果大于该次数,则会去掉该词/部分,例如,若设置为0-1之间的浮点数0.6,表示所提取的特征出现在60%以下的文档中,如果大于60%,则会从特征中删除。如果为整数mm,表示该特征(很多时候是词或者句子)出现的文档数必须不大于mm,否则也会删除。

    min_df:float in range [0.0, 1.0] or int, default=1,同理max_df,只不过是设置的下阈值,表示该特征出现的文档数小于该值则会被删除。

    vocabulary:Mapping or iterable, optional,可以用字典,例如{"华为":0, "小米":1,"ov":2},其中键值keys表示要关注的词/句子等特征,values值表示该值在特征矩阵中的索引;用于传入需要重点关注的词/句子等特征。不为空None时,max_df 和 min_df参数会失效。

    use_idf:表示是否使用idf,也就是逆文档词频方法,默认是True

    smooth_idf:表示在计算 idf 的时候,为了防止出现除以0的错误,会在公式中加上1。

    3. 代码示例:

    from sklearn.feature_extraction.text import TfidfVectorizer
    import pandas as pd
    
    test_txt = [
        '一向年光有限身。等闲离别易销魂。酒筵歌席莫辞频。满目山河空念远,落花风雨更伤春。不如怜取眼前人。',
        '燕鸿过后莺归去,细算浮生千万绪。长于春梦几多时,散似秋云无觅处。闻琴解佩神仙侣,挽断罗衣留不住。劝君莫作独醒人,烂醉花间应有数。',
        '绿杨芳草长亭路,年少抛人容易去。楼头残梦五更钟,花底离愁三月雨。无情不似多情苦,一寸还成千万缕。天涯地角有穷时,只有相思无尽处。',
        '槛菊愁烟兰泣露,罗幕轻寒,燕子双飞去。明月不谙离恨苦,斜光到晓穿朱户。昨夜西风凋碧树,独上高楼,望尽天涯路。欲寄彩笺兼尺素,山长水阔知何处。'
    ]
    
    tfidf_ = TfidfVectorizer(max_df = 0.6, ngram_range = (1,1))  #中文是按照单个句子作为N元句法的,以标点为边界
    tfidf_matrix = tfidf_.fit_transform(test_txt)
    
    print(tfidf_.get_feature_names())  # 输出所提取的文本关键字,也就是特征,或者说词/句子
    print(tfidf_.vocabulary_)          # 输出文本的关键字和其索引
    
    print(tfidf_matrix.toarray())      # 输出最终形成的词频矩阵
    X = pd.DataFrame(tfidf_matrix.toarray(), columns=tfidf_.get_feature_names())  #即可形成训练集的样本数据,加上自己的标签(例如y)就可以作为正式的训练集

    输出为:

    这里解释一下 ngram_range = (1,1),所以出现的是单个的部分,也就是单个句子组成的特征,例如'一向年光有限身',如果是(1,2),则出现的特征会更多,形成的是['一向年光有限身','一向年光有限身 等闲离别易销魂', '一寸还成千万缕', '一寸还成千万缕 天涯地角有穷时'......]的形式,其他的(1,3), (2,4)等都与此类似。

    可以看到:句子依然是句子,如果想要得到词,该怎么办呢?

    当然是先将各个句子分词,然后形成list,同样传入list参数取代上面的test_txt即可。

    分词:可以使用jieba分词

    import jieba
    stop_words = [] #停用词需要自己加入
    def cut_word(sentence):
        words = [i for i in jieba.cut(sentence) if i not in stop_words]
        # sentence是传入的单个句子,切完的词用空格隔开
        result = ' '.join(words)
        return result  #返回的值形成了一个以空格分隔的字符串

    参考:

    https://blog.csdn.net/blmoistawinde/article/details/80816179

    https://www.cnblogs.com/my-love-is-python/p/10324709.html

  • 相关阅读:
    springboot运行时该注意的地方
    建立第一个SpringBoot小列子(碰到的错误)
    mysql建表基本语法
    两层c:forEach循环嵌套
    git-------基础知识(本地推送项目版本---github上)
    《生活的邀请函》___ 奥雷阿
    输入路径(包括盘符),打印层级目录(隐藏文件也会打印出来)
    输入两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
    用java实现歌曲串烧高速版(SequenceInputStream的使用)
    Java中InputStream装饰器模式的大家族
  • 原文地址:https://www.cnblogs.com/qi-yuan-008/p/11997802.html
Copyright © 2011-2022 走看看