普通网友 2024-04-19 09:58 采纳率: 100%
浏览 26
已结题

打印出来的tf、idf值都是 0.0,怎么解决


# 导入所需库
from sklearn.feature_extraction.text import TfidfVectorizer

# 定义文档集合
documents = []
with open('D:\\用户-\\Downloads\\分词结果.txt', 'r', encoding='utf-8') as file:
    # 逐行读取文件内容并添加到documents列表中
    for line in file:
        documents.append(line.strip())

# 创建TfidfVectorizer对象
vectorizer = TfidfVectorizer()

# 计算TF-IDF值
tfidf_matrix = vectorizer.fit_transform(documents)

# 获取词语列表
feature_names = vectorizer.get_feature_names()

# 打印每个词语的TF-IDF值
for i in range(len(documents)):
    print("Document", i+1)
    for j in range(len(feature_names)):
        print(feature_names[j], ":", tfidf_matrix[i, j])

分词结果文件是一行一行的单个词语

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-19 09:58
    关注

    引自免费微信小程序:皆我百晓生

    在计算TF-IDF值时遇到所有值都为0的情况,通常是因为文本预处理没有正确地进行。在这种情况下,可能是由于以下几个原因导致的:

    1. 文本被完全归一化(例如:所有单词都被转换为小写,并且标点符号已经被移除)。
    2. 单词频率统计不正确,可能是因为每个单词只出现了一次,而TF-IDF算法通常会忽略那些在整个语料库中仅出现一次的词汇。
    3. 分词后的结果是单个字符,而不是有意义的词语。

    为了确保TF-IDF值可以正常计算,请尝试以下步骤:

    **步骤1:**检查分词结果,确认它们是否是完整的词语,如果不是,需要调整分词器设置或者使用其他的分词方法。

    **步骤2:**在构建TfidfVectorizer时,设置参数stop_wordsNone,以便不忽略任何单词。同时,可以设置min_df参数为一个适当的值(例如5),这样可以排除那些在整个语料库中只出现少数几次的词汇。

    下面是修改后的代码:

    import re
    from sklearn.feature_extraction.text import TfidfVectorizer
    
    # 定义文档集合
    documents = []
    with open('D:\\用户-\\Downloads\\分词结果.txt', 'r', encoding='utf-8') as file:
        # 逐行读取文件内容并添加到documents列表中
        for line in file:
            # 去掉多余的空格和换行符
            documents.append(re.sub(r'\s+', ' ', line.strip()))
    
    # 创建TfidfVectorizer对象
    vectorizer = TfidfVectorizer(stop_words=None, min_df=5)
    
    # 计算TF-IDF值
    tfidf_matrix = vectorizer.fit_transform(documents)
    
    # 获取词语列表
    feature_names = vectorizer.get_feature_names()
    
    # 打印每个词语的TF-IDF值
    for i in range(len(documents)):
        print("Document", i+1)
        for j in range(len(feature_names)):
            print(feature_names[j], ":", tfidf_matrix[i, j])
    

    在这个例子中,我们使用了正则表达式re.sub(r'\s+', ' ', line.strip())来替换连续的空白字符为单个空格,以确保词语不会因为额外的空格而被分开。同时,我们将min_df设置为5,这意味着只有在一个文档集中至少出现5次的词语才会被考虑在内。

    执行这个修改后的代码后,你应该能看到非零的TF-IDF值。如果你仍然遇到问题,请提供分词结果样本,我会进一步分析。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月27日
  • 已采纳回答 4月19日
  • 创建了问题 4月19日

悬赏问题

  • ¥60 用继电器控制道闸开闸
  • ¥15 化学制备 羧甲纤维素钠与聚氯乙烯混合后,加水搅拌后为什么不成型。
  • ¥15 grbl移动过程中,发送“!"停止,进入Hold状态,怎么解除?
  • ¥15 wpf中自己实现sorting,每一次都是升序排列
  • ¥15 odoo17中,产品分包路线如何设置?可从销售订单中直接触发采购订单及相关单据
  • ¥15 请教下win10wx和麒麟wx无法互通俩者数据并不兼吗,如何解决?(标签-linux)
  • ¥15 永劫无间游戏如何实现微加速 或者说游戏优化(玩家)
  • ¥15 knx的软件sdk库
  • ¥15 用VBA将文件夹内的所有表格自动复制到一个表格的sheet1内,
  • ¥15 帮找书和配套代码。。