《机器学习》——TF-IDF(关键词提取)

打印 上一主题 下一主题

主题 1076|帖子 1076|积分 3232

TF-IDF简介



  • TF - IDF(Term Frequency - Inverse Document Frequency)是一种用于信息检索和文本发掘的常用加权技能。它由两部门组成:词频(TF)和逆文档频率(IDF)。

    • 词频(TF)

      • 词频是指某个词在一篇文档中出现的频率。盘算方法是用某个词在文档中出现的次数除以文档的总词数。例如,文档 A 中有 100 个单词,单词 “apple” 出现了 5 次,那么单词 “apple” 在文档 A 中的词频 TF = 5/100 = 0.05。它衡量的是一个词在单篇文档中的重要性,词频越高,说明这个词在这篇文档中大概越重要。

    • 逆文档频率(IDF)

      • 逆文档频率是一个词在整个文档聚集中的有数水平的度量。盘算方法是先盘算文档总数 N,然后统计包罗某个词的文档数 n,那么这个词的逆文档频率 IDF = log (N/n)。例如,假设有 1000 篇文档(N = 1000),其中只有 10 篇文档包罗单词 “banana”(n = 10),那么单词 “banana” 的逆文档频率 IDF = log (1000/10)= log (100)≈ 2.(这里以自然对数为例)。IDF 的值越大,说明这个词越有数,在区分文档时大概越有价值。

    • TF - IDF 值

      • TF - IDF 值是词频和逆文档频率的乘积,即 TF - IDF = TF×IDF。它综合思量了一个词在单篇文档中的出现频率和在整个文档聚集中的有数水平,从而可以或许更好地衡量一个词对于某篇文档的重要性。在上面的例子中,如果 “apple” 的 TF = 0.05,而且假设其 IDF = 1.5(具体值取决于文档聚集),那么 “apple” 的 TF - IDF 值 = 0.05×1.5 = 0.075。



TF-IDF应用场景



  • 文天职类

    • 在文天职类任务中,TF - IDF 可以用来提取文本的特征向量。例如,将消息文章分为体育、娱乐、科技等种别。通过盘算每篇消息文章中各个单词的 TF - IDF 值,然后选择 TF - IDF 值较高的单词作为特征,构建一个特征向量来代表这篇文章。这个特征向量可以作为机器学习分类算法(如质朴贝叶斯、支持向量机等)的输入,资助分类器判断文章所属的种别。

  • 信息检索

    • 在搜索引擎中,TF - IDF 用于对搜索结果进行排序。当用户输入一个查询词时,搜索引擎会盘算查询词与文档库中各个文档的相干性。TF - IDF 可以资助衡量查询词在文档中的重要性,从而将与查询词相干性高的文档排在前面。例如,用户搜索 “人工智能应用”,搜索引擎会根据文档中 “人工智能” 和 “应用” 这两个词的 TF - IDF 值来判断文档与查询的相干性,TF - IDF 值高的文档更有大概被优先展示。

  • 关键词提取

    • 可以利用 TF - IDF 来提取文档的关键词。通常,TF - IDF 值较高的词很大概是文档的关键词。例如,对于一篇学术论文,通过盘算论文中各个词的 TF - IDF 值,选择排名靠前的词作为关键词,这些关键词可以资助读者快速了解论文的主题。

TF-IDF模型


模型参数

