DataWhale NLP 打卡(四)文本表示

  1.  

  2. TF-IDF原理

    TF-IDF 是一个统计方法,用来评估某个词语对于一个文件集或文档库中的其中一份文件的重要程度。

    词频 TF计算了一个单词在文档中出现的次数,它认为一个单词的重要性和它在文档中出现的次数呈正比。逆向文档频率 IDF,是指一个单词在文档中的区分度。它认为一个单词出现在的文档数越少,就越能通过这个单词把该文档和其他文档区分开。IDF 越大就代表该单词的区分度越大。

    所以 TF-IDF 实际上是词频 TF 和逆向文档频率 IDF 的乘积。这样我们倾向于找到 TF 和 IDF 取值都高的单词作为区分,即这个单词在一个文档中出现的次数多,同时又很少出现在其他文档中。这样的单词适合用于分类。

    • 计算公式

      img

      img

      为什么 IDF 的分母中,单词出现的文档数要加 1 呢?因为有些单词可能不会存在文档中,为了避免分母为 0,统一给单词出现的文档数都加 1。

      TF-IDF=TF*IDF

    • 使用 sklearn 计算 TF-IDF

      from sklearn.feature_extraction.text import TfidfVectorizer
      tfidf_vec = TfidfVectorizer()
      tfidf_vec.fit_transform(data)
  3. 文本矩阵化

  4. from sklearn.feature_extraction.text import TfidfVectorizer
    import jieba
    
    # 读取训练集和停用词表
    with open("../data/cnews/cnews.train.txt", encoding="utf-8") as file:
        data_lines = file.readlines()
    with open("../data/stopwords/中文停用词表.txt", encoding="utf-8") as file:
        stopwords_lines = file.readlines()
    
    # 将停用词表转为列表,使用jieba对训练集进行分词
    stopwords = [line.strip() for line in stopwords_lines]
    cut_data = [" ".join(jieba.cut(line.strip())) for line in data_lines]
    
    # 使用TfidfVectorizer类对训练集的TF-IDF值进行计算
    tfidf = TfidfVectorizer(stop_words=stopwords)
    res = tfidf.fit_transform(cut_data)
    
    # 将计算的结果转换为矩阵
    print(res.toarray())
  5. 点互信息和互信息

    • 点互信息PMI

      点互信息PMI(Pointwise Mutual Information)这个指标是用来衡量两个事物之间的相关性(比如两个词)。

      img

    • 互信息MI

      其衡量的是两个随机变量之间的相关性,即一个随机变量中包含的关于另一个随机变量的信息量。

      img

      可以看出,互信息其实就是对 X 和 Y 的所有可能的取值情况的点互信息 PMI 的加权和。

    • 使用 sklearn 互信息

      from sklearn import metrics as mr
      mr.mutual_info_score(label,x)
      """
      label、x为list或array。
      计算x和label的互信息。
      """
  6. 特性筛选

    • 特性选择常用方法[2]

      常见的方法包括过滤法(Filter)、包裹法(Warpper),嵌入法(Embedding)

      • 过滤法(Filter)

      过滤法只用于检验特征向量和目标(响应变量)的相关度,不需要任何的机器学习的算法,不依赖于任何模型,只是应用统计量做筛选:我们根据统计量的大小,设置合适的阈值,将低于阈值的特征剔除。

      • 包裹(Warpper)

      与过滤法不同的是,包裹法采用的是特征搜索的办法。它的基本思路是,从初始特征集合中不断的选择子集合,根据学习器的性能来对子集进行评价,直到选择出最佳的子集。在搜索过程中,我们会对每个子集做建模和训练。

      包裹实现流程:

      img

      其中Estimated Accuracy是机器学习分类问题的典型的性能指标。

      • 嵌入法(Embedding)

      如果仔细思考前两种方法,过滤法与学习器没有关系,特征选择只是用统计量做筛选,而包裹法则固定了学习器,特征选择只是在特征空间上进行搜索。而嵌入法最大的突破在于,特征选择会在学习器的训练过程中自动完成

    • 使用 sklearn 实现特征选择[3]

      使用过滤法中的互信息法进行特征选择:

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import mutual_info_classif

iris=load_iris()
#选择K个最好的特征,返回选择特征后的数据
SelectKBest(mutual_info_classif, k=2).fit_transform(iris.data, iris.target)

本篇为转载,参考了datawhale学习小组的大佬的博客

原文链接:https://github.com/lingmacker/Datawhale/blob/master/自然语言处理-任务4.md

猜你喜欢

转载自blog.csdn.net/qq_35175666/article/details/89289335