• 【ZH奶酪】如何用sklearn计算中文文本TF-IDF?


    1. 什么是TF-IDF

    tf-idf(英语:term frequency–inverse document frequency)是一种用于信息检索与文本挖掘的常用加权技术。tf-idf是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

    2. 如何用sklearn计算TF-IDF?

    2.1 语料集

    本文所用语料集为人机对话系统中的短文本语料,corpus列表中的每个元素是一条Query。(如果是长文本的话,每个元素是一篇文档)

    corpus = [
      "帮我 查下 明天 北京 天气 怎么样",
      "帮我 查下 今天 北京 天气 好不好",
      "帮我 查询 去 北京 的 火车",
      "帮我 查看 到 上海 的 火车",
      "帮我 查看 特朗普 的 新闻",
      "帮我 看看 有没有 北京 的 新闻",
      "帮我 搜索 上海 有 什么 好玩的",
      "帮我 找找 上海 东方明珠 在哪"
    ]
    

    2.2 将语料转换为词袋向量

    step 1. 声明一个向量化工具vectorizer

    本文使用的是CountVectorizer,默认情况下,CountVectorizer仅统计长度超过两个字符的词,但是在短文本中任何一个字都可能十分重要,比如“去/到”等,所以要想让CountVectorizer也支持单字符的词,需要加上参数token_pattern='\b\w+\b'

    step 2. 根据语料集统计词袋(fit);
    step 3. 打印语料集的词袋信息;
    step 4. 将语料集转化为词袋向量(transform);
    step 5. 还可以查看每个词在词袋中的索引;
    代码

    from sklearn.feature_extraction.text import CountVectorizer
    # step 1
    vectoerizer = CountVectorizer(min_df=1, max_df=1.0, token_pattern='\b\w+\b')
    # step 2
    vectoerizer.fit(corpus)
    # step 3
    bag_of_words = vectoerizer.get_feature_names()
    print("Bag of words:")
    print(bag_of_words)
    print(len(bag_of_words))
    # step 4
    X = vectoerizer.transform(corpus)
    print("Vectorized corpus:")
    print(X.toarray())
    # step 5
    print("index of `的` is : {}".format(vectoerizer.vocabulary_.get('的')))
    

    输出

    Bag of words:
    ['上海', '东方明珠', '什么', '今天', '到', '北京', '去', '在哪', '天气', '好不好', '好玩的', '帮我', '怎么样', '找找', '搜索', '新闻', '明天', '有', '有没有', '查下', '查看', '查询', '火车', '特朗普', '的', '看看']
    26
    Vectorized corpus:
    [[0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0]
     [0 0 0 1 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0]
     [0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0]
     [1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0]
     [0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0]
     [0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1]
     [1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0]
     [1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0]]
    index of `的` is : 24
    

    2.3 根据词袋向量统计TF-IDF

    step 1. 声明一个TF-IDF转化器(TfidfTransformer);
    step 2. 根据语料集的词袋向量计算TF-IDF(fit);
    step 3. 打印TF-IDF信息:比如结合词袋信息,可以查看每个词的TF-IDF值;
    step 4. 将语料集的词袋向量表示转换为TF-IDF向量表示;

    from sklearn.feature_extraction.text import TfidfTransformer
    # step 1
    tfidf_transformer = TfidfTransformer()
    # step 2
    tfidf_transformer.fit(X.toarray())
    # step 3
    for idx, word in enumerate(vectoerizer.get_feature_names()):
      print("{}	{}".format(word, tfidf_transformer.idf_[idx]))
    # step 4
    tfidf = tfidf_transformer.transform(X)
    print(tfidf.toarray())
    

    输出

    上海	1.8109302162163288
    东方明珠	2.504077396776274
    什么	2.504077396776274
    今天	2.504077396776274
    到	2.504077396776274
    北京	1.587786664902119
    去	2.504077396776274
    在哪	2.504077396776274
    天气	2.09861228866811
    好不好	2.504077396776274
    好玩的	2.504077396776274
    帮我	1.0
    怎么样	2.504077396776274
    找找	2.504077396776274
    搜索	2.504077396776274
    新闻	2.09861228866811
    明天	2.504077396776274
    有	2.504077396776274
    有没有	2.504077396776274
    查下	2.09861228866811
    查看	2.09861228866811
    查询	2.504077396776274
    火车	2.09861228866811
    特朗普	2.504077396776274
    的	1.587786664902119
    看看	2.504077396776274
    [[0.         0.         0.         0.         0.         0.3183848
      0.         0.         0.42081614 0.         0.         0.20052115
      0.50212047 0.         0.         0.         0.50212047 0.
      0.         0.42081614 0.         0.         0.         0.
      0.         0.        ]
     [0.         0.         0.         0.50212047 0.         0.3183848
      0.         0.         0.42081614 0.50212047 0.         0.20052115
      0.         0.         0.         0.         0.         0.
      0.         0.42081614 0.         0.         0.         0.
      0.         0.        ]
     [0.         0.         0.         0.         0.         0.33116919
      0.52228256 0.         0.         0.         0.         0.20857285
      0.         0.         0.         0.         0.         0.
      0.         0.         0.         0.52228256 0.43771355 0.
      0.33116919 0.        ]
     [0.38715525 0.         0.         0.         0.53534183 0.
      0.         0.         0.         0.         0.         0.21378805
      0.         0.         0.         0.         0.         0.
      0.         0.         0.44865824 0.         0.44865824 0.
      0.33944982 0.        ]
     [0.         0.         0.         0.         0.         0.
      0.         0.         0.         0.         0.         0.23187059
      0.         0.         0.         0.48660646 0.         0.
      0.         0.         0.48660646 0.         0.         0.5806219
      0.36816103 0.        ]
     [0.         0.         0.         0.         0.         0.33116919
      0.         0.         0.         0.         0.         0.20857285
      0.         0.         0.         0.43771355 0.         0.
      0.52228256 0.         0.         0.         0.         0.
      0.33116919 0.52228256]
     [0.33420711 0.         0.4621274  0.         0.         0.
      0.         0.         0.         0.         0.4621274  0.18454996
      0.         0.         0.4621274  0.         0.         0.4621274
      0.         0.         0.         0.         0.         0.
      0.         0.        ]
     [0.37686288 0.52110999 0.         0.         0.         0.
      0.         0.52110999 0.         0.         0.         0.20810458
      0.         0.52110999 0.         0.         0.         0.
      0.         0.         0.         0.         0.         0.
      0.         0.        ]]
    

    参考资料

  • 相关阅读:
    用Margin还是用Padding?
    更优雅的清除浮动float方法
    清除浮动float (:after方法)
    px,em,rem
    load()方法
    PHP函数详解:call_user_func()使用方法
    移动端touch事件影响click事件以及在touchmove添加preventDefault导致页面无法滚动的解决方法
    Mysql开启远程连接方法
    mysql的字符串连接符
    php使用curl访问https返回无结果的问题
  • 原文地址:https://www.cnblogs.com/CheeseZH/p/8644893.html
Copyright © 2020-2023  润新知