重要参数



  • input

    • 该参数指定输入数据的范例。
    • 可选值:

      • ‘filename’:表现输入是文件名列表,会从文件中读取文本内容。
      • ‘file’:表现输入是文件对象,会从文件对象中读取文本内容。
      • ‘content’(默认):表现输入是文本内容列表,直接使用输入的文本进行处理。


  • encoding

    • 用于指定文本的编码方式。
    • 例如,对于包罗多种语言字符的文本,可以使用 ‘utf-8’ 进行编码,确保字符能被正确解析。

  • decode_error

    • 当解码错误发生时的处理策略。
    • 可选值:

      • ‘strict’(默认):会引发 UnicodeDecodeError 异常。
      • ‘ignore’:忽略错误,直接跳过无法解码的部门。
      • ‘replace’:用 ‘?’ 或其他替换字符替换无法解码的部门。


  • strip_accents

    • 去除重音字符,将其转换为 ASCII 字符。
    • 可选值:

      • ‘ascii’:将重音字符转换为相应的 ASCII 字符。
      • None:不进行此操纵。


  • lowercase

    • 是否将文本转换为小写。
    • 默认值为 True,将所有文本转换为小写,以确保不区分巨细写进行处理,因为在 TF-IDF 盘算中通常认为巨细写不同但拼写相同的词是相同的词。

  • preprocessor

    • 可以自定义预处理函数,在分词前对文本进行预处理。
    • 例如,可以定义一个函数,将 HTML 标签去除或进行一些特别符号的替换,该函数会在分词前应用于每个文档。

  • tokenizer

    • 自定义分词函数,用于将文本拆分成词或标记。
    • 例如,可以使用自己编写的分词函数代替默认的分词方式,对文本进行更过细的分词处理,如对中文进行分词,可以使用 jieba 分词工具,将其封装为一个函数传入此参数。

  • analyzer

    • 定义特征应该由哪些部门组成。
    • 可选值:
    • ‘word’(默认):以词为单位。
    • ‘char’:以字符为单位。
    • ‘char_wb’:以字符为单位,思量词边界。

  • stop_words

    • 可以是以下几种情况:

      • None(默认):不使用停用词。
      • ‘english’:使用内置的英文停用词列表,会过滤掉常见的英文停用词,如 and, the, is 等。

    • 自定义的停用词列表,例如 [‘我’, ‘你’, ‘他’] 可用于中文停用词过滤。

  • token_pattern

    • 用于指定分词的正则表达式模式。
    • 默认是 r"(?u)\b\w\w+\b",即匹配至少两个字母数字字符组成的词,可根据需要修改此正则表达式以顺应不同的语言或特别字符要求。

  • ngram_range

    • 定义要思量的词或字符的范围。
    • 接收一个元组 (min_n, max_n),例如 (1, 2) 表现思量一元词(单个词)和二元词(两个词的组合),可以捕捉到一些短语信息,对于一些特定任务大概会提高性能。

  • max_df

    • 用于过滤掉过于常见的词。
    • 可以是浮点数,范围在 (0.0, 1.0],表现文档频率的最大阈值,例如 0.8 表现文档频率超过 80% 的词将被过滤;也可以是整数,表现绝对的文档频率。

  • min_df

    • 用于过滤掉过于稀有的词。
    • 可以是浮点数,范围在 [0.0, 1.0],表现文档频率的最小阈值,例如 0.2 表现文档频率低于 20% 的词将被过滤;也可以是整数,表现绝对的文档频率。

  • max_features

    • 只思量最常见的 max_features 个词。
    • 例如,设置为 1000 时,仅思量词汇表中最常见的 1000 个词,用于限制特征的维度,避免高维度带来的盘算开销和过拟合。

  • vocabulary

    • 可以是 None(默认),表现使用从输入数据中学习的词汇表;也可以是一个字典或可迭代对象,用于手动指定词汇表,只有在该词汇表中的词才会被思量进行 TF-IDF 盘算。

TF-IDF实例

   对红楼梦文章进行TF-IDF处理,提取到关键字。

通过网盘分享的文件:红楼梦.txt
链接: https://pan.baidu.com/s/1y4_qTi1UgkCHo7exi5g4kw 提取码: 246h
–来自百度网盘超级会员v2的分享
通过网盘分享的文件:StopwordsCN.txt
链接:https://pan.baidu.com/s/1827ZPVgGdoIo86dLDJCV1Q
  提取码: t27s
–来自百度网盘超级会员v2的分享
  实例步调

   所导入的库下载:
  1. pip install jieba
  2. pip install pandas==1.3.5
  3. pip install scikit-learn==1.0.2
复制代码


  • 导入数据和模块
  • 处理数据

    • 处理文章开头和分卷处理
    • 将各卷内容存储到数据帧
    • jieba分词和去停用词处理

  • 练习模型并盘算出TF-IDF值
导入数据和模块

  1. import os
  2. import pandas as pd
  3. import jieba
  4. from sklearn.feature_extraction.text import TfidfVectorizer
  5. file = open('红楼梦.txt', encoding='utf-8')
复制代码
处理数据

处理文章开头和分卷处理

   留意:分卷文件夹需要自己创建。
  1. # 标志,用于标记是否是第一次保存文件
  2. flag = 0
  3. # 打开一个文件用于存储开始部分的内容
  4. juan_file = open('红楼梦开头.txt', 'w', encoding='utf-8')
  5. # 开始遍历《红楼梦》的文本文件
  6. for line in file:
  7.     # 当找到包含"卷 第"的行,认为是一个新的卷的开始
  8.     if '卷 第' in line:
  9.         # 提取卷名并添加后缀.txt
  10.         juan_name = line.strip() + '.txt'
  11.         # 构建存储该卷的文件的完整路径
  12.         path = os.path.join('.\\分卷\\', juan_name)
  13.         print(path)
  14.         # 如果是第一次读取到卷 第
  15.         if flag == 0:
  16.             # 打开新文件存储该卷内容
  17.             juan_file = open(path, 'w', encoding='utf-8')
  18.             flag = 1
  19.         else:
  20.             # 关闭之前的文件,并打开新文件存储该卷内容
  21.             juan_file.close()
  22.             juan_file = open(path, 'w', encoding='utf-8')
  23.         continue
  24.     # 将行内容写入当前的卷文件
  25.     juan_file.write(line)
  26. # 关闭最后的卷文件
  27. juan_file.close()
