diff --git a/convokit/__init__.py b/convokit/__init__.py index 087104d2..9bc4c15c 100644 --- a/convokit/__init__.py +++ b/convokit/__init__.py @@ -1,31 +1,54 @@ import warnings +import sys +import types + + +class LazyModule(types.ModuleType): + def __init__(self, module_name): + self._module_name = module_name + + def __getattr__(self, attr): + raise ImportError( + f'{self._module_name} requires spaCy, which is not installed. Please install it with "pip install convokit[spacy]"' + ) + try: from .model import * from .util import * from .coordination import * - from .politenessStrategies import * from .transformer import * from .convokitPipeline import * from .hyperconvo import * from .speakerConvoDiversity import * - from .text_processing import * - from .phrasing_motifs import * - from .prompt_types import * from .classifier import * from .ranker import * from .forecaster import * from .fighting_words import * from .paired_prediction import * from .bag_of_words import * - from .expected_context_framework import * from .surprise import * from .convokitConfig import * + + try: + import spacy + from .politenessStrategies import * + from .text_processing import * + from .phrasing_motifs import * + from .expected_context_framework import * + from .prompt_types import * + except ImportError: + warnings.warn("spaCy is not installed, skipping spaCy-dependent modules.") + sys.modules["convokit.politenessStrategies"] = LazyModule("politenessStrategies") + sys.modules["convokit.text_processing"] = LazyModule("text_processing") + sys.modules["convokit.phrasing_motifs"] = LazyModule("phrasing_motifs") + sys.modules["convokit.expected_context_framework"] = LazyModule( + "expected_context_framework" + ) + sys.modules["convokit.prompt_types"] = LazyModule("prompt_types") + except Exception as e: print(f"An error occurred: {e}") warnings.warn( "If you are using ConvoKit with Google Colab, incorrect versions of some packages (ex. scipy) may be imported while runtime start. To fix the issue, restart the session and run all codes again. Thank you!" ) - - -# __path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/convokit/politenessStrategies/__init__.py b/convokit/politenessStrategies/__init__.py index adae77ae..71b67b32 100644 --- a/convokit/politenessStrategies/__init__.py +++ b/convokit/politenessStrategies/__init__.py @@ -1 +1,6 @@ -from .politenessStrategies import * +try: + from .politenessStrategies import * +except ImportError: + raise ImportError( + 'spaCy is not installed, please install install spaCy with "pip install convokit[spacy]" to use this package.' + ) diff --git a/convokit/text_processing/__init__.py b/convokit/text_processing/__init__.py index ecdeb2ae..86c1ebe8 100644 --- a/convokit/text_processing/__init__.py +++ b/convokit/text_processing/__init__.py @@ -1,4 +1,19 @@ from .textProcessor import * -from .textParser import * from .textToArcs import * from .textCleaner import TextCleaner +import warnings + +try: + from .textParser import * +except Exception: + + class TextParser: + def __init__(self, *args, **kwargs): + raise ImportError( + "spaCy is required to use TextParser. " + "Please install it using `pip install spacy`." + ) + + warnings.warn( + "spaCy is not installed, textParser and textParser dependent subpackages are skipped." + ) diff --git a/convokit/text_processing/textParser.py b/convokit/text_processing/textParser.py index 796fd0f7..cc92732f 100644 --- a/convokit/text_processing/textParser.py +++ b/convokit/text_processing/textParser.py @@ -1,8 +1,14 @@ import nltk -import spacy import sys import warnings + +try: + import spacy +except ImportError: + raise Exception("Spacy is required to use TextParser or TextParser dependent subpackages") + + from spacy.pipeline import Sentencizer diff --git a/setup.py b/setup.py index 8cf22b4e..58bd1763 100644 --- a/setup.py +++ b/setup.py @@ -47,7 +47,6 @@ "pandas>=1.5.0", "numpy>=2.0.0", "msgpack-numpy>=0.4.3.2", - "spacy>=3.8.2", "scipy>=1.1.0", "scikit-learn>=1.0", "nltk>=3.4", @@ -74,6 +73,7 @@ ], extras_require={ "craft": ["torch>=0.12"], + "spacy": ["spacy>=3.8.2"], }, classifiers=[ "Programming Language :: Python",