You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义函数中从nltk.book导入text报ImportError的问题咨询

报错根本原因
  • 触发ImportError: cannot import name 'text' from 'nltk.book'的核心原因是nltk.book模块本身不存在名为text的通用语料对象,模块下的内置文本都是独立命名的(text1、text2、text3……),没有统一叫text的变量可供导入,导入语句自然找不到对应对象抛出错误。
  • 原代码存在逻辑错位:函数形参已经定义了接收文本的text参数,却在函数内部重复写了同名的导入逻辑,就算导入逻辑正确,也会直接覆盖掉外部传入的参数,完全达不到“用户指定文本”的设计目标。
可指定内置文本的实现方案

根据需求,有两种常用的落地实现方式:

方案1:直接传入已加载的Text对象(最简洁)

不需要在函数内部做文本导入,把导入步骤交给调用方完成,函数只负责接收文本对象完成计算:

def lexical_diversity(text, word):
    unique_word_count = len(set(text))
    return 100 * text.count(word) / unique_word_count

调用时用户按需提前导入指定的内置文本即可:

# 外部按需加载需要使用的NLTK内置文本
from nltk.book import text1, text2, text3

# 计算指定文本的对应词汇占比
print(lexical_diversity(text1, "whale"))
print(lexical_diversity(text2, "elinor"))
print(lexical_diversity(text3, "Lord"))

方案2:支持按文本名称字符串调用

如果希望用户不需要手动导入文本,直接传入文本名称就能触发计算,可以在函数内部建立文本名称和实际对象的映射关系:

def lexical_diversity(text_name, word):
    # 函数内部导入所有需要支持的内置文本
    from nltk.book import text1, text2, text3
    # 建立名称映射字典
    available_texts = {
        "text1": text1,
        "text2": text2,
        "text3": text3
    }
    # 校验用户传入的文本是否在支持范围内
    if text_name not in available_texts:
        raise ValueError(f"不支持的文本,当前可选:{list(available_texts.keys())}")
    target_text = available_texts[text_name]
    unique_word_count = len(set(target_text))
    return 100 * target_text.count(word) / unique_word_count

调用时不需要提前导入文本,直接传名称即可:

print(lexical_diversity("text1", "whale"))
print(lexical_diversity("text2", "marianne"))

内容的提问来源于stack exchange,提问作者Navid Asgari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 10:45:07