使用BLTK预处理孟加拉语数据集时遇ModuleNotFoundError求助
孟加拉语数据集BLTK预处理报错问题
我尝试使用BLTK对孟加拉语数据集进行预处理,但运行时出现错误。已安装并更新scikit-learn,仍不清楚错误原因。
我的代码
from bltk.langtools import remove_stopwords from bltk.langtools import Tokenizer from bltk.langtools import UgraStemmer from bltk.langtools import PosTagger import re tokenizer = Tokenizer() stemmer = UgraStemmer() corpus = [] y_val = [] for i in range(0, len(messages)): review = messages['text'][i] y_val_temp = messages['Class'][i] review = "".join(i for i in review if i in ["।"] or 2432 <= ord(i) <= 2559 or ord(i)== 32) review =" ".join(review.split()) review = tokenizer.word_tokenizer(review) #print(review) while("" in review) : review.remove("") review = remove_stopwords(review, level='hard') #print(review) review = stemmer.stem(review) #print(review) if(review==None): continue review = ' '.join(review) corpus.append(review) y_val.append(y_val_temp)
报错信息
ModuleNotFoundError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_11864/3574551415.py in <module> 6 7 tokenizer = Tokenizer() ----> 8 stemmer = UgraStemmer() 9 10 D:\Anaconda\lib\site-packages\bltk\langtools\stemmer.py in __init__(self) 5 class UgraStemmer: 6 def __init__(self): ----> 7 self.pos_tagger = PosTagger() 8 self.pronoun_values = list(pronouns.values()) 9 self.pronoun_keys = list(pronouns.keys()) D:\Anaconda\lib\site-packages\bltk\langtools\pos_tagger.py in __init__(self) 10 class PosTagger: 11 def __init__(self): ---> 12 self.data = PosTagger.get_data() 13 14 @staticmethod D:\Anaconda\lib\site-packages\bltk\langtools\pos_tagger.py in get_data() 15 def get_data(): 16 with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..//data//pos_tagger.pkl"), "rb") as tagger: ---> 17 pos_tagger = pickle.load(tagger) 18 return pos_tagger 19 ModuleNotFoundError: No module named 'sklearn.feature_extraction.dict_vectorizer'
问题原因与解决办法
原因
scikit-learn版本更新后,sklearn.feature_extraction.dict_vectorizer模块的路径发生了变更——旧版本使用该路径,新版本中模块结构调整为sklearn.feature_extraction._dict_vectorizer(内部模块)。而BLTK自带的pos_tagger.pkl模型文件是用旧版scikit-learn序列化的,加载时会寻找旧的模块路径,因此触发ModuleNotFoundError。
解决办法
方法一:安装兼容版scikit-learn(推荐新手)
安装0.22.x版本的scikit-learn,这个版本仍保留旧的模块路径,执行命令:pip install scikit-learn==0.22.2.post1方法二:模块路径映射(无需降级)
在代码最开头添加以下代码,将旧模块名映射到新的路径,让pickle加载时能找到对应模块:import sklearn.feature_extraction._dict_vectorizer import sys sys.modules['sklearn.feature_extraction.dict_vectorizer'] = sklearn.feature_extraction._dict_vectorizer方法三:修改BLTK源码(不推荐)
找到BLTK安装目录下的pos_tagger.py文件,修改模型加载相关逻辑,但该操作对新手不友好,容易引发其他问题。
内容的提问来源于stack exchange,提问作者Anower Hossen
相关产品推荐
相关产品推荐