复制代码
  部门输出:

  将各卷内容存储到数据帧

  1. # 存储文件路径和文件内容的列表
  2. filePaths = []
  3. fileContents = []
  4. # 遍历分卷目录下的所有文件
  5. for root, dirs, files in os.walk(r'.\分卷'):
  6.     for name in files:
  7.         # 构建文件的完整路径
  8.         filePath = os.path.join(root, name)
  9.         print(filePath)
  10.         # 将文件路径添加到列表
  11.         filePaths.append(filePath)
  12.         # 打开文件
  13.         f = open(filePath, 'r', encoding='utf-8')
  14.         # 读取文件内容
  15.         fileContent = f.read()
  16.         f.close()
  17.         # 将文件内容添加到列表
  18.         fileContents.append(fileContent)
  19. # 将文件路径和文件内容存储到一个 DataFrame 中
  20. corpos = pd.DataFrame({
  21.     'filePath': filePaths,
  22.     'fileContent': fileContents})
  23. print(corpos)
复制代码
  使用 os.walk 遍历 .\分卷 目次下的所有文件,将文件路径存储在 filePaths 列表,文件内容存储在 fileContents 列表中。
将 filePaths 和 fileContents 存储在 pandas 数据帧 corpos 中。


  jieba分词和去停用词处理

  1. # 加载结巴分词的自定义词库
  2. jieba.load_userdict(r'./红楼梦词库.txt')
  3. # 读取停用词文件
  4. stopwords = pd.read_csv(r'StopwordsCN.txt',
  5.                      encoding='utf-8', engine='python', index_col=False)
  6. # 打开一个文件用于存储分词结果
  7. file_to_jieba = open(r'分词汇总.txt', 'w', encoding='utf-8')
  8. # 遍历 DataFrame 中的每一行
  9. for index, row in corpos.iterrows():
  10.     # 存储分词后的内容
  11.     juan_ci = ''
  12.     # 获取文件路径
  13.     filePath = row['filePath']
  14.     # 获取文件内容
  15.     fileContent = row['fileContent']
  16.     # 对文件内容进行结巴分词
  17.     segs = jieba.cut(fileContent)
  18.     # 遍历分词结果
  19.     for seg in segs:
  20.         # 如果分词不在停用词列表中,且长度不为 0
  21.         if seg not in stopwords.stopword.values and len(seg.strip()) > 0:
  22.             # 将该分词添加到存储分词结果的字符串中
  23.             juan_ci += seg + ' '
  24.     # 将该卷的分词结果写入文件
  25.     file_to_jieba.write(juan_ci + '\n')
  26. # 关闭存储分词结果的文件
  27. file_to_jieba.close()
复制代码
盘算 TF-IDF 并找出核心关键词

  1. # 打开存储分词结果的文件
  2. inFile = open(r'分词汇总.txt', 'r', encoding='utf-8')
  3. # 读取文件的每一行存储在 corpus 中
  4. corpus = inFile.readlines()
  5. # 创建 TF-IDF 向量化器
  6. vectorizer = TfidfVectorizer()
  7. # 对 corpus 进行拟合和转换,得到 TF-IDF 矩阵
  8. tfidf = vectorizer.fit_transform(corpus)
  9. # 获取特征名称
  10. wordlist = vectorizer.get_feature_names()
  11. # 将 TF-IDF 矩阵转换为 DataFrame
  12. df = pd.DataFrame(tfidf.T.todense(), index=wordlist)
  13. # 遍历每一个文档(这里假设是每一卷)
  14. for i in range(len(corpus)):
  15.     # 获取当前文档的 TF-IDF 特征列表
  16.     featurelist = df.iloc[:, i].to_list()
  17.     # 存储当前文档的关键词及其 TF-IDF 值
  18.     resdict = {}
  19.     # 遍历每个特征
  20.     for j in range(0, len(wordlist)):
  21.         # 将特征和对应的 TF-IDF 值存储到字典中
  22.         resdict[wordlist[j]] = featurelist[j]
  23.     # 对关键词按 TF-IDF 值降序排序
  24.     resdict = sorted(resdict.items(), key=lambda x: x[1], reverse=True)
  25.     # 输出第 i+1 个文档的前 10 个核心关键词
  26.     print("第{}回的核心关键词:".format(i + 1), resdict[0:10]
复制代码
  部门结果:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表