ChatterBot error- OSError: [E941] Can't find model 'en'
Question:
I tried running my first Chatterbot program (its from the PyPi page of Chatterbot), and when I run it, I get an error. The error is related to Spacy, but I am unable to find a solution.
Here is the code:
from chatterbot.trainers import ChatterBotCorpusTrainer
chatbot = ChatBot('Ron Obvious')
trainer = ChatterBotCorpusTrainer(chatbot)
trainer.train("chatterbot.corpus.english")
chatbot.get_response("Hello, how are you today?")
And here is the error:
Traceback (most recent call last):
File "c:/users/USER/desktop/bot.py", line 77, in <module>
chatbot = ChatBot('Ron Obvious')
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbotchatterbot.py", line 28, in __init__
self.storage = utils.initialize_class(storage_adapter, **kwargs)
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbotutils.py", line 33, in initialize_class
return Class(*args, **kwargs)
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbotstoragesql_storage.py", line 20, in __init__
super().__init__(**kwargs)
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbotstoragestorage_adapter.py", line 21, in __init__
'tagger_language', languages.ENG
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbottagging.py", line 13, in __init__
self.nlp = spacy.load(self.language.ISO_639_1.lower())
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packagesspacy__init__.py", line 47, in load
return util.load_model(name, disable=disable, exclude=exclude, config=config)
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packagesspacyutil.py", line 328, in load_model
raise IOError(Errors.E941.format(name=name, full=OLD_MODEL_SHORTCUTS[name]))
OSError: [E941] Can't find model 'en'. It looks like you're trying to load a model from a shortcut, which is deprecated as of spaCy v3.0. To load the model, use its full name instead:
nlp = spacy.load("en_core_web_sm")
For more details on the available models, see the models directory: https://spacy.io/models. If you want to create a blank model, use spacy.blank: nlp = spacy.blank("en")
It would be helpful if someone finds a solution for this. Thanks.
Answers:
Make sure you actually have the right spacy model installed. For example, install en_core_web_sm
with the python -m spacy download en_core_web_sm
command in the terminal.
Next, fix this error:
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbottagging.py", line 13, in __init__
self.nlp = spacy.load(self.language.ISO_639_1.lower())
That is,
- Open the
C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbottagging.py
file
- Go to Line 13
- Replace
self.nlp = spacy.load(self.language.ISO_639_1.lower())
with
if self.language.ISO_639_1.lower() == 'en':
self.nlp = spacy.load('en_core_web_sm')
else:
self.nlp = spacy.load(self.language.ISO_639_1.lower())
You will need to add more conditions for other languages you need to support.
Check the version of spacy you are using.
Install spacy and download the language model, en_core_web_sm, in this case using
python -m spacy download en_core_web_sm
If it is v3.0, you will need to load it using
nlp = spacy.load("en_core_web_sm")
If it is < v3.0, you can link the model creating a shortcut using
python -m spacy link en_core_web_sm en
and thus load it using nlp = spacy.load("en")
First, you need to download en_core_web_sm by running: python -m spacy download en_core_web_sm
You need to modify the following code.
In addition to the other comments, please be aware of an issue with SpaCy 3.0.3 and Python 3.8 – if these are the versions you’re using, you may have to download the language model via Python shell, ex.:
import spacy
from spacy.cli.download import download
download(model="en_core_web_sm")
For these versions, downloading via python -m spacy download en_core_web_sm
may result in exceptions – as described ex. here.
Try just install the spacy with >>pip install -U spacy
And change the code
self.nlp = spacy.load(self.language.ISO_639_1.lower())
in "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbottagging.py" to
if self.language.ISO_639_1.lower() == 'en':
self.nlp = spacy.load('en_core_web_sm')
else:
self.nlp = spacy.load(self.language.ISO_639_1.lower())
Get work for me here and I had the same problem
For Linux and Mac users :
To the above top-voted answer I will add that the location of tagging.py
is :
/usr/local/lib/python3.7/site-packages/chatterbot
To be more precise :
<Install_path_of_Python>/site-packages/chatterbot
( The install path could be your virtual environment path as well )
Try just install the spacy with pip install -U spacy
And change the code
self.nlp = spacy.load(self.language.ISO_639_1.lower())
in C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbottagging.py
to
if self.language.ISO_639_1.lower() == 'en':
self.nlp = spacy.load('en_core_web_sm')
else:
self.nlp = spacy.load(self.language.ISO_639_1.lower())
if downloading the package doesn’t work as follows:
python -m spacy download en_core_web_sm
then you don’t need to change the code in the package, just change the cause.
from chatterbot import languages
languages.ENG.ISO_639_1 = "en_core_web_sm"
it will change "en" to "en_core_web_sm" for spacy
I tried running my first Chatterbot program (its from the PyPi page of Chatterbot), and when I run it, I get an error. The error is related to Spacy, but I am unable to find a solution.
Here is the code:
from chatterbot.trainers import ChatterBotCorpusTrainer
chatbot = ChatBot('Ron Obvious')
trainer = ChatterBotCorpusTrainer(chatbot)
trainer.train("chatterbot.corpus.english")
chatbot.get_response("Hello, how are you today?")
And here is the error:
Traceback (most recent call last):
File "c:/users/USER/desktop/bot.py", line 77, in <module>
chatbot = ChatBot('Ron Obvious')
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbotchatterbot.py", line 28, in __init__
self.storage = utils.initialize_class(storage_adapter, **kwargs)
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbotutils.py", line 33, in initialize_class
return Class(*args, **kwargs)
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbotstoragesql_storage.py", line 20, in __init__
super().__init__(**kwargs)
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbotstoragestorage_adapter.py", line 21, in __init__
'tagger_language', languages.ENG
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbottagging.py", line 13, in __init__
self.nlp = spacy.load(self.language.ISO_639_1.lower())
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packagesspacy__init__.py", line 47, in load
return util.load_model(name, disable=disable, exclude=exclude, config=config)
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packagesspacyutil.py", line 328, in load_model
raise IOError(Errors.E941.format(name=name, full=OLD_MODEL_SHORTCUTS[name]))
OSError: [E941] Can't find model 'en'. It looks like you're trying to load a model from a shortcut, which is deprecated as of spaCy v3.0. To load the model, use its full name instead:
nlp = spacy.load("en_core_web_sm")
For more details on the available models, see the models directory: https://spacy.io/models. If you want to create a blank model, use spacy.blank: nlp = spacy.blank("en")
It would be helpful if someone finds a solution for this. Thanks.
Make sure you actually have the right spacy model installed. For example, install en_core_web_sm
with the python -m spacy download en_core_web_sm
command in the terminal.
Next, fix this error:
File "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbottagging.py", line 13, in __init__
self.nlp = spacy.load(self.language.ISO_639_1.lower())
That is,
- Open the
C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbottagging.py
file - Go to Line 13
- Replace
self.nlp = spacy.load(self.language.ISO_639_1.lower())
with
if self.language.ISO_639_1.lower() == 'en':
self.nlp = spacy.load('en_core_web_sm')
else:
self.nlp = spacy.load(self.language.ISO_639_1.lower())
You will need to add more conditions for other languages you need to support.
Check the version of spacy you are using.
Install spacy and download the language model, en_core_web_sm, in this case using
python -m spacy download en_core_web_sm
If it is v3.0, you will need to load it using
nlp = spacy.load("en_core_web_sm")
If it is < v3.0, you can link the model creating a shortcut using
python -m spacy link en_core_web_sm en
and thus load it using nlp = spacy.load("en")
First, you need to download en_core_web_sm by running: python -m spacy download en_core_web_sm
You need to modify the following code.
In addition to the other comments, please be aware of an issue with SpaCy 3.0.3 and Python 3.8 – if these are the versions you’re using, you may have to download the language model via Python shell, ex.:
import spacy
from spacy.cli.download import download
download(model="en_core_web_sm")
For these versions, downloading via python -m spacy download en_core_web_sm
may result in exceptions – as described ex. here.
Try just install the spacy with >>pip install -U spacy
And change the code
self.nlp = spacy.load(self.language.ISO_639_1.lower())
in "C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbottagging.py" to
if self.language.ISO_639_1.lower() == 'en':
self.nlp = spacy.load('en_core_web_sm')
else:
self.nlp = spacy.load(self.language.ISO_639_1.lower())
Get work for me here and I had the same problem
For Linux and Mac users :
To the above top-voted answer I will add that the location of tagging.py
is :
/usr/local/lib/python3.7/site-packages/chatterbot
To be more precise :
<Install_path_of_Python>/site-packages/chatterbot
( The install path could be your virtual environment path as well )
Try just install the spacy with pip install -U spacy
And change the code
self.nlp = spacy.load(self.language.ISO_639_1.lower())
in C:UsersUSERAppDataLocalProgramsPythonPython37libsite-packageschatterbottagging.py
to
if self.language.ISO_639_1.lower() == 'en':
self.nlp = spacy.load('en_core_web_sm')
else:
self.nlp = spacy.load(self.language.ISO_639_1.lower())
if downloading the package doesn’t work as follows:
python -m spacy download en_core_web_sm
then you don’t need to change the code in the package, just change the cause.
from chatterbot import languages
languages.ENG.ISO_639_1 = "en_core_web_sm"
it will change "en" to "en_core_web_sm" for spacy