已定义IDF函数仍触发NameError?求问题定位与解决
问题分析与解决
首先,代码中IDF函数定义在fit函数之前,代码位置不是导致NameError的原因。
可能的触发原因及解决方法:
1. 未导入
math模块
代码中IDF函数使用了math.log(),但没有提前导入math库。运行时会触发NameError: name 'math' is not defined,容易被误以为是调用IDF时的错误。解决方法:在代码最顶部添加:import math2.
unique_words未被正确定义(极端情况)
如果传入fit函数的whole_data不是列表类型,if isinstance(whole_data, (list,))判断不成立,此时vocab变量未定义,后续执行return vocab, ...会报错,但这不是调用IDF时的NameError。确保你的corpus是列表类型的语料。3. 拼写错误
检查调用IDF时的函数名拼写是否和定义一致(比如是否写成了Idf或idf),你的代码里拼写是正确的,但如果实际运行代码有拼写失误会触发错误。
另外,你的代码存在一个优化点:fit函数里的unique_words = sorted(list(unique_words))和vocab = {j:i for i,j in enumerate(unique_words)}被放在了for x in whole_data的循环内部,会导致每处理一个文档就重新排序并生成一次词汇表,完全没必要,应该把这两行移到for循环外面,修改后的fit函数:
def fit(whole_data): unique_words = set() if isinstance(whole_data, (list,)): for x in whole_data: for y in x.split(): if len(y)<2: continue unique_words.add(y) # 移到for循环外面,只执行一次 unique_words = sorted(list(unique_words)) vocab = {j:i for i,j in enumerate(unique_words)} Idf_values_of_all_unique_words = IDF(whole_data,unique_words) return vocab, Idf_values_of_all_unique_words
内容的提问来源于stack exchange,提问作者Parsa
相关产品推荐
相关产品推荐

