Spaces:
Build error
Build error
2022_1013
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .DS_Store +0 -0
- img/Mo-PTT-Logo.png +0 -0
- requirements.txt +84 -0
- twNLP-app/.DS_Store +0 -0
- twNLP-app/.dockerignore +101 -0
- twNLP-app/.gitignore +139 -0
- twNLP-app/.streamlit/config.toml +8 -0
- twNLP-app/Dockerfile +20 -0
- twNLP-app/LICENSE +201 -0
- twNLP-app/Pipfile +18 -0
- twNLP-app/Pipfile.lock +953 -0
- twNLP-app/README.md +45 -0
- twNLP-app/deployment/nginx.conf +30 -0
- twNLP-app/docker-compose.yml +20 -0
- twNLP-app/requirements.txt +7 -0
- twNLP-app/src/.DS_Store +0 -0
- twNLP-app/src/app.py +111 -0
- twNLP-app/src/configs/__init__.py +10 -0
- twNLP-app/src/configs/ckip.py +36 -0
- twNLP-app/src/configs/cwn.py +14 -0
- twNLP-app/src/context/__init__.py +5 -0
- twNLP-app/src/context/actions.py +30 -0
- twNLP-app/src/context/reducer.py +13 -0
- twNLP-app/src/context/wsg.py +19 -0
- twNLP-app/src/controllers/ckip/__init__.py +6 -0
- twNLP-app/src/controllers/ckip/ner.py +32 -0
- twNLP-app/src/controllers/ckip/pos.py +18 -0
- twNLP-app/src/controllers/ckip/wsg.py +20 -0
- twNLP-app/src/controllers/cwn/__init__.py +4 -0
- twNLP-app/src/controllers/cwn/cwn_sense_tag.py +25 -0
- twNLP-app/src/models/.DS_Store +0 -0
- twNLP-app/src/models/__init__.py +4 -0
- twNLP-app/src/models/ckip/__init__.py +4 -0
- twNLP-app/src/models/ckip/ckip.py +17 -0
- twNLP-app/src/utils/ckip/ner/__init__.py +4 -0
- twNLP-app/src/utils/ckip/ner/chunker.py +13 -0
- twNLP-app/src/utils/ckip/ner/ner.py +67 -0
- twNLP-app/src/utils/ckip/pos/__init__.py +4 -0
- twNLP-app/src/utils/ckip/pos/pos.py +38 -0
- twNLP-app/src/utils/ckip/wsg/__init__.py +4 -0
- twNLP-app/src/utils/ckip/wsg/wsg.py +40 -0
- twNLP-app/src/utils/cwn/__init__.py +4 -0
- twNLP-app/src/utils/cwn/tagger.py +39 -0
- twNLP-app/src/utils/stores/__init__.py +4 -0
- twNLP-app/src/utils/stores/store.py +48 -0
- twNLP-app/src/utils/text/__init__.py +5 -0
- twNLP-app/src/utils/text/text_color.py +57 -0
- twNLP-app/src/utils/text/textsubscript.py +39 -0
- twNLP-app/src/views/__init__.py +0 -0
- twNLP-app/src/views/components/form/__init__.py +4 -0
.DS_Store
ADDED
Binary file (6.15 kB). View file
|
|
img/Mo-PTT-Logo.png
ADDED
![]() |
requirements.txt
ADDED
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
aiofiles==0.8.0
|
2 |
+
altair==4.2.0
|
3 |
+
attrs==22.1.0
|
4 |
+
backports.zoneinfo==0.2.1
|
5 |
+
beautifulsoup4==4.11.1
|
6 |
+
blinker==1.5
|
7 |
+
cachetools==5.2.0
|
8 |
+
certifi==2022.5.18.1
|
9 |
+
charset-normalizer==2.0.12
|
10 |
+
ckip-transformers==0.3.2
|
11 |
+
click==8.1.3
|
12 |
+
commonmark==0.9.1
|
13 |
+
conda==4.3.16
|
14 |
+
CwnGraph==0.4.0
|
15 |
+
CwnSenseTagger==0.1.6
|
16 |
+
cycler==0.11.0
|
17 |
+
decorator==5.1.1
|
18 |
+
DistilTag==0.2.2
|
19 |
+
entrypoints==0.4
|
20 |
+
filelock==3.8.0
|
21 |
+
fonttools==4.33.3
|
22 |
+
gdown==4.5.1
|
23 |
+
gitdb==4.0.9
|
24 |
+
GitPython==3.1.27
|
25 |
+
huggingface-hub==0.10.0
|
26 |
+
idna==3.3
|
27 |
+
importlib-metadata==4.12.0
|
28 |
+
importlib-resources==5.9.0
|
29 |
+
jieba==0.42.1
|
30 |
+
Jinja2==3.1.2
|
31 |
+
joblib==1.2.0
|
32 |
+
jsonschema==4.16.0
|
33 |
+
kiwisolver==1.4.2
|
34 |
+
MarkupSafe==2.1.1
|
35 |
+
matplotlib==3.5.2
|
36 |
+
nltk==3.7
|
37 |
+
numpy==1.22.4
|
38 |
+
packaging==21.3
|
39 |
+
pandas==1.5.0
|
40 |
+
pdfminer==20191125
|
41 |
+
pdfminer3k==1.3.4
|
42 |
+
Pillow==9.1.0
|
43 |
+
pkgutil-resolve-name==1.3.10
|
44 |
+
ply==3.11
|
45 |
+
protobuf==3.20.2
|
46 |
+
pyarrow==9.0.0
|
47 |
+
pycosat==0.6.3
|
48 |
+
pycryptodome==3.14.1
|
49 |
+
pydeck==0.8.0b3
|
50 |
+
Pygments==2.13.0
|
51 |
+
Pympler==1.0.1
|
52 |
+
pyparsing==3.0.9
|
53 |
+
pyrsistent==0.18.1
|
54 |
+
PySocks==1.7.1
|
55 |
+
python-dateutil==2.8.2
|
56 |
+
python-dotenv==0.20.0
|
57 |
+
pytz==2022.2.1
|
58 |
+
pytz-deprecation-shim==0.1.0.post0
|
59 |
+
PyYAML==6.0
|
60 |
+
regex==2022.9.13
|
61 |
+
requests==2.27.1
|
62 |
+
rich==12.5.1
|
63 |
+
ruamel.yaml==0.17.21
|
64 |
+
ruamel.yaml.clib==0.2.6
|
65 |
+
semver==2.13.0
|
66 |
+
six==1.16.0
|
67 |
+
smmap==5.0.0
|
68 |
+
snownlp==0.12.3
|
69 |
+
soupsieve==2.3.2.post1
|
70 |
+
streamlit==1.12.2
|
71 |
+
tokenizers==0.12.1
|
72 |
+
toml==0.10.2
|
73 |
+
toolz==0.12.0
|
74 |
+
torch==1.12.1
|
75 |
+
tornado==6.2
|
76 |
+
tqdm==4.64.1
|
77 |
+
transformers==4.22.2
|
78 |
+
typing-extensions==4.3.0
|
79 |
+
tzdata==2022.4
|
80 |
+
tzlocal==4.2
|
81 |
+
urllib3==1.26.9
|
82 |
+
validators==0.20.0
|
83 |
+
wordcloud==1.8.1
|
84 |
+
zipp==3.8.1
|
twNLP-app/.DS_Store
ADDED
Binary file (6.15 kB). View file
|
|
twNLP-app/.dockerignore
ADDED
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
.git/
|
2 |
+
.gitignore
|
3 |
+
|
4 |
+
# Docker
|
5 |
+
docker-compose.yml
|
6 |
+
.docker
|
7 |
+
|
8 |
+
# Byte-compiled / optimized / DLL files
|
9 |
+
__pycache__/
|
10 |
+
*/__pycache__/
|
11 |
+
*/*/__pycache__/
|
12 |
+
*/*/*/__pycache__/
|
13 |
+
*.py[cod]
|
14 |
+
*/*.py[cod]
|
15 |
+
*/*/*.py[cod]
|
16 |
+
*/*/*/*.py[cod]
|
17 |
+
**/*.egg-info
|
18 |
+
**/*.egg/
|
19 |
+
**/*.pyc
|
20 |
+
**/*.swp
|
21 |
+
|
22 |
+
# C extensions
|
23 |
+
*.so
|
24 |
+
|
25 |
+
# Distribution / packaging
|
26 |
+
.Python
|
27 |
+
env/
|
28 |
+
build/
|
29 |
+
develop-eggs/
|
30 |
+
dist/
|
31 |
+
downloads/
|
32 |
+
eggs/
|
33 |
+
lib/
|
34 |
+
lib64/
|
35 |
+
parts/
|
36 |
+
sdist/
|
37 |
+
var/
|
38 |
+
*.egg-info/
|
39 |
+
.installed.cfg
|
40 |
+
*.egg
|
41 |
+
|
42 |
+
|
43 |
+
# PyInstaller
|
44 |
+
# Usually these files are written by a python script from a template
|
45 |
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
46 |
+
*.manifest
|
47 |
+
*.spec
|
48 |
+
|
49 |
+
# Installer logs
|
50 |
+
pip-log.txt
|
51 |
+
pip-delete-this-directory.txt
|
52 |
+
|
53 |
+
# Unit test / coverage reports
|
54 |
+
htmlcov/
|
55 |
+
.tox/
|
56 |
+
.coverage
|
57 |
+
.cache
|
58 |
+
nosetests.xml
|
59 |
+
coverage.xml
|
60 |
+
|
61 |
+
# Translations
|
62 |
+
*.mo
|
63 |
+
*.pot
|
64 |
+
|
65 |
+
# Django stuff:
|
66 |
+
*.log
|
67 |
+
|
68 |
+
# Sphinx documentation
|
69 |
+
docs/_build/
|
70 |
+
|
71 |
+
# PyBuilder
|
72 |
+
target/
|
73 |
+
|
74 |
+
# Virtual environment
|
75 |
+
.env/
|
76 |
+
.venv/
|
77 |
+
venv/
|
78 |
+
|
79 |
+
# PyCharm
|
80 |
+
.idea
|
81 |
+
|
82 |
+
# Python mode for VIM
|
83 |
+
.ropeproject
|
84 |
+
*/.ropeproject
|
85 |
+
*/*/.ropeproject
|
86 |
+
*/*/*/.ropeproject
|
87 |
+
|
88 |
+
# Vim swap files
|
89 |
+
*.swp
|
90 |
+
*/*.swp
|
91 |
+
*/*/*.swp
|
92 |
+
*/*/*/*.swp
|
93 |
+
|
94 |
+
# readme
|
95 |
+
README.md
|
96 |
+
|
97 |
+
# tempCodeRunnerFile
|
98 |
+
tempCodeRunnerFile.py
|
99 |
+
|
100 |
+
# pickle files
|
101 |
+
*/*/*.pickle
|
twNLP-app/.gitignore
ADDED
@@ -0,0 +1,139 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Byte-compiled / optimized / DLL files
|
2 |
+
__pycache__/
|
3 |
+
*.py[cod]
|
4 |
+
*$py.class
|
5 |
+
|
6 |
+
# C extensions
|
7 |
+
*.so
|
8 |
+
|
9 |
+
# Distribution / packaging
|
10 |
+
.Python
|
11 |
+
build/
|
12 |
+
develop-eggs/
|
13 |
+
dist/
|
14 |
+
downloads/
|
15 |
+
eggs/
|
16 |
+
.eggs/
|
17 |
+
lib/
|
18 |
+
lib64/
|
19 |
+
parts/
|
20 |
+
sdist/
|
21 |
+
var/
|
22 |
+
wheels/
|
23 |
+
pip-wheel-metadata/
|
24 |
+
share/python-wheels/
|
25 |
+
*.egg-info/
|
26 |
+
.installed.cfg
|
27 |
+
*.egg
|
28 |
+
MANIFEST
|
29 |
+
|
30 |
+
# PyInstaller
|
31 |
+
# Usually these files are written by a python script from a template
|
32 |
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
33 |
+
*.manifest
|
34 |
+
*.spec
|
35 |
+
|
36 |
+
# Installer logs
|
37 |
+
pip-log.txt
|
38 |
+
pip-delete-this-directory.txt
|
39 |
+
|
40 |
+
# Unit test / coverage reports
|
41 |
+
htmlcov/
|
42 |
+
.tox/
|
43 |
+
.nox/
|
44 |
+
.coverage
|
45 |
+
.coverage.*
|
46 |
+
.cache
|
47 |
+
nosetests.xml
|
48 |
+
coverage.xml
|
49 |
+
*.cover
|
50 |
+
*.py,cover
|
51 |
+
.hypothesis/
|
52 |
+
.pytest_cache/
|
53 |
+
|
54 |
+
# Translations
|
55 |
+
*.mo
|
56 |
+
*.pot
|
57 |
+
|
58 |
+
# Django stuff:
|
59 |
+
*.log
|
60 |
+
local_settings.py
|
61 |
+
db.sqlite3
|
62 |
+
db.sqlite3-journal
|
63 |
+
|
64 |
+
# Flask stuff:
|
65 |
+
instance/
|
66 |
+
.webassets-cache
|
67 |
+
|
68 |
+
# Scrapy stuff:
|
69 |
+
.scrapy
|
70 |
+
|
71 |
+
# Sphinx documentation
|
72 |
+
docs/_build/
|
73 |
+
|
74 |
+
# PyBuilder
|
75 |
+
target/
|
76 |
+
|
77 |
+
# Jupyter Notebook
|
78 |
+
.ipynb_checkpoints
|
79 |
+
|
80 |
+
# IPython
|
81 |
+
profile_default/
|
82 |
+
ipython_config.py
|
83 |
+
|
84 |
+
# pyenv
|
85 |
+
.python-version
|
86 |
+
|
87 |
+
# pipenv
|
88 |
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
89 |
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
90 |
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
91 |
+
# install all needed dependencies.
|
92 |
+
#Pipfile.lock
|
93 |
+
|
94 |
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
95 |
+
__pypackages__/
|
96 |
+
|
97 |
+
# Celery stuff
|
98 |
+
celerybeat-schedule
|
99 |
+
celerybeat.pid
|
100 |
+
|
101 |
+
# SageMath parsed files
|
102 |
+
*.sage.py
|
103 |
+
|
104 |
+
# Environments
|
105 |
+
.env
|
106 |
+
.venv
|
107 |
+
env/
|
108 |
+
venv/
|
109 |
+
ENV/
|
110 |
+
env.bak/
|
111 |
+
venv.bak/
|
112 |
+
|
113 |
+
# Spyder project settings
|
114 |
+
.spyderproject
|
115 |
+
.spyproject
|
116 |
+
|
117 |
+
# Rope project settings
|
118 |
+
.ropeproject
|
119 |
+
|
120 |
+
# mkdocs documentation
|
121 |
+
/site
|
122 |
+
|
123 |
+
# mypy
|
124 |
+
.mypy_cache/
|
125 |
+
.dmypy.json
|
126 |
+
dmypy.json
|
127 |
+
|
128 |
+
# Pyre type checker
|
129 |
+
.pyre/
|
130 |
+
*.ipynb
|
131 |
+
|
132 |
+
# sqlite3 database
|
133 |
+
*.db
|
134 |
+
|
135 |
+
# tempCodeRunnerFile
|
136 |
+
tempCodeRunnerFile.py
|
137 |
+
|
138 |
+
# pickle files
|
139 |
+
*.pickle
|
twNLP-app/.streamlit/config.toml
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[logger]
|
2 |
+
level = "info"
|
3 |
+
messageFormat = "%(asctime)s %(message)s"
|
4 |
+
|
5 |
+
[theme]
|
6 |
+
# Primary accent for interactive elements
|
7 |
+
primaryColor = '#228be6'
|
8 |
+
backgroundColor = 'rgb(255, 255, 255)'
|
twNLP-app/Dockerfile
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
FROM python:3.7-slim
|
2 |
+
|
3 |
+
WORKDIR /app
|
4 |
+
|
5 |
+
COPY ./Pipfile* ./
|
6 |
+
|
7 |
+
RUN pip install pipenv && \
|
8 |
+
apt-get update && \
|
9 |
+
apt-get install -y --no-install-recommends gcc python3-dev libssl-dev && \
|
10 |
+
pipenv install --deploy --system && \
|
11 |
+
apt-get remove -y gcc python3-dev libssl-dev && \
|
12 |
+
apt-get autoremove -y && \
|
13 |
+
pip uninstall pipenv -y \
|
14 |
+
&& rm -rf /var/lib/apt/lists/*
|
15 |
+
|
16 |
+
COPY ./.streamlit ./.streamlit
|
17 |
+
|
18 |
+
COPY ./src ./src
|
19 |
+
|
20 |
+
EXPOSE 8501
|
twNLP-app/LICENSE
ADDED
@@ -0,0 +1,201 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Apache License
|
2 |
+
Version 2.0, January 2004
|
3 |
+
http://www.apache.org/licenses/
|
4 |
+
|
5 |
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
6 |
+
|
7 |
+
1. Definitions.
|
8 |
+
|
9 |
+
"License" shall mean the terms and conditions for use, reproduction,
|
10 |
+
and distribution as defined by Sections 1 through 9 of this document.
|
11 |
+
|
12 |
+
"Licensor" shall mean the copyright owner or entity authorized by
|
13 |
+
the copyright owner that is granting the License.
|
14 |
+
|
15 |
+
"Legal Entity" shall mean the union of the acting entity and all
|
16 |
+
other entities that control, are controlled by, or are under common
|
17 |
+
control with that entity. For the purposes of this definition,
|
18 |
+
"control" means (i) the power, direct or indirect, to cause the
|
19 |
+
direction or management of such entity, whether by contract or
|
20 |
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
21 |
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
22 |
+
|
23 |
+
"You" (or "Your") shall mean an individual or Legal Entity
|
24 |
+
exercising permissions granted by this License.
|
25 |
+
|
26 |
+
"Source" form shall mean the preferred form for making modifications,
|
27 |
+
including but not limited to software source code, documentation
|
28 |
+
source, and configuration files.
|
29 |
+
|
30 |
+
"Object" form shall mean any form resulting from mechanical
|
31 |
+
transformation or translation of a Source form, including but
|
32 |
+
not limited to compiled object code, generated documentation,
|
33 |
+
and conversions to other media types.
|
34 |
+
|
35 |
+
"Work" shall mean the work of authorship, whether in Source or
|
36 |
+
Object form, made available under the License, as indicated by a
|
37 |
+
copyright notice that is included in or attached to the work
|
38 |
+
(an example is provided in the Appendix below).
|
39 |
+
|
40 |
+
"Derivative Works" shall mean any work, whether in Source or Object
|
41 |
+
form, that is based on (or derived from) the Work and for which the
|
42 |
+
editorial revisions, annotations, elaborations, or other modifications
|
43 |
+
represent, as a whole, an original work of authorship. For the purposes
|
44 |
+
of this License, Derivative Works shall not include works that remain
|
45 |
+
separable from, or merely link (or bind by name) to the interfaces of,
|
46 |
+
the Work and Derivative Works thereof.
|
47 |
+
|
48 |
+
"Contribution" shall mean any work of authorship, including
|
49 |
+
the original version of the Work and any modifications or additions
|
50 |
+
to that Work or Derivative Works thereof, that is intentionally
|
51 |
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
52 |
+
or by an individual or Legal Entity authorized to submit on behalf of
|
53 |
+
the copyright owner. For the purposes of this definition, "submitted"
|
54 |
+
means any form of electronic, verbal, or written communication sent
|
55 |
+
to the Licensor or its representatives, including but not limited to
|
56 |
+
communication on electronic mailing lists, source code control systems,
|
57 |
+
and issue tracking systems that are managed by, or on behalf of, the
|
58 |
+
Licensor for the purpose of discussing and improving the Work, but
|
59 |
+
excluding communication that is conspicuously marked or otherwise
|
60 |
+
designated in writing by the copyright owner as "Not a Contribution."
|
61 |
+
|
62 |
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
63 |
+
on behalf of whom a Contribution has been received by Licensor and
|
64 |
+
subsequently incorporated within the Work.
|
65 |
+
|
66 |
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
67 |
+
this License, each Contributor hereby grants to You a perpetual,
|
68 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
69 |
+
copyright license to reproduce, prepare Derivative Works of,
|
70 |
+
publicly display, publicly perform, sublicense, and distribute the
|
71 |
+
Work and such Derivative Works in Source or Object form.
|
72 |
+
|
73 |
+
3. Grant of Patent License. Subject to the terms and conditions of
|
74 |
+
this License, each Contributor hereby grants to You a perpetual,
|
75 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
76 |
+
(except as stated in this section) patent license to make, have made,
|
77 |
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
78 |
+
where such license applies only to those patent claims licensable
|
79 |
+
by such Contributor that are necessarily infringed by their
|
80 |
+
Contribution(s) alone or by combination of their Contribution(s)
|
81 |
+
with the Work to which such Contribution(s) was submitted. If You
|
82 |
+
institute patent litigation against any entity (including a
|
83 |
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
84 |
+
or a Contribution incorporated within the Work constitutes direct
|
85 |
+
or contributory patent infringement, then any patent licenses
|
86 |
+
granted to You under this License for that Work shall terminate
|
87 |
+
as of the date such litigation is filed.
|
88 |
+
|
89 |
+
4. Redistribution. You may reproduce and distribute copies of the
|
90 |
+
Work or Derivative Works thereof in any medium, with or without
|
91 |
+
modifications, and in Source or Object form, provided that You
|
92 |
+
meet the following conditions:
|
93 |
+
|
94 |
+
(a) You must give any other recipients of the Work or
|
95 |
+
Derivative Works a copy of this License; and
|
96 |
+
|
97 |
+
(b) You must cause any modified files to carry prominent notices
|
98 |
+
stating that You changed the files; and
|
99 |
+
|
100 |
+
(c) You must retain, in the Source form of any Derivative Works
|
101 |
+
that You distribute, all copyright, patent, trademark, and
|
102 |
+
attribution notices from the Source form of the Work,
|
103 |
+
excluding those notices that do not pertain to any part of
|
104 |
+
the Derivative Works; and
|
105 |
+
|
106 |
+
(d) If the Work includes a "NOTICE" text file as part of its
|
107 |
+
distribution, then any Derivative Works that You distribute must
|
108 |
+
include a readable copy of the attribution notices contained
|
109 |
+
within such NOTICE file, excluding those notices that do not
|
110 |
+
pertain to any part of the Derivative Works, in at least one
|
111 |
+
of the following places: within a NOTICE text file distributed
|
112 |
+
as part of the Derivative Works; within the Source form or
|
113 |
+
documentation, if provided along with the Derivative Works; or,
|
114 |
+
within a display generated by the Derivative Works, if and
|
115 |
+
wherever such third-party notices normally appear. The contents
|
116 |
+
of the NOTICE file are for informational purposes only and
|
117 |
+
do not modify the License. You may add Your own attribution
|
118 |
+
notices within Derivative Works that You distribute, alongside
|
119 |
+
or as an addendum to the NOTICE text from the Work, provided
|
120 |
+
that such additional attribution notices cannot be construed
|
121 |
+
as modifying the License.
|
122 |
+
|
123 |
+
You may add Your own copyright statement to Your modifications and
|
124 |
+
may provide additional or different license terms and conditions
|
125 |
+
for use, reproduction, or distribution of Your modifications, or
|
126 |
+
for any such Derivative Works as a whole, provided Your use,
|
127 |
+
reproduction, and distribution of the Work otherwise complies with
|
128 |
+
the conditions stated in this License.
|
129 |
+
|
130 |
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
131 |
+
any Contribution intentionally submitted for inclusion in the Work
|
132 |
+
by You to the Licensor shall be under the terms and conditions of
|
133 |
+
this License, without any additional terms or conditions.
|
134 |
+
Notwithstanding the above, nothing herein shall supersede or modify
|
135 |
+
the terms of any separate license agreement you may have executed
|
136 |
+
with Licensor regarding such Contributions.
|
137 |
+
|
138 |
+
6. Trademarks. This License does not grant permission to use the trade
|
139 |
+
names, trademarks, service marks, or product names of the Licensor,
|
140 |
+
except as required for reasonable and customary use in describing the
|
141 |
+
origin of the Work and reproducing the content of the NOTICE file.
|
142 |
+
|
143 |
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
144 |
+
agreed to in writing, Licensor provides the Work (and each
|
145 |
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
146 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
147 |
+
implied, including, without limitation, any warranties or conditions
|
148 |
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
149 |
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
150 |
+
appropriateness of using or redistributing the Work and assume any
|
151 |
+
risks associated with Your exercise of permissions under this License.
|
152 |
+
|
153 |
+
8. Limitation of Liability. In no event and under no legal theory,
|
154 |
+
whether in tort (including negligence), contract, or otherwise,
|
155 |
+
unless required by applicable law (such as deliberate and grossly
|
156 |
+
negligent acts) or agreed to in writing, shall any Contributor be
|
157 |
+
liable to You for damages, including any direct, indirect, special,
|
158 |
+
incidental, or consequential damages of any character arising as a
|
159 |
+
result of this License or out of the use or inability to use the
|
160 |
+
Work (including but not limited to damages for loss of goodwill,
|
161 |
+
work stoppage, computer failure or malfunction, or any and all
|
162 |
+
other commercial damages or losses), even if such Contributor
|
163 |
+
has been advised of the possibility of such damages.
|
164 |
+
|
165 |
+
9. Accepting Warranty or Additional Liability. While redistributing
|
166 |
+
the Work or Derivative Works thereof, You may choose to offer,
|
167 |
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
168 |
+
or other liability obligations and/or rights consistent with this
|
169 |
+
License. However, in accepting such obligations, You may act only
|
170 |
+
on Your own behalf and on Your sole responsibility, not on behalf
|
171 |
+
of any other Contributor, and only if You agree to indemnify,
|
172 |
+
defend, and hold each Contributor harmless for any liability
|
173 |
+
incurred by, or claims asserted against, such Contributor by reason
|
174 |
+
of your accepting any such warranty or additional liability.
|
175 |
+
|
176 |
+
END OF TERMS AND CONDITIONS
|
177 |
+
|
178 |
+
APPENDIX: How to apply the Apache License to your work.
|
179 |
+
|
180 |
+
To apply the Apache License to your work, attach the following
|
181 |
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
182 |
+
replaced with your own identifying information. (Don't include
|
183 |
+
the brackets!) The text should be enclosed in the appropriate
|
184 |
+
comment syntax for the file format. We also recommend that a
|
185 |
+
file or class name and description of purpose be included on the
|
186 |
+
same "printed page" as the copyright notice for easier
|
187 |
+
identification within third-party archives.
|
188 |
+
|
189 |
+
Copyright [yyyy] [name of copyright owner]
|
190 |
+
|
191 |
+
Licensed under the Apache License, Version 2.0 (the "License");
|
192 |
+
you may not use this file except in compliance with the License.
|
193 |
+
You may obtain a copy of the License at
|
194 |
+
|
195 |
+
http://www.apache.org/licenses/LICENSE-2.0
|
196 |
+
|
197 |
+
Unless required by applicable law or agreed to in writing, software
|
198 |
+
distributed under the License is distributed on an "AS IS" BASIS,
|
199 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
200 |
+
See the License for the specific language governing permissions and
|
201 |
+
limitations under the License.
|
twNLP-app/Pipfile
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[[source]]
|
2 |
+
url = "https://pypi.org/simple"
|
3 |
+
verify_ssl = true
|
4 |
+
name = "pypi"
|
5 |
+
|
6 |
+
[packages]
|
7 |
+
streamlit = "*"
|
8 |
+
ckip-transformers = "*"
|
9 |
+
cwngraph = "*"
|
10 |
+
distiltag = "*"
|
11 |
+
cwnsensetagger = "*"
|
12 |
+
aiofiles = "*"
|
13 |
+
python-dotenv = "*"
|
14 |
+
|
15 |
+
[dev-packages]
|
16 |
+
|
17 |
+
[requires]
|
18 |
+
python_version = "3.7"
|
twNLP-app/Pipfile.lock
ADDED
@@ -0,0 +1,953 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"_meta": {
|
3 |
+
"hash": {
|
4 |
+
"sha256": "c3ccdc36761e5f63f4df701a2b449aae3db40ccf5b055b6fc06ba39e61001309"
|
5 |
+
},
|
6 |
+
"pipfile-spec": 6,
|
7 |
+
"requires": {
|
8 |
+
"python_version": "3.7"
|
9 |
+
},
|
10 |
+
"sources": [
|
11 |
+
{
|
12 |
+
"name": "pypi",
|
13 |
+
"url": "https://pypi.org/simple",
|
14 |
+
"verify_ssl": true
|
15 |
+
}
|
16 |
+
]
|
17 |
+
},
|
18 |
+
"default": {
|
19 |
+
"aiofiles": {
|
20 |
+
"hashes": [
|
21 |
+
"sha256:7a973fc22b29e9962d0897805ace5856e6a566ab1f0c8e5c91ff6c866519c937",
|
22 |
+
"sha256:8334f23235248a3b2e83b2c3a78a22674f39969b96397126cc93664d9a901e59"
|
23 |
+
],
|
24 |
+
"index": "pypi",
|
25 |
+
"version": "==0.8.0"
|
26 |
+
},
|
27 |
+
"altair": {
|
28 |
+
"hashes": [
|
29 |
+
"sha256:0c724848ae53410c13fa28be2b3b9a9dcb7b5caa1a70f7f217bd663bb419935a",
|
30 |
+
"sha256:d87d9372e63b48cd96b2a6415f0cf9457f50162ab79dc7a31cd7e024dd840026"
|
31 |
+
],
|
32 |
+
"markers": "python_version >= '3.7'",
|
33 |
+
"version": "==4.2.0"
|
34 |
+
},
|
35 |
+
"attrs": {
|
36 |
+
"hashes": [
|
37 |
+
"sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6",
|
38 |
+
"sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"
|
39 |
+
],
|
40 |
+
"markers": "python_version >= '3.5'",
|
41 |
+
"version": "==22.1.0"
|
42 |
+
},
|
43 |
+
"backports.zoneinfo": {
|
44 |
+
"hashes": [
|
45 |
+
"sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf",
|
46 |
+
"sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328",
|
47 |
+
"sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546",
|
48 |
+
"sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6",
|
49 |
+
"sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570",
|
50 |
+
"sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9",
|
51 |
+
"sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7",
|
52 |
+
"sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987",
|
53 |
+
"sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722",
|
54 |
+
"sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582",
|
55 |
+
"sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc",
|
56 |
+
"sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b",
|
57 |
+
"sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1",
|
58 |
+
"sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08",
|
59 |
+
"sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac",
|
60 |
+
"sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"
|
61 |
+
],
|
62 |
+
"markers": "python_version < '3.9'",
|
63 |
+
"version": "==0.2.1"
|
64 |
+
},
|
65 |
+
"beautifulsoup4": {
|
66 |
+
"hashes": [
|
67 |
+
"sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30",
|
68 |
+
"sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"
|
69 |
+
],
|
70 |
+
"markers": "python_version >= '3.6'",
|
71 |
+
"version": "==4.11.1"
|
72 |
+
},
|
73 |
+
"blinker": {
|
74 |
+
"hashes": [
|
75 |
+
"sha256:1eb563df6fdbc39eeddc177d953203f99f097e9bf0e2b8f9f3cf18b6ca425e36",
|
76 |
+
"sha256:923e5e2f69c155f2cc42dafbbd70e16e3fde24d2d4aa2ab72fbe386238892462"
|
77 |
+
],
|
78 |
+
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
|
79 |
+
"version": "==1.5"
|
80 |
+
},
|
81 |
+
"cachetools": {
|
82 |
+
"hashes": [
|
83 |
+
"sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757",
|
84 |
+
"sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db"
|
85 |
+
],
|
86 |
+
"markers": "python_version ~= '3.7'",
|
87 |
+
"version": "==5.2.0"
|
88 |
+
},
|
89 |
+
"certifi": {
|
90 |
+
"hashes": [
|
91 |
+
"sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d",
|
92 |
+
"sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"
|
93 |
+
],
|
94 |
+
"markers": "python_version >= '3.6'",
|
95 |
+
"version": "==2022.6.15"
|
96 |
+
},
|
97 |
+
"charset-normalizer": {
|
98 |
+
"hashes": [
|
99 |
+
"sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845",
|
100 |
+
"sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"
|
101 |
+
],
|
102 |
+
"markers": "python_version >= '3.6'",
|
103 |
+
"version": "==2.1.1"
|
104 |
+
},
|
105 |
+
"ckip-transformers": {
|
106 |
+
"hashes": [
|
107 |
+
"sha256:48affb723a40e535ccbcc0b4bbb14a86695373167218786eb00b06531cebb22e",
|
108 |
+
"sha256:a13c8ec21e209d3854601dae623f91046d2ee2c7f3fcb693752bfd57e896c776"
|
109 |
+
],
|
110 |
+
"index": "pypi",
|
111 |
+
"version": "==0.3.2"
|
112 |
+
},
|
113 |
+
"click": {
|
114 |
+
"hashes": [
|
115 |
+
"sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e",
|
116 |
+
"sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"
|
117 |
+
],
|
118 |
+
"markers": "python_version >= '3.7'",
|
119 |
+
"version": "==8.1.3"
|
120 |
+
},
|
121 |
+
"commonmark": {
|
122 |
+
"hashes": [
|
123 |
+
"sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60",
|
124 |
+
"sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"
|
125 |
+
],
|
126 |
+
"version": "==0.9.1"
|
127 |
+
},
|
128 |
+
"cwngraph": {
|
129 |
+
"hashes": [
|
130 |
+
"sha256:20acb3e9b6ac86e724537718d729c0fc81c7634932213bef42d8c03c94ae9236",
|
131 |
+
"sha256:bb88150cfa088db51b19094794de156d1214539cb67928f35c424e81ab39c392"
|
132 |
+
],
|
133 |
+
"index": "pypi",
|
134 |
+
"version": "==0.4.0"
|
135 |
+
},
|
136 |
+
"cwnsensetagger": {
|
137 |
+
"hashes": [
|
138 |
+
"sha256:00727031fa61585d8b21465630b134b35be37138b6edbad7b7f43c76769a1ca0",
|
139 |
+
"sha256:f3a7a720ab81c452cf87294f84bd9e62357000127db39c32526da19fdeddafa0"
|
140 |
+
],
|
141 |
+
"index": "pypi",
|
142 |
+
"version": "==0.1.6"
|
143 |
+
},
|
144 |
+
"decorator": {
|
145 |
+
"hashes": [
|
146 |
+
"sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330",
|
147 |
+
"sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"
|
148 |
+
],
|
149 |
+
"markers": "python_version >= '3.5'",
|
150 |
+
"version": "==5.1.1"
|
151 |
+
},
|
152 |
+
"distiltag": {
|
153 |
+
"hashes": [
|
154 |
+
"sha256:24dff55253d54e237aa1339d5d7252de3e2c832b5082ba0751fd946db1f085bd",
|
155 |
+
"sha256:2bc723a952cae40ced3478a04698399a91612f8025142c7fb313fd905a6b7a7e"
|
156 |
+
],
|
157 |
+
"index": "pypi",
|
158 |
+
"version": "==0.2.2"
|
159 |
+
},
|
160 |
+
"entrypoints": {
|
161 |
+
"hashes": [
|
162 |
+
"sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4",
|
163 |
+
"sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"
|
164 |
+
],
|
165 |
+
"markers": "python_version >= '3.6'",
|
166 |
+
"version": "==0.4"
|
167 |
+
},
|
168 |
+
"filelock": {
|
169 |
+
"hashes": [
|
170 |
+
"sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc",
|
171 |
+
"sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4"
|
172 |
+
],
|
173 |
+
"markers": "python_version >= '3.7'",
|
174 |
+
"version": "==3.8.0"
|
175 |
+
},
|
176 |
+
"gdown": {
|
177 |
+
"hashes": [
|
178 |
+
"sha256:8217061063d8afcaad9d8e2d5410fbc0989c2b3f0946a6bd9bfeb9461616cc6a"
|
179 |
+
],
|
180 |
+
"version": "==4.5.1"
|
181 |
+
},
|
182 |
+
"gitdb": {
|
183 |
+
"hashes": [
|
184 |
+
"sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd",
|
185 |
+
"sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"
|
186 |
+
],
|
187 |
+
"markers": "python_version >= '3.6'",
|
188 |
+
"version": "==4.0.9"
|
189 |
+
},
|
190 |
+
"gitpython": {
|
191 |
+
"hashes": [
|
192 |
+
"sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704",
|
193 |
+
"sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"
|
194 |
+
],
|
195 |
+
"markers": "python_version >= '3.7'",
|
196 |
+
"version": "==3.1.27"
|
197 |
+
},
|
198 |
+
"huggingface-hub": {
|
199 |
+
"hashes": [
|
200 |
+
"sha256:6395f26aaf44bbb4a73d3e14aca228fa39534696f651c6c82a6347f8c9f5950b",
|
201 |
+
"sha256:7a588046bdeb84e7bc99b3da58bbb4312a56d94ba51ebc60dfe610c18b3d0b9f"
|
202 |
+
],
|
203 |
+
"markers": "python_version >= '3.7'",
|
204 |
+
"version": "==0.9.1"
|
205 |
+
},
|
206 |
+
"idna": {
|
207 |
+
"hashes": [
|
208 |
+
"sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff",
|
209 |
+
"sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"
|
210 |
+
],
|
211 |
+
"markers": "python_version >= '3.5'",
|
212 |
+
"version": "==3.3"
|
213 |
+
},
|
214 |
+
"importlib-metadata": {
|
215 |
+
"hashes": [
|
216 |
+
"sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670",
|
217 |
+
"sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23"
|
218 |
+
],
|
219 |
+
"markers": "python_version >= '3.7'",
|
220 |
+
"version": "==4.12.0"
|
221 |
+
},
|
222 |
+
"importlib-resources": {
|
223 |
+
"hashes": [
|
224 |
+
"sha256:5481e97fb45af8dcf2f798952625591c58fe599d0735d86b10f54de086a61681",
|
225 |
+
"sha256:f78a8df21a79bcc30cfd400bdc38f314333de7c0fb619763f6b9dabab8268bb7"
|
226 |
+
],
|
227 |
+
"markers": "python_version < '3.9'",
|
228 |
+
"version": "==5.9.0"
|
229 |
+
},
|
230 |
+
"jinja2": {
|
231 |
+
"hashes": [
|
232 |
+
"sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852",
|
233 |
+
"sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"
|
234 |
+
],
|
235 |
+
"markers": "python_version >= '3.7'",
|
236 |
+
"version": "==3.1.2"
|
237 |
+
},
|
238 |
+
"joblib": {
|
239 |
+
"hashes": [
|
240 |
+
"sha256:4158fcecd13733f8be669be0683b96ebdbbd38d23559f54dca7205aea1bf1e35",
|
241 |
+
"sha256:f21f109b3c7ff9d95f8387f752d0d9c34a02aa2f7060c2135f465da0e5160ff6"
|
242 |
+
],
|
243 |
+
"markers": "python_version >= '3.6'",
|
244 |
+
"version": "==1.1.0"
|
245 |
+
},
|
246 |
+
"jsonschema": {
|
247 |
+
"hashes": [
|
248 |
+
"sha256:15062f4cc6f591400cd528d2c355f2cfa6a57e44c820dc783aee5e23d36a831f",
|
249 |
+
"sha256:9892b8d630a82990521a9ca630d3446bd316b5ad54dbe981338802787f3e0d2d"
|
250 |
+
],
|
251 |
+
"markers": "python_version >= '3.7'",
|
252 |
+
"version": "==4.14.0"
|
253 |
+
},
|
254 |
+
"markupsafe": {
|
255 |
+
"hashes": [
|
256 |
+
"sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003",
|
257 |
+
"sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88",
|
258 |
+
"sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5",
|
259 |
+
"sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7",
|
260 |
+
"sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a",
|
261 |
+
"sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603",
|
262 |
+
"sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1",
|
263 |
+
"sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135",
|
264 |
+
"sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247",
|
265 |
+
"sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6",
|
266 |
+
"sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601",
|
267 |
+
"sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77",
|
268 |
+
"sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02",
|
269 |
+
"sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e",
|
270 |
+
"sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63",
|
271 |
+
"sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f",
|
272 |
+
"sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980",
|
273 |
+
"sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b",
|
274 |
+
"sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812",
|
275 |
+
"sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff",
|
276 |
+
"sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96",
|
277 |
+
"sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1",
|
278 |
+
"sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925",
|
279 |
+
"sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a",
|
280 |
+
"sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6",
|
281 |
+
"sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e",
|
282 |
+
"sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f",
|
283 |
+
"sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4",
|
284 |
+
"sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f",
|
285 |
+
"sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3",
|
286 |
+
"sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c",
|
287 |
+
"sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a",
|
288 |
+
"sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417",
|
289 |
+
"sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a",
|
290 |
+
"sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a",
|
291 |
+
"sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37",
|
292 |
+
"sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452",
|
293 |
+
"sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933",
|
294 |
+
"sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a",
|
295 |
+
"sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"
|
296 |
+
],
|
297 |
+
"markers": "python_version >= '3.7'",
|
298 |
+
"version": "==2.1.1"
|
299 |
+
},
|
300 |
+
"nltk": {
|
301 |
+
"hashes": [
|
302 |
+
"sha256:ba3de02490308b248f9b94c8bc1ac0683e9aa2ec49ee78536d8667afb5e3eec8",
|
303 |
+
"sha256:d6507d6460cec76d70afea4242a226a7542f85c669177b9c7f562b7cf1b05502"
|
304 |
+
],
|
305 |
+
"markers": "python_version >= '3.7'",
|
306 |
+
"version": "==3.7"
|
307 |
+
},
|
308 |
+
"numpy": {
|
309 |
+
"hashes": [
|
310 |
+
"sha256:1dbe1c91269f880e364526649a52eff93ac30035507ae980d2fed33aaee633ac",
|
311 |
+
"sha256:357768c2e4451ac241465157a3e929b265dfac85d9214074985b1786244f2ef3",
|
312 |
+
"sha256:3820724272f9913b597ccd13a467cc492a0da6b05df26ea09e78b171a0bb9da6",
|
313 |
+
"sha256:4391bd07606be175aafd267ef9bea87cf1b8210c787666ce82073b05f202add1",
|
314 |
+
"sha256:4aa48afdce4660b0076a00d80afa54e8a97cd49f457d68a4342d188a09451c1a",
|
315 |
+
"sha256:58459d3bad03343ac4b1b42ed14d571b8743dc80ccbf27444f266729df1d6f5b",
|
316 |
+
"sha256:5c3c8def4230e1b959671eb959083661b4a0d2e9af93ee339c7dada6759a9470",
|
317 |
+
"sha256:5f30427731561ce75d7048ac254dbe47a2ba576229250fb60f0fb74db96501a1",
|
318 |
+
"sha256:643843bcc1c50526b3a71cd2ee561cf0d8773f062c8cbaf9ffac9fdf573f83ab",
|
319 |
+
"sha256:67c261d6c0a9981820c3a149d255a76918278a6b03b6a036800359aba1256d46",
|
320 |
+
"sha256:67f21981ba2f9d7ba9ade60c9e8cbaa8cf8e9ae51673934480e45cf55e953673",
|
321 |
+
"sha256:6aaf96c7f8cebc220cdfc03f1d5a31952f027dda050e5a703a0d1c396075e3e7",
|
322 |
+
"sha256:7c4068a8c44014b2d55f3c3f574c376b2494ca9cc73d2f1bd692382b6dffe3db",
|
323 |
+
"sha256:7c7e5fa88d9ff656e067876e4736379cc962d185d5cd808014a8a928d529ef4e",
|
324 |
+
"sha256:7f5ae4f304257569ef3b948810816bc87c9146e8c446053539947eedeaa32786",
|
325 |
+
"sha256:82691fda7c3f77c90e62da69ae60b5ac08e87e775b09813559f8901a88266552",
|
326 |
+
"sha256:8737609c3bbdd48e380d463134a35ffad3b22dc56295eff6f79fd85bd0eeeb25",
|
327 |
+
"sha256:9f411b2c3f3d76bba0865b35a425157c5dcf54937f82bbeb3d3c180789dd66a6",
|
328 |
+
"sha256:a6be4cb0ef3b8c9250c19cc122267263093eee7edd4e3fa75395dfda8c17a8e2",
|
329 |
+
"sha256:bcb238c9c96c00d3085b264e5c1a1207672577b93fa666c3b14a45240b14123a",
|
330 |
+
"sha256:bf2ec4b75d0e9356edea834d1de42b31fe11f726a81dfb2c2112bc1eaa508fcf",
|
331 |
+
"sha256:d136337ae3cc69aa5e447e78d8e1514be8c3ec9b54264e680cf0b4bd9011574f",
|
332 |
+
"sha256:d4bf4d43077db55589ffc9009c0ba0a94fa4908b9586d6ccce2e0b164c86303c",
|
333 |
+
"sha256:d6a96eef20f639e6a97d23e57dd0c1b1069a7b4fd7027482a4c5c451cd7732f4",
|
334 |
+
"sha256:d9caa9d5e682102453d96a0ee10c7241b72859b01a941a397fd965f23b3e016b",
|
335 |
+
"sha256:dd1c8f6bd65d07d3810b90d02eba7997e32abbdf1277a481d698969e921a3be0",
|
336 |
+
"sha256:e31f0bb5928b793169b87e3d1e070f2342b22d5245c755e2b81caa29756246c3",
|
337 |
+
"sha256:ecb55251139706669fdec2ff073c98ef8e9a84473e51e716211b41aa0f18e656",
|
338 |
+
"sha256:ee5ec40fdd06d62fe5d4084bef4fd50fd4bb6bfd2bf519365f569dc470163ab0",
|
339 |
+
"sha256:f17e562de9edf691a42ddb1eb4a5541c20dd3f9e65b09ded2beb0799c0cf29bb",
|
340 |
+
"sha256:fdffbfb6832cd0b300995a2b08b8f6fa9f6e856d562800fea9182316d99c4e8e"
|
341 |
+
],
|
342 |
+
"markers": "python_version < '3.11' and python_version >= '3.7'",
|
343 |
+
"version": "==1.21.6"
|
344 |
+
},
|
345 |
+
"packaging": {
|
346 |
+
"hashes": [
|
347 |
+
"sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb",
|
348 |
+
"sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"
|
349 |
+
],
|
350 |
+
"markers": "python_version >= '3.6'",
|
351 |
+
"version": "==21.3"
|
352 |
+
},
|
353 |
+
"pandas": {
|
354 |
+
"hashes": [
|
355 |
+
"sha256:1e4285f5de1012de20ca46b188ccf33521bff61ba5c5ebd78b4fb28e5416a9f1",
|
356 |
+
"sha256:2651d75b9a167cc8cc572cf787ab512d16e316ae00ba81874b560586fa1325e0",
|
357 |
+
"sha256:2c21778a688d3712d35710501f8001cdbf96eb70a7c587a3d5613573299fdca6",
|
358 |
+
"sha256:32e1a26d5ade11b547721a72f9bfc4bd113396947606e00d5b4a5b79b3dcb006",
|
359 |
+
"sha256:3345343206546545bc26a05b4602b6a24385b5ec7c75cb6059599e3d56831da2",
|
360 |
+
"sha256:344295811e67f8200de2390093aeb3c8309f5648951b684d8db7eee7d1c81fb7",
|
361 |
+
"sha256:37f06b59e5bc05711a518aa10beaec10942188dccb48918bb5ae602ccbc9f1a0",
|
362 |
+
"sha256:552020bf83b7f9033b57cbae65589c01e7ef1544416122da0c79140c93288f56",
|
363 |
+
"sha256:5cce0c6bbeb266b0e39e35176ee615ce3585233092f685b6a82362523e59e5b4",
|
364 |
+
"sha256:5f261553a1e9c65b7a310302b9dbac31cf0049a51695c14ebe04e4bfd4a96f02",
|
365 |
+
"sha256:60a8c055d58873ad81cae290d974d13dd479b82cbb975c3e1fa2cf1920715296",
|
366 |
+
"sha256:62d5b5ce965bae78f12c1c0df0d387899dd4211ec0bdc52822373f13a3a022b9",
|
367 |
+
"sha256:7d28a3c65463fd0d0ba8bbb7696b23073efee0510783340a44b08f5e96ffce0c",
|
368 |
+
"sha256:8025750767e138320b15ca16d70d5cdc1886e8f9cc56652d89735c016cd8aea6",
|
369 |
+
"sha256:8b6dbec5f3e6d5dc80dcfee250e0a2a652b3f28663492f7dab9a24416a48ac39",
|
370 |
+
"sha256:a395692046fd8ce1edb4c6295c35184ae0c2bbe787ecbe384251da609e27edcb",
|
371 |
+
"sha256:a62949c626dd0ef7de11de34b44c6475db76995c2064e2d99c6498c3dba7fe58",
|
372 |
+
"sha256:aaf183a615ad790801fa3cf2fa450e5b6d23a54684fe386f7e3208f8b9bfbef6",
|
373 |
+
"sha256:adfeb11be2d54f275142c8ba9bf67acee771b7186a5745249c7d5a06c670136b",
|
374 |
+
"sha256:b6b87b2fb39e6383ca28e2829cddef1d9fc9e27e55ad91ca9c435572cdba51bf",
|
375 |
+
"sha256:bd971a3f08b745a75a86c00b97f3007c2ea175951286cdda6abe543e687e5f2f",
|
376 |
+
"sha256:c69406a2808ba6cf580c2255bcf260b3f214d2664a3a4197d0e640f573b46fd3",
|
377 |
+
"sha256:d3bc49af96cd6285030a64779de5b3688633a07eb75c124b0747134a63f4c05f",
|
378 |
+
"sha256:fd541ab09e1f80a2a1760032d665f6e032d8e44055d602d65eeea6e6e85498cb",
|
379 |
+
"sha256:fe95bae4e2d579812865db2212bb733144e34d0c6785c0685329e5b60fcb85dd"
|
380 |
+
],
|
381 |
+
"markers": "python_full_version >= '3.7.1'",
|
382 |
+
"version": "==1.3.5"
|
383 |
+
},
|
384 |
+
"pillow": {
|
385 |
+
"hashes": [
|
386 |
+
"sha256:0030fdbd926fb85844b8b92e2f9449ba89607231d3dd597a21ae72dc7fe26927",
|
387 |
+
"sha256:030e3460861488e249731c3e7ab59b07c7853838ff3b8e16aac9561bb345da14",
|
388 |
+
"sha256:0ed2c4ef2451de908c90436d6e8092e13a43992f1860275b4d8082667fbb2ffc",
|
389 |
+
"sha256:136659638f61a251e8ed3b331fc6ccd124590eeff539de57c5f80ef3a9594e58",
|
390 |
+
"sha256:13b725463f32df1bfeacbf3dd197fb358ae8ebcd8c5548faa75126ea425ccb60",
|
391 |
+
"sha256:1536ad017a9f789430fb6b8be8bf99d2f214c76502becc196c6f2d9a75b01b76",
|
392 |
+
"sha256:15928f824870535c85dbf949c09d6ae7d3d6ac2d6efec80f3227f73eefba741c",
|
393 |
+
"sha256:17d4cafe22f050b46d983b71c707162d63d796a1235cdf8b9d7a112e97b15bac",
|
394 |
+
"sha256:1802f34298f5ba11d55e5bb09c31997dc0c6aed919658dfdf0198a2fe75d5490",
|
395 |
+
"sha256:1cc1d2451e8a3b4bfdb9caf745b58e6c7a77d2e469159b0d527a4554d73694d1",
|
396 |
+
"sha256:1fd6f5e3c0e4697fa7eb45b6e93996299f3feee73a3175fa451f49a74d092b9f",
|
397 |
+
"sha256:254164c57bab4b459f14c64e93df11eff5ded575192c294a0c49270f22c5d93d",
|
398 |
+
"sha256:2ad0d4df0f5ef2247e27fc790d5c9b5a0af8ade9ba340db4a73bb1a4a3e5fb4f",
|
399 |
+
"sha256:2c58b24e3a63efd22554c676d81b0e57f80e0a7d3a5874a7e14ce90ec40d3069",
|
400 |
+
"sha256:2d33a11f601213dcd5718109c09a52c2a1c893e7461f0be2d6febc2879ec2402",
|
401 |
+
"sha256:337a74fd2f291c607d220c793a8135273c4c2ab001b03e601c36766005f36885",
|
402 |
+
"sha256:37ff6b522a26d0538b753f0b4e8e164fdada12db6c6f00f62145d732d8a3152e",
|
403 |
+
"sha256:3d1f14f5f691f55e1b47f824ca4fdcb4b19b4323fe43cc7bb105988cad7496be",
|
404 |
+
"sha256:408673ed75594933714482501fe97e055a42996087eeca7e5d06e33218d05aa8",
|
405 |
+
"sha256:4134d3f1ba5f15027ff5c04296f13328fecd46921424084516bdb1b2548e66ff",
|
406 |
+
"sha256:4ad2f835e0ad81d1689f1b7e3fbac7b01bb8777d5a985c8962bedee0cc6d43da",
|
407 |
+
"sha256:50dff9cc21826d2977ef2d2a205504034e3a4563ca6f5db739b0d1026658e004",
|
408 |
+
"sha256:510cef4a3f401c246cfd8227b300828715dd055463cdca6176c2e4036df8bd4f",
|
409 |
+
"sha256:5aed7dde98403cd91d86a1115c78d8145c83078e864c1de1064f52e6feb61b20",
|
410 |
+
"sha256:69bd1a15d7ba3694631e00df8de65a8cb031911ca11f44929c97fe05eb9b6c1d",
|
411 |
+
"sha256:6bf088c1ce160f50ea40764f825ec9b72ed9da25346216b91361eef8ad1b8f8c",
|
412 |
+
"sha256:6e8c66f70fb539301e064f6478d7453e820d8a2c631da948a23384865cd95544",
|
413 |
+
"sha256:727dd1389bc5cb9827cbd1f9d40d2c2a1a0c9b32dd2261db522d22a604a6eec9",
|
414 |
+
"sha256:74a04183e6e64930b667d321524e3c5361094bb4af9083db5c301db64cd341f3",
|
415 |
+
"sha256:75e636fd3e0fb872693f23ccb8a5ff2cd578801251f3a4f6854c6a5d437d3c04",
|
416 |
+
"sha256:7761afe0126d046974a01e030ae7529ed0ca6a196de3ec6937c11df0df1bc91c",
|
417 |
+
"sha256:7888310f6214f19ab2b6df90f3f06afa3df7ef7355fc025e78a3044737fab1f5",
|
418 |
+
"sha256:7b0554af24df2bf96618dac71ddada02420f946be943b181108cac55a7a2dcd4",
|
419 |
+
"sha256:7c7b502bc34f6e32ba022b4a209638f9e097d7a9098104ae420eb8186217ebbb",
|
420 |
+
"sha256:808add66ea764ed97d44dda1ac4f2cfec4c1867d9efb16a33d158be79f32b8a4",
|
421 |
+
"sha256:831e648102c82f152e14c1a0938689dbb22480c548c8d4b8b248b3e50967b88c",
|
422 |
+
"sha256:93689632949aff41199090eff5474f3990b6823404e45d66a5d44304e9cdc467",
|
423 |
+
"sha256:96b5e6874431df16aee0c1ba237574cb6dff1dcb173798faa6a9d8b399a05d0e",
|
424 |
+
"sha256:9a54614049a18a2d6fe156e68e188da02a046a4a93cf24f373bffd977e943421",
|
425 |
+
"sha256:a138441e95562b3c078746a22f8fca8ff1c22c014f856278bdbdd89ca36cff1b",
|
426 |
+
"sha256:a647c0d4478b995c5e54615a2e5360ccedd2f85e70ab57fbe817ca613d5e63b8",
|
427 |
+
"sha256:a9c9bc489f8ab30906d7a85afac4b4944a572a7432e00698a7239f44a44e6efb",
|
428 |
+
"sha256:ad2277b185ebce47a63f4dc6302e30f05762b688f8dc3de55dbae4651872cdf3",
|
429 |
+
"sha256:b6d5e92df2b77665e07ddb2e4dbd6d644b78e4c0d2e9272a852627cdba0d75cf",
|
430 |
+
"sha256:bc431b065722a5ad1dfb4df354fb9333b7a582a5ee39a90e6ffff688d72f27a1",
|
431 |
+
"sha256:bdd0de2d64688ecae88dd8935012c4a72681e5df632af903a1dca8c5e7aa871a",
|
432 |
+
"sha256:c79698d4cd9318d9481d89a77e2d3fcaeff5486be641e60a4b49f3d2ecca4e28",
|
433 |
+
"sha256:cb6259196a589123d755380b65127ddc60f4c64b21fc3bb46ce3a6ea663659b0",
|
434 |
+
"sha256:d5b87da55a08acb586bad5c3aa3b86505f559b84f39035b233d5bf844b0834b1",
|
435 |
+
"sha256:dcd7b9c7139dc8258d164b55696ecd16c04607f1cc33ba7af86613881ffe4ac8",
|
436 |
+
"sha256:dfe4c1fedfde4e2fbc009d5ad420647f7730d719786388b7de0999bf32c0d9fd",
|
437 |
+
"sha256:ea98f633d45f7e815db648fd7ff0f19e328302ac36427343e4432c84432e7ff4",
|
438 |
+
"sha256:ec52c351b35ca269cb1f8069d610fc45c5bd38c3e91f9ab4cbbf0aebc136d9c8",
|
439 |
+
"sha256:eef7592281f7c174d3d6cbfbb7ee5984a671fcd77e3fc78e973d492e9bf0eb3f",
|
440 |
+
"sha256:f07f1f00e22b231dd3d9b9208692042e29792d6bd4f6639415d2f23158a80013",
|
441 |
+
"sha256:f3fac744f9b540148fa7715a435d2283b71f68bfb6d4aae24482a890aed18b59",
|
442 |
+
"sha256:fa768eff5f9f958270b081bb33581b4b569faabf8774726b283edb06617101dc",
|
443 |
+
"sha256:fac2d65901fb0fdf20363fbd345c01958a742f2dc62a8dd4495af66e3ff502a4"
|
444 |
+
],
|
445 |
+
"markers": "python_version >= '3.7'",
|
446 |
+
"version": "==9.2.0"
|
447 |
+
},
|
448 |
+
"pkgutil-resolve-name": {
|
449 |
+
"hashes": [
|
450 |
+
"sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174",
|
451 |
+
"sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"
|
452 |
+
],
|
453 |
+
"markers": "python_version < '3.9'",
|
454 |
+
"version": "==1.3.10"
|
455 |
+
},
|
456 |
+
"protobuf": {
|
457 |
+
"hashes": [
|
458 |
+
"sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf",
|
459 |
+
"sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f",
|
460 |
+
"sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f",
|
461 |
+
"sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7",
|
462 |
+
"sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996",
|
463 |
+
"sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067",
|
464 |
+
"sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c",
|
465 |
+
"sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7",
|
466 |
+
"sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9",
|
467 |
+
"sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c",
|
468 |
+
"sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739",
|
469 |
+
"sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91",
|
470 |
+
"sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c",
|
471 |
+
"sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153",
|
472 |
+
"sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9",
|
473 |
+
"sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388",
|
474 |
+
"sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e",
|
475 |
+
"sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab",
|
476 |
+
"sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde",
|
477 |
+
"sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531",
|
478 |
+
"sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8",
|
479 |
+
"sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7",
|
480 |
+
"sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20",
|
481 |
+
"sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3"
|
482 |
+
],
|
483 |
+
"markers": "python_version >= '3.7'",
|
484 |
+
"version": "==3.20.1"
|
485 |
+
},
|
486 |
+
"pyarrow": {
|
487 |
+
"hashes": [
|
488 |
+
"sha256:0238998dc692efcb4e41ae74738d7c1234723271ccf520bd8312dca07d49ef8d",
|
489 |
+
"sha256:02b820ecd1da02012092c180447de449fc688d0c3f9ff8526ca301cdd60dacd0",
|
490 |
+
"sha256:1c5a073a930c632058461547e0bc572da1e724b17b6b9eb31a97da13f50cb6e0",
|
491 |
+
"sha256:29eb3e086e2b26202f3a4678316b93cfb15d0e2ba20f3ec12db8fd9cc07cde63",
|
492 |
+
"sha256:2c715eca2092273dcccf6f08437371e04d112f9354245ba2fbe6c801879450b7",
|
493 |
+
"sha256:2e753f8fcf07d8e3a0efa0c8bd51fef5c90281ffd4c5637c08ce42cd0ac297de",
|
494 |
+
"sha256:3eef8a981f45d89de403e81fb83b8119c20824caddf1404274e41a5d66c73806",
|
495 |
+
"sha256:4eebdab05afa23d5d5274b24c1cbeb1ba017d67c280f7d39fd8a8f18cbad2ec9",
|
496 |
+
"sha256:5526a3bfb404ff6d31d62ea582cf2466c7378a474a99ee04d1a9b05de5264541",
|
497 |
+
"sha256:55328348b9139c2b47450d512d716c2248fd58e2f04e2fc23a65e18726666d42",
|
498 |
+
"sha256:767cafb14278165ad539a2918c14c1b73cf20689747c21375c38e3fe62884902",
|
499 |
+
"sha256:7fa56cbd415cef912677270b8e41baad70cde04c6d8a8336eeb2aba85aa93706",
|
500 |
+
"sha256:7fb02bebc13ab55573d1ae9bb5002a6d20ba767bf8569b52fce5301d42495ab7",
|
501 |
+
"sha256:81a60bb291a964f63b2717fb1b28f6615ffab7e8585322bfb8a6738e6b321282",
|
502 |
+
"sha256:8ad430cee28ebc4d6661fc7315747c7a18ae2a74e67498dcb039e1c762a2fb67",
|
503 |
+
"sha256:92f3977e901db1ef5cba30d6cc1d7942b8d94b910c60f89013e8f7bb86a86eef",
|
504 |
+
"sha256:9cef618159567d5f62040f2b79b1c7b38e3885f4ffad0ec97cd2d86f88b67cef",
|
505 |
+
"sha256:a5b390bdcfb8c5b900ef543f911cdfec63e88524fafbcc15f83767202a4a2491",
|
506 |
+
"sha256:d9eb04db626fa24fdfb83c00f76679ca0d98728cdbaa0481b6402bf793a290c0",
|
507 |
+
"sha256:da3e0f319509a5881867effd7024099fb06950a0768dad0d6873668bb88cfaba",
|
508 |
+
"sha256:f11a645a41ee531c3a5edda45dea07c42267f52571f818d388971d33fc7e2d4a",
|
509 |
+
"sha256:f241bd488c2705df930eedfe304ada71191dcf67d6b98ceda0cc934fd2a8388e",
|
510 |
+
"sha256:f59bcd5217a3ae1e17870792f82b2ff92df9f3862996e2c78e156c13e56ff62e",
|
511 |
+
"sha256:f8c46bde1030d704e2796182286d1c56846552c50a39ad5bf5a20c0d8159fc35",
|
512 |
+
"sha256:fc856628acd8d281652c15b6268ec7f27ebcb015abbe99d9baad17f02adc51f1",
|
513 |
+
"sha256:fe2ce795fa1d95e4e940fe5661c3c58aee7181c730f65ac5dd8794a77228de59"
|
514 |
+
],
|
515 |
+
"markers": "python_version >= '3.7'",
|
516 |
+
"version": "==9.0.0"
|
517 |
+
},
|
518 |
+
"pydeck": {
|
519 |
+
"hashes": [
|
520 |
+
"sha256:b446e810e3c615e1604f4364e0e162ba371712805fab97a6b7722200b286b466",
|
521 |
+
"sha256:f7dec070b954b88d17795a4a41fe59192843f4f4cd9ecedde4eab167d0096c40"
|
522 |
+
],
|
523 |
+
"markers": "python_version >= '3.7'",
|
524 |
+
"version": "==0.8.0b1"
|
525 |
+
},
|
526 |
+
"pygments": {
|
527 |
+
"hashes": [
|
528 |
+
"sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1",
|
529 |
+
"sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"
|
530 |
+
],
|
531 |
+
"markers": "python_version >= '3.6'",
|
532 |
+
"version": "==2.13.0"
|
533 |
+
},
|
534 |
+
"pympler": {
|
535 |
+
"hashes": [
|
536 |
+
"sha256:993f1a3599ca3f4fcd7160c7545ad06310c9e12f70174ae7ae8d4e25f6c5d3fa",
|
537 |
+
"sha256:d260dda9ae781e1eab6ea15bacb84015849833ba5555f141d2d9b7b7473b307d"
|
538 |
+
],
|
539 |
+
"markers": "python_version >= '3.6'",
|
540 |
+
"version": "==1.0.1"
|
541 |
+
},
|
542 |
+
"pyparsing": {
|
543 |
+
"hashes": [
|
544 |
+
"sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb",
|
545 |
+
"sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"
|
546 |
+
],
|
547 |
+
"markers": "python_full_version >= '3.6.8'",
|
548 |
+
"version": "==3.0.9"
|
549 |
+
},
|
550 |
+
"pyrsistent": {
|
551 |
+
"hashes": [
|
552 |
+
"sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c",
|
553 |
+
"sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc",
|
554 |
+
"sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e",
|
555 |
+
"sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26",
|
556 |
+
"sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec",
|
557 |
+
"sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286",
|
558 |
+
"sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045",
|
559 |
+
"sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec",
|
560 |
+
"sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8",
|
561 |
+
"sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c",
|
562 |
+
"sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca",
|
563 |
+
"sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22",
|
564 |
+
"sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a",
|
565 |
+
"sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96",
|
566 |
+
"sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc",
|
567 |
+
"sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1",
|
568 |
+
"sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07",
|
569 |
+
"sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6",
|
570 |
+
"sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b",
|
571 |
+
"sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5",
|
572 |
+
"sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6"
|
573 |
+
],
|
574 |
+
"markers": "python_version >= '3.7'",
|
575 |
+
"version": "==0.18.1"
|
576 |
+
},
|
577 |
+
"pysocks": {
|
578 |
+
"hashes": [
|
579 |
+
"sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299",
|
580 |
+
"sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5",
|
581 |
+
"sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"
|
582 |
+
],
|
583 |
+
"version": "==1.7.1"
|
584 |
+
},
|
585 |
+
"python-dateutil": {
|
586 |
+
"hashes": [
|
587 |
+
"sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
|
588 |
+
"sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
|
589 |
+
],
|
590 |
+
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
591 |
+
"version": "==2.8.2"
|
592 |
+
},
|
593 |
+
"python-dotenv": {
|
594 |
+
"hashes": [
|
595 |
+
"sha256:b7e3b04a59693c42c36f9ab1cc2acc46fa5df8c78e178fc33a8d4cd05c8d498f",
|
596 |
+
"sha256:d92a187be61fe482e4fd675b6d52200e7be63a12b724abbf931a40ce4fa92938"
|
597 |
+
],
|
598 |
+
"index": "pypi",
|
599 |
+
"version": "==0.20.0"
|
600 |
+
},
|
601 |
+
"pytz": {
|
602 |
+
"hashes": [
|
603 |
+
"sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197",
|
604 |
+
"sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5"
|
605 |
+
],
|
606 |
+
"version": "==2022.2.1"
|
607 |
+
},
|
608 |
+
"pytz-deprecation-shim": {
|
609 |
+
"hashes": [
|
610 |
+
"sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6",
|
611 |
+
"sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d"
|
612 |
+
],
|
613 |
+
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
|
614 |
+
"version": "==0.1.0.post0"
|
615 |
+
},
|
616 |
+
"pyyaml": {
|
617 |
+
"hashes": [
|
618 |
+
"sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293",
|
619 |
+
"sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b",
|
620 |
+
"sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57",
|
621 |
+
"sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b",
|
622 |
+
"sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4",
|
623 |
+
"sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07",
|
624 |
+
"sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba",
|
625 |
+
"sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9",
|
626 |
+
"sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287",
|
627 |
+
"sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513",
|
628 |
+
"sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0",
|
629 |
+
"sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0",
|
630 |
+
"sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92",
|
631 |
+
"sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f",
|
632 |
+
"sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2",
|
633 |
+
"sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc",
|
634 |
+
"sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c",
|
635 |
+
"sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86",
|
636 |
+
"sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4",
|
637 |
+
"sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c",
|
638 |
+
"sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34",
|
639 |
+
"sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b",
|
640 |
+
"sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c",
|
641 |
+
"sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb",
|
642 |
+
"sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737",
|
643 |
+
"sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3",
|
644 |
+
"sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d",
|
645 |
+
"sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53",
|
646 |
+
"sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78",
|
647 |
+
"sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803",
|
648 |
+
"sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a",
|
649 |
+
"sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174",
|
650 |
+
"sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"
|
651 |
+
],
|
652 |
+
"markers": "python_version >= '3.6'",
|
653 |
+
"version": "==6.0"
|
654 |
+
},
|
655 |
+
"regex": {
|
656 |
+
"hashes": [
|
657 |
+
"sha256:02b6dc102123f5178796dcdb5a90f6e88895607fd1a1d115d8de1af8161ca2b4",
|
658 |
+
"sha256:0843cc977b9cc00eb2299b624db6481d25e7f5b093f7a7c2bb727028d4a26eda",
|
659 |
+
"sha256:085ca3dc9360c0210e0a70e5d34d66454a06077644e7679fef6358b1f053e62e",
|
660 |
+
"sha256:0a9d5a64e974bc5f160f30f76aaf993d49eeddb405676be6bf76a5a2c131e185",
|
661 |
+
"sha256:0de0ce11c0835e1117eacbfe8fa6fa98dc0e8e746b486735cb0fdebe46a02222",
|
662 |
+
"sha256:1418d3506a9582b23a27373f125ea2b0da523c581e7cf678a6f036254d134faa",
|
663 |
+
"sha256:14750172c0a616140a8f496dfef28ed24080e87d06d5838e008f959ad307a8c5",
|
664 |
+
"sha256:1b6d2c579ffdcbb3d93f63b6a7f697364594e1c1b6856958b3e61e3ca22c140a",
|
665 |
+
"sha256:1df31eaf147ecff3665ba861acb8f78221cd5501df072c9151dfa341dd24599f",
|
666 |
+
"sha256:21b6f939916aa61beea56393ebc8a9999060632ac22b8193c2cb67d6fd7cb2c3",
|
667 |
+
"sha256:2240fce3af236e4586a045c1be8bbf16c4f8831e68b7df918b72fc31a80143be",
|
668 |
+
"sha256:242f546fc5e49bb7395624ac3b4fc168bf454e11ace9804c58c4c3a90d84e38f",
|
669 |
+
"sha256:25bffa248b99b53a61b1f20fc7d19f711e38e9f0bc90d44c26670f8dc282ad7d",
|
670 |
+
"sha256:2ada67e02fa3fcca9e3b90cf24c2c6bc77f0abc126209937956aea10eeba40c7",
|
671 |
+
"sha256:2c198921afc811bc0f105c6e5150fbdebf9520c9b7d43cfc0ab156ca97f506d7",
|
672 |
+
"sha256:370b1d7aed26e29915c3fb3e72e327f194824a76cedb60c0b9f6c6af53e89d72",
|
673 |
+
"sha256:3aafbbf5076f2a48bcf31ceb42b410323daaa0ddb42544640592957bc906ace6",
|
674 |
+
"sha256:3d3d769b3d485b28d6a591b46723dbacc696e6503f48a3ef52e6fc2c90edb482",
|
675 |
+
"sha256:3d83fd6dd4263595d0e4f595d4abd54397cbed52c0147f7dd148a7b72910301e",
|
676 |
+
"sha256:45cb798095b886e4df6ff4a1f7661eb70620ccdef127e3c3e00a1aaa22d30e53",
|
677 |
+
"sha256:4bd9443f7ff6e6288dd4496215c5d903f851e55cbc09d5963587af0c6d565a0a",
|
678 |
+
"sha256:4bdfd016ab12c4075ef93f025b3cf4c8962b9b7a5e52bb7039ab64cb7755930c",
|
679 |
+
"sha256:4c6554073e3e554fbb3dff88376ada3da32ca789ea1b9e381f684d49ddb61199",
|
680 |
+
"sha256:4dad9d68574e93e1e23be53b4ecfb0f083bd5cc08cc7f1984a4ee3ebf12aa446",
|
681 |
+
"sha256:4e12a3c2d4781ee5d03f229c940934fa1e4ea4f4995e68ab97a2815b139e0804",
|
682 |
+
"sha256:53c9eca0d6070a8a3de42182ad26daf90ba12132eb74a2f45702332762aff84e",
|
683 |
+
"sha256:5910bb355f9517309f77101238dbacb7151ede3434a2f1fad26ecc62f13d8324",
|
684 |
+
"sha256:5c77eab46f3a2b2cd8bbe06467df783543bf7396df431eb4a144cc4b89e9fb3c",
|
685 |
+
"sha256:5d541bc430a74c787684d1ebcd205a5212a88c3de73848143e77489b2c25b911",
|
686 |
+
"sha256:5e7c8f9f8824143c219dd93cdc733c20d2c12f154034c89bcb4911db8e45bd92",
|
687 |
+
"sha256:5f14430535645712f546f1e07013507d1cc0c8abd851811dacce8c7fb584bf52",
|
688 |
+
"sha256:6059ae91667932d256d9dc03abd3512ebcade322b3a42d1b8354bd1db7f66dcc",
|
689 |
+
"sha256:61f6966371fa1cbf26c6209771a02bef80336cdaca0c0af4dfa33d51019c0b93",
|
690 |
+
"sha256:62d56a9d3c1e5a83076db4da060dad7ea35ac2f3cbd3c53ba5a51fe0caedb500",
|
691 |
+
"sha256:634f090a388351eadf1dcc1d168a190718fb68efb4b8fdc1b119cf837ca01905",
|
692 |
+
"sha256:64ecfcc386420192fbe98fdde777d993f7f2dfec9552e4f4024d3447d3a3e637",
|
693 |
+
"sha256:6af38997f178889d417851bae8fb5c00448f7405cfcab38734d771f1dd5d5973",
|
694 |
+
"sha256:6b30c8d299ba48ee919064628fd8bc296bdc6e4827d315491bea39437130d3e1",
|
695 |
+
"sha256:6f0c8807bac16984901c0573725bad786f2f004f9bd5df8476c6431097b6c5b3",
|
696 |
+
"sha256:6f62c8a59f6b8e608880c61b138ae22668184bc266b025d33200dcf2cebe0872",
|
697 |
+
"sha256:74d4aabd612d32282f3cb3ebb4436046fb840d25c754157a755bc9f66e7cd307",
|
698 |
+
"sha256:7658d2dfc1dabfb008ffe12ae47b98559e2aedd8237bee12f5aafb74d90479e3",
|
699 |
+
"sha256:777ceea2860a48e9e362a4e2a9a691782ea97bd05c24627c92e876fdd2c22e61",
|
700 |
+
"sha256:79f34d5833cd0d53ecf48bc030e4da3216bd4846224d17eeb64509be5cb098fd",
|
701 |
+
"sha256:7a52d547259495a53e61e37ffc6d5cecf8d298aeb1bc0d9b25289d65ddb31183",
|
702 |
+
"sha256:840063aa8eeb1dda07d7d7dee15648838bffef1d415f5f79061854a182a429aa",
|
703 |
+
"sha256:8e8ec94d1b1a0a297c2c69a0bf000baf9a79607ca0c084f577f811a9b447c319",
|
704 |
+
"sha256:95fb62a3980cf43e76c2fe95edab06ec70dc495b8aa660975eb9f0b2ffdae1e1",
|
705 |
+
"sha256:9668da78bcc219542467f51c2cd01894222be6aceec4b5efb806705900b794d8",
|
706 |
+
"sha256:99a7c5786de9e92ff5ffee2e8bed745f5d25495206f3f14656c379031e518334",
|
707 |
+
"sha256:a1e283ad918df44bad3ccf042c2fe283c63d17617570eb91b8c370ef677b0b83",
|
708 |
+
"sha256:a25d251546acb5edb1635631c4ae0e330fa4ec7c6316c01d256728fbfb9bbff2",
|
709 |
+
"sha256:abe1adb32e2535aaa171e8b2b2d3f083f863c9974a3e6e7dae6bf4827fc8b983",
|
710 |
+
"sha256:ae85112da2d826b65aa7c7369c56ca41d9a89644312172979cbee5cf788e0b09",
|
711 |
+
"sha256:b3379a83dc63fe06538c751961f9ed730b5d7f08f96a57bbad8d52db5820df1f",
|
712 |
+
"sha256:b3c7c6c4aac19b964c1d12784aecae7f0315314640b0f41dd6f0d4e2bf439072",
|
713 |
+
"sha256:b7ddecc80e87acf12c2cf12bf3721def47188c403f04e706f104b5e71fed2f31",
|
714 |
+
"sha256:bbaf6785d3f1cd3e617b9d0fb3c5528023ef7bc7cc1356234801dc1941df8ce9",
|
715 |
+
"sha256:be6f5b453f7ed2219a9555bb6840663950b9ab1dc034216f68eac64db66633c2",
|
716 |
+
"sha256:c2b6404631b22617b5127c6de2355393ccda693ca733a098b6802e7dabb3457a",
|
717 |
+
"sha256:c4f6609f6e867a58cdf173e1cbe1f3736d25962108bd5cb01ad5a130875ff2c8",
|
718 |
+
"sha256:c76dd2c0615a28de21c97f9f6862e84faef58ff4d700196b4e395ef6a52291e4",
|
719 |
+
"sha256:c78c72f7878071a78337510ec78ab856d60b4bdcd3a95fd68b939e7cb30434b3",
|
720 |
+
"sha256:cb0c9a1476d279524538ba9a00ecec9eadcef31a6a60b2c8bd2f29f62044a559",
|
721 |
+
"sha256:ccb986e80674c929f198464bce55e995178dea26833421e2479ff04a6956afac",
|
722 |
+
"sha256:cfa62063c5eafb04e4435459ce15746b4ae6c14efeae8f16bd0e3d2895dad698",
|
723 |
+
"sha256:d13bd83284b46c304eb10de93f8a3f2c80361f91f4e8a4e1273caf83e16c4409",
|
724 |
+
"sha256:d76e585368388d99ddd2f95989e6ac80a8fe23115e93931faad99fa34550612f",
|
725 |
+
"sha256:dc32029b9cc784a529f9201289d4f841cc24a2ae3126a112cd467bc41bbc2f10",
|
726 |
+
"sha256:e0b55651db770b4b5a6c7d015f24d1a6ede307296bbdf0c47fc5f6a6adc7abee",
|
727 |
+
"sha256:e37886929ee83a5fa5c73164abada00e7f3cc1cbf3f8f6e1e8cfecae9d6cfc47",
|
728 |
+
"sha256:f7b88bc7306136b123fd1a9beed16ca02900ee31d1c36e73fa33d9e525a5562d",
|
729 |
+
"sha256:fac611bde2609a46fcbd92da7171286faa2f5c191f84d22f61cd7dc27213f51d",
|
730 |
+
"sha256:fafed60103132e74cdfbd651abe94801eb87a9765ce275b3dca9af8f3e06622a"
|
731 |
+
],
|
732 |
+
"markers": "python_version >= '3.6'",
|
733 |
+
"version": "==2022.8.17"
|
734 |
+
},
|
735 |
+
"requests": {
|
736 |
+
"hashes": [
|
737 |
+
"sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983",
|
738 |
+
"sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"
|
739 |
+
],
|
740 |
+
"markers": "python_version >= '3.7' and python_version < '4'",
|
741 |
+
"version": "==2.28.1"
|
742 |
+
},
|
743 |
+
"rich": {
|
744 |
+
"hashes": [
|
745 |
+
"sha256:2eb4e6894cde1e017976d2975ac210ef515d7548bc595ba20e195fb9628acdeb",
|
746 |
+
"sha256:63a5c5ce3673d3d5fbbf23cd87e11ab84b6b451436f1b7f19ec54b6bc36ed7ca"
|
747 |
+
],
|
748 |
+
"markers": "python_version < '4' and python_full_version >= '3.6.3'",
|
749 |
+
"version": "==12.5.1"
|
750 |
+
},
|
751 |
+
"semver": {
|
752 |
+
"hashes": [
|
753 |
+
"sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4",
|
754 |
+
"sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"
|
755 |
+
],
|
756 |
+
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
757 |
+
"version": "==2.13.0"
|
758 |
+
},
|
759 |
+
"six": {
|
760 |
+
"hashes": [
|
761 |
+
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
|
762 |
+
"sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
|
763 |
+
],
|
764 |
+
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
765 |
+
"version": "==1.16.0"
|
766 |
+
},
|
767 |
+
"smmap": {
|
768 |
+
"hashes": [
|
769 |
+
"sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94",
|
770 |
+
"sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"
|
771 |
+
],
|
772 |
+
"markers": "python_version >= '3.6'",
|
773 |
+
"version": "==5.0.0"
|
774 |
+
},
|
775 |
+
"soupsieve": {
|
776 |
+
"hashes": [
|
777 |
+
"sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759",
|
778 |
+
"sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"
|
779 |
+
],
|
780 |
+
"markers": "python_version >= '3.6'",
|
781 |
+
"version": "==2.3.2.post1"
|
782 |
+
},
|
783 |
+
"streamlit": {
|
784 |
+
"hashes": [
|
785 |
+
"sha256:c56d0775feb39116ff90a8b01ee15be27212ee50abb88943607205d26d1d9923",
|
786 |
+
"sha256:f0461bebd6c1b58c38f0f602ee9bb6699f66dfe14fd2e05abc25ebe96ff4ba21"
|
787 |
+
],
|
788 |
+
"index": "pypi",
|
789 |
+
"version": "==1.12.2"
|
790 |
+
},
|
791 |
+
"tokenizers": {
|
792 |
+
"hashes": [
|
793 |
+
"sha256:01abe6fbfe55e4131ca0c4c3d1a9d7ef5df424a8d536e998d2a4fc0bc57935f4",
|
794 |
+
"sha256:070746f86efa6c873db341e55cf17bb5e7bdd5450330ca8eca542f5c3dab2c66",
|
795 |
+
"sha256:0bf2380ad59c50222959a9b6f231339200a826fc5cb2be09ff96d8a59f65fc5e",
|
796 |
+
"sha256:2158baf80cbc09259bfd6e0e0fc4597b611e7a72ad5443dad63918a90f1dd304",
|
797 |
+
"sha256:230f51a0a82ca7b90077eaca2415f12ff9bd144607888b9c50c2ee543452322e",
|
798 |
+
"sha256:258873634406bd1d438c799993a5e44bbc0132ff055985c03c4fe30f702e9a33",
|
799 |
+
"sha256:27d93b712aa2d4346aa506ecd4ec9e94edeebeaf2d484357b482cdeffc02b5f5",
|
800 |
+
"sha256:28825dade9e52ad464164020758f9d49eb7251c32b6ae146601c506a23c67c0e",
|
801 |
+
"sha256:38625595b2fd37bfcce64ff9bfb6868c07e9a7b7f205c909d94a615ce9472287",
|
802 |
+
"sha256:3f2647cc256d6a53d18b9dcd71d377828e9f8991fbcbd6fcd8ca2ceb174552b0",
|
803 |
+
"sha256:411ebc89228f30218ffa9d9c49d414864b0df5026a47c24820431821c4360460",
|
804 |
+
"sha256:419d113e3bcc4fe20a313afc47af81e62906306b08fe1601e1443d747d46af1f",
|
805 |
+
"sha256:5188e13fc09edfe05712ca3ae5a44e7f2b0137927b1ca210d0fad90d3e58315a",
|
806 |
+
"sha256:53b5f4012ce3ffddd5b00827441b80dc7a0f6b41f4fc5248ae6d36e7d3920c6d",
|
807 |
+
"sha256:619728df2551bdfe6f96ff177f9ded958e7ed9e2af94c8d5ac2834d1eb06d112",
|
808 |
+
"sha256:62a723bd4b18bc55121f5c34cd8efd6c651f2d3b81f81dd50e5351fb65b8a617",
|
809 |
+
"sha256:664f36f0a0d409c24f2201d495161fec4d8bc93e091fbb78814eb426f29905a3",
|
810 |
+
"sha256:6a38b2019d4807d42afeff603a119094ee00f63bea2921136524c8814e9003f8",
|
811 |
+
"sha256:6a7a106d04154c2159db6cd7d042af2e2e0e53aee432f872fe6c8be45100436a",
|
812 |
+
"sha256:7c5c54080a7d5c89c990e0d478e0882dbac88926d43323a3aa236492a3c9455f",
|
813 |
+
"sha256:7d43de14b4469b57490dbaf136a31c266cb676fa22320f01f230af9219ae9034",
|
814 |
+
"sha256:7f4cb68dc538b52240d1986d2034eb0a6373be2ab5f0787d1be3ad1444ce71b7",
|
815 |
+
"sha256:8cea98f3f9577d1541b7bb0f7a3308a911751067e1d83e01485c9d3411bbf087",
|
816 |
+
"sha256:8d4339c376b695de2ad8ccaebffa75e4dc1d7857be1103d80e7925b34af8cf78",
|
817 |
+
"sha256:91906d725cb84d8ee71ce05fbb155d39d494849622b4f9349e5176a8eb01c49b",
|
818 |
+
"sha256:ae6c04b629ac2cd2f695739988cb70b9bd8d5e7f849f5b14c4510e942bee5770",
|
819 |
+
"sha256:b9779944559cb7ace6a8516e402895f239b0d9d3c833c67dbaec496310e7e206",
|
820 |
+
"sha256:bdbca79726fe883c696088ea163715b2f902aec638a8e24bcf9790ff8fa45019",
|
821 |
+
"sha256:cdeba37c2fb44e1aec8a72af4cb369655b59ba313181b1b4b8183f08e759c49c",
|
822 |
+
"sha256:d737df0f8f26e093a82bfb106b6cfb510a0e9302d35834568e5b20b73ddc5a9c",
|
823 |
+
"sha256:eff5ff411f18a201eec137b7b32fcb55e0c48b372d370bd24f965f5bad471fa4",
|
824 |
+
"sha256:f1271224acafb27639c432e1ce4e7d38eab40305ba1c546e871d5c8a32f4f195",
|
825 |
+
"sha256:fde8dccb9033fa344ffce3ee1837939a50e7a210a768f1cf2059beeafa755481"
|
826 |
+
],
|
827 |
+
"version": "==0.12.1"
|
828 |
+
},
|
829 |
+
"toml": {
|
830 |
+
"hashes": [
|
831 |
+
"sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b",
|
832 |
+
"sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"
|
833 |
+
],
|
834 |
+
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
835 |
+
"version": "==0.10.2"
|
836 |
+
},
|
837 |
+
"toolz": {
|
838 |
+
"hashes": [
|
839 |
+
"sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f",
|
840 |
+
"sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194"
|
841 |
+
],
|
842 |
+
"markers": "python_version >= '3.5'",
|
843 |
+
"version": "==0.12.0"
|
844 |
+
},
|
845 |
+
"torch": {
|
846 |
+
"hashes": [
|
847 |
+
"sha256:03e31c37711db2cd201e02de5826de875529e45a55631d317aadce2f1ed45aa8",
|
848 |
+
"sha256:0b44601ec56f7dd44ad8afc00846051162ef9c26a8579dda0a02194327f2d55e",
|
849 |
+
"sha256:42e115dab26f60c29e298559dbec88444175528b729ae994ec4c65d56fe267dd",
|
850 |
+
"sha256:42f639501928caabb9d1d55ddd17f07cd694de146686c24489ab8c615c2871f2",
|
851 |
+
"sha256:4e1b9c14cf13fd2ab8d769529050629a0e68a6fc5cb8e84b4a3cc1dd8c4fe541",
|
852 |
+
"sha256:68104e4715a55c4bb29a85c6a8d57d820e0757da363be1ba680fa8cc5be17b52",
|
853 |
+
"sha256:69fe2cae7c39ccadd65a123793d30e0db881f1c1927945519c5c17323131437e",
|
854 |
+
"sha256:6cf6f54b43c0c30335428195589bd00e764a6d27f3b9ba637aaa8c11aaf93073",
|
855 |
+
"sha256:743784ccea0dc8f2a3fe6a536bec8c4763bd82c1352f314937cb4008d4805de1",
|
856 |
+
"sha256:8a34a2fbbaa07c921e1b203f59d3d6e00ed379f2b384445773bd14e328a5b6c8",
|
857 |
+
"sha256:976c3f997cea38ee91a0dd3c3a42322785414748d1761ef926b789dfa97c6134",
|
858 |
+
"sha256:9b356aea223772cd754edb4d9ecf2a025909b8615a7668ac7d5130f86e7ec421",
|
859 |
+
"sha256:9c038662db894a23e49e385df13d47b2a777ffd56d9bcd5b832593fab0a7e286",
|
860 |
+
"sha256:a8320ba9ad87e80ca5a6a016e46ada4d1ba0c54626e135d99b2129a4541c509d",
|
861 |
+
"sha256:b5dbcca369800ce99ba7ae6dee3466607a66958afca3b740690d88168752abcf",
|
862 |
+
"sha256:bfec2843daa654f04fda23ba823af03e7b6f7650a873cdb726752d0e3718dada",
|
863 |
+
"sha256:cd26d8c5640c3a28c526d41ccdca14cf1cbca0d0f2e14e8263a7ac17194ab1d2",
|
864 |
+
"sha256:e9c8f4a311ac29fc7e8e955cfb7733deb5dbe1bdaabf5d4af2765695824b7e0d",
|
865 |
+
"sha256:f00c721f489089dc6364a01fd84906348fe02243d0af737f944fddb36003400d",
|
866 |
+
"sha256:f3b52a634e62821e747e872084ab32fbcb01b7fa7dbb7471b6218279f02a178a"
|
867 |
+
],
|
868 |
+
"markers": "python_version >= '3.7'",
|
869 |
+
"version": "==1.12.1"
|
870 |
+
},
|
871 |
+
"tornado": {
|
872 |
+
"hashes": [
|
873 |
+
"sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca",
|
874 |
+
"sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72",
|
875 |
+
"sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23",
|
876 |
+
"sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8",
|
877 |
+
"sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b",
|
878 |
+
"sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9",
|
879 |
+
"sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13",
|
880 |
+
"sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75",
|
881 |
+
"sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac",
|
882 |
+
"sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e",
|
883 |
+
"sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b"
|
884 |
+
],
|
885 |
+
"markers": "python_version >= '3.7'",
|
886 |
+
"version": "==6.2"
|
887 |
+
},
|
888 |
+
"tqdm": {
|
889 |
+
"hashes": [
|
890 |
+
"sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d",
|
891 |
+
"sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6"
|
892 |
+
],
|
893 |
+
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
894 |
+
"version": "==4.64.0"
|
895 |
+
},
|
896 |
+
"transformers": {
|
897 |
+
"hashes": [
|
898 |
+
"sha256:07f3df80144f7f032ad5d367507445980d4aa25855a5d658cfa47ac5fff32aca",
|
899 |
+
"sha256:c03c150857e2d8f18f6dcb51e3061207522425ad57a0a6dc6cde407226a45e3e"
|
900 |
+
],
|
901 |
+
"markers": "python_version >= '3.7'",
|
902 |
+
"version": "==4.21.2"
|
903 |
+
},
|
904 |
+
"typing-extensions": {
|
905 |
+
"hashes": [
|
906 |
+
"sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02",
|
907 |
+
"sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6"
|
908 |
+
],
|
909 |
+
"markers": "python_version >= '3.7'",
|
910 |
+
"version": "==4.3.0"
|
911 |
+
},
|
912 |
+
"tzdata": {
|
913 |
+
"hashes": [
|
914 |
+
"sha256:21f4f0d7241572efa7f7a4fdabb052e61b55dc48274e6842697ccdf5253e5451",
|
915 |
+
"sha256:c3119520447d68ef3eb8187a55a4f44fa455f30eb1b4238fa5691ba094f2b05b"
|
916 |
+
],
|
917 |
+
"markers": "python_version >= '3.6'",
|
918 |
+
"version": "==2022.2"
|
919 |
+
},
|
920 |
+
"tzlocal": {
|
921 |
+
"hashes": [
|
922 |
+
"sha256:89885494684c929d9191c57aa27502afc87a579be5cdd3225c77c463ea043745",
|
923 |
+
"sha256:ee5842fa3a795f023514ac2d801c4a81d1743bbe642e3940143326b3a00addd7"
|
924 |
+
],
|
925 |
+
"markers": "python_version >= '3.6'",
|
926 |
+
"version": "==4.2"
|
927 |
+
},
|
928 |
+
"urllib3": {
|
929 |
+
"hashes": [
|
930 |
+
"sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e",
|
931 |
+
"sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"
|
932 |
+
],
|
933 |
+
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_version < '4'",
|
934 |
+
"version": "==1.26.12"
|
935 |
+
},
|
936 |
+
"validators": {
|
937 |
+
"hashes": [
|
938 |
+
"sha256:24148ce4e64100a2d5e267233e23e7afeb55316b47d30faae7eb6e7292bc226a"
|
939 |
+
],
|
940 |
+
"markers": "python_version >= '3.4'",
|
941 |
+
"version": "==0.20.0"
|
942 |
+
},
|
943 |
+
"zipp": {
|
944 |
+
"hashes": [
|
945 |
+
"sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2",
|
946 |
+
"sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009"
|
947 |
+
],
|
948 |
+
"markers": "python_version >= '3.7'",
|
949 |
+
"version": "==3.8.1"
|
950 |
+
}
|
951 |
+
},
|
952 |
+
"develop": {}
|
953 |
+
}
|
twNLP-app/README.md
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# **ckip-cwn-app**
|
2 |
+
中文很適合拿來探索自然語言處理管線的標記語言。這個探索過程也可反應生成語言架構多年來牽制語言理論,以及它對於自然語言處理與理解的想像影響。
|
3 |
+
|
4 |
+
## **Documentation**
|
5 |
+
### 1. Installation
|
6 |
+
|
7 |
+
1. Python version
|
8 |
+
* `python == 3.7.5`
|
9 |
+
|
10 |
+
2. Clone repository
|
11 |
+
|
12 |
+
```bash
|
13 |
+
git clone [email protected]:lopentu/nlp_web.git
|
14 |
+
```
|
15 |
+
|
16 |
+
3. Install Requirement
|
17 |
+
```bash
|
18 |
+
cd nlp_web/assignments/twNLP-app && pip install -r requirements.txt
|
19 |
+
```
|
20 |
+
|
21 |
+
|
22 |
+
### 2. Start the app
|
23 |
+
There are two main ways to run the app:
|
24 |
+
|
25 |
+
- run with Python
|
26 |
+
|
27 |
+
First make sure you are in the `twNLP-app` folder, and then simply run:
|
28 |
+
|
29 |
+
```bash
|
30 |
+
streamlit run src/app.py
|
31 |
+
```
|
32 |
+
|
33 |
+
- run with Docker
|
34 |
+
|
35 |
+
Install Docker, and user the following command to run:
|
36 |
+
|
37 |
+
```bash
|
38 |
+
docker-compose up
|
39 |
+
```
|
40 |
+
|
41 |
+
Then acces `http://localhost` in the browser.
|
42 |
+
|
43 |
+
|
44 |
+
## Contact
|
45 |
+
If you have any suggestion or question, please do not hesitate to email us at [email protected] or [email protected]
|
twNLP-app/deployment/nginx.conf
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
worker_processes auto;
|
2 |
+
|
3 |
+
events {
|
4 |
+
worker_connections 1024;
|
5 |
+
multi_accept on;
|
6 |
+
}
|
7 |
+
|
8 |
+
http {
|
9 |
+
map $http_upgrade $connection_upgrade {
|
10 |
+
default upgrade;
|
11 |
+
'' close;
|
12 |
+
}
|
13 |
+
|
14 |
+
upstream app {
|
15 |
+
server app:8501;
|
16 |
+
}
|
17 |
+
|
18 |
+
server {
|
19 |
+
listen 80;
|
20 |
+
charset utf-8;
|
21 |
+
|
22 |
+
location / {
|
23 |
+
proxy_pass http://app;
|
24 |
+
proxy_http_version 1.1;
|
25 |
+
proxy_set_header Upgrade $http_upgrade;
|
26 |
+
proxy_set_header Connection $connection_upgrade;
|
27 |
+
auth_basic off;
|
28 |
+
}
|
29 |
+
}
|
30 |
+
}
|
twNLP-app/docker-compose.yml
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
version: "3"
|
2 |
+
|
3 |
+
services:
|
4 |
+
app:
|
5 |
+
build: ./
|
6 |
+
ports:
|
7 |
+
- 8501:8501
|
8 |
+
command: "streamlit run ./src/app.py"
|
9 |
+
|
10 |
+
nginx:
|
11 |
+
image: "nginx:stable"
|
12 |
+
depends_on:
|
13 |
+
- app
|
14 |
+
links:
|
15 |
+
- app
|
16 |
+
restart: always
|
17 |
+
ports:
|
18 |
+
- 80:80
|
19 |
+
volumes:
|
20 |
+
- "./deployment/nginx.conf:/etc/nginx/nginx.conf"
|
twNLP-app/requirements.txt
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
aiofiles==0.8.0
|
2 |
+
cwngraph==0.4.0
|
3 |
+
distiltag==0.2.2
|
4 |
+
streamlit==1.12.2
|
5 |
+
python-dotenv==0.20.0
|
6 |
+
cwnsensetagger==0.1.6
|
7 |
+
ckip-transformers==0.3.2
|
twNLP-app/src/.DS_Store
ADDED
Binary file (6.15 kB). View file
|
|
twNLP-app/src/app.py
ADDED
@@ -0,0 +1,111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#R11142005 紀柔安
|
2 |
+
import streamlit as st
|
3 |
+
from views.components.spinner import dowload_ckip_package, download_cwn_drivers
|
4 |
+
import pandas as pd
|
5 |
+
import requests
|
6 |
+
import bs4
|
7 |
+
from snownlp import SnowNLP
|
8 |
+
|
9 |
+
|
10 |
+
def run_app(ckip_nlp_models, cwn_upgrade) -> None:
|
11 |
+
# need to download first because CWN packages will first check whether
|
12 |
+
# there is .cwn_graph folder in the root directory.
|
13 |
+
download_cwn_drivers(cwn_upgrade)
|
14 |
+
dowload_ckip_package(ckip_nlp_models)
|
15 |
+
|
16 |
+
from views.components.sidebar import visualize_side_bar
|
17 |
+
from views.containers import display_cwn, display_ckip, display_data_form
|
18 |
+
|
19 |
+
st.title("NLP app for PTT")
|
20 |
+
st.write("這是一個針對PTT語料的 情緒分析|中文NLP管線處理🔎")
|
21 |
+
st.image("/Users/joannechi/nlpWeb/myApp/nlpweb/nlp_assignment_1/img/Mo-PTT-Logo.png", width=200)
|
22 |
+
|
23 |
+
#menu = ["Text","Sentences"]
|
24 |
+
#choice = st.sidebar.selectbox("Menu",menu)
|
25 |
+
|
26 |
+
|
27 |
+
#spectra = st.file_uploader("upload your file", type={"csv", "txt"})
|
28 |
+
#if spectra is not None:
|
29 |
+
# spectra_df = pd.read_csv(spectra) #讀取csv
|
30 |
+
# st.write(spectra_df)
|
31 |
+
|
32 |
+
#~~web crawler~~
|
33 |
+
st.subheader("PTT Crawler 🐛")
|
34 |
+
st.text('目前看板有:HatePolitics|Gossiping|Military|Stock')
|
35 |
+
selected = st.selectbox('請選擇看板:',
|
36 |
+
['HatePolitics', 'Gossiping','Military','Stock'])
|
37 |
+
if selected=='HatePolitics':
|
38 |
+
URL = "https://www.ptt.cc/bbs/HatePolitics/index.html"
|
39 |
+
elif selected=='Gossiping':
|
40 |
+
URL = "https://www.ptt.cc/bbs/Gossiping/index.html"
|
41 |
+
elif selected=='Military':
|
42 |
+
URL = "https://www.ptt.cc/bbs/Military/index.html"
|
43 |
+
else:
|
44 |
+
URL = "https://www.ptt.cc/bbs/Stock/index.html"
|
45 |
+
|
46 |
+
my_headers = {'cookie': 'over18=1;'}
|
47 |
+
response = requests.get(URL, headers = my_headers)
|
48 |
+
soup = bs4.BeautifulSoup(response.text,"html.parser")
|
49 |
+
list_results=[]
|
50 |
+
for t in soup.find_all('div','title'):
|
51 |
+
find_a=t.find('a')
|
52 |
+
find_href="https://www.ptt.cc"+find_a.get("href")
|
53 |
+
title=t.text
|
54 |
+
results={
|
55 |
+
"title":title,
|
56 |
+
"url":find_href
|
57 |
+
}
|
58 |
+
list_results.append(results)
|
59 |
+
my_df=pd.DataFrame(list_results)
|
60 |
+
print(my_df)
|
61 |
+
st.write(my_df)
|
62 |
+
#~~web crawler~~
|
63 |
+
|
64 |
+
#~~sentiment analysis~~
|
65 |
+
st.subheader("情緒分析")
|
66 |
+
with st.form(key="nlpForm"):
|
67 |
+
raw_text=st.text_area("請輸入句子✏️")
|
68 |
+
submit_button=st.form_submit_button(label="確定")
|
69 |
+
|
70 |
+
if submit_button:
|
71 |
+
|
72 |
+
st.info("sentiment")
|
73 |
+
sentiment=SnowNLP(SnowNLP(raw_text).han) #轉簡體
|
74 |
+
sentiment_han=sentiment.sentiments
|
75 |
+
st.write(sentiment_han)
|
76 |
+
|
77 |
+
#emoji
|
78 |
+
if sentiment_han>0:
|
79 |
+
st.markdown("Sentiment:: Positive :smiley: ")
|
80 |
+
elif sentiment_han<0:
|
81 |
+
st.markdown("Sentiment:: Negative :angry: ")
|
82 |
+
else:
|
83 |
+
st.markdown("Sentiment:: Neutral :neutral: ")
|
84 |
+
|
85 |
+
|
86 |
+
|
87 |
+
#with col2:
|
88 |
+
#st.info("category")
|
89 |
+
#category=SnowNLP(SnowNLP(raw_text).han) #轉簡體
|
90 |
+
#category_han=list(category.tags)
|
91 |
+
#st.write(category_han)
|
92 |
+
|
93 |
+
#~~sentiment analysis~~
|
94 |
+
|
95 |
+
st.subheader("中文 NLP 管線處理")
|
96 |
+
|
97 |
+
input_data = display_data_form()
|
98 |
+
model, pipeline, active_visualizers = visualize_side_bar(ckip_nlp_models)
|
99 |
+
#return model_options, pipeline_options, active_visualizers
|
100 |
+
|
101 |
+
display_factories = {"CKIP": display_ckip, "CWN": display_cwn}
|
102 |
+
|
103 |
+
if "input_data" in st.session_state:
|
104 |
+
display_factories[pipeline](
|
105 |
+
model, active_visualizers, st.session_state["input_data"]
|
106 |
+
)
|
107 |
+
|
108 |
+
|
109 |
+
if __name__ == "__main__":
|
110 |
+
ckip_nlp_models = ["bert-base", "albert-tiny", "bert-tiny", "albert-base"]
|
111 |
+
run_app(ckip_nlp_models, cwn_upgrade=False)
|
twNLP-app/src/configs/__init__.py
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .ckip import ckip_path, download_ckip_drivers
|
2 |
+
from .cwn import cwn_model_path, download_cwn_models
|
3 |
+
|
4 |
+
|
5 |
+
__all__ = [
|
6 |
+
"ckip_path",
|
7 |
+
"download_ckip_drivers",
|
8 |
+
"cwn_model_path",
|
9 |
+
"download_cwn_models",
|
10 |
+
]
|
twNLP-app/src/configs/ckip.py
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import pickle
|
2 |
+
import asyncio
|
3 |
+
import aiofiles
|
4 |
+
from pathlib import Path
|
5 |
+
|
6 |
+
|
7 |
+
pkg_path = Path("__file__").resolve().parent / "src"
|
8 |
+
ckip_path = pkg_path / "models" / "ckip"
|
9 |
+
|
10 |
+
|
11 |
+
async def write_drivers(nlp_model: str) -> None:
|
12 |
+
"""The write drivers function writes the ckip drivers to pickle files asynchronously.
|
13 |
+
Args:
|
14 |
+
nlp_model (str): the nlp model name
|
15 |
+
"""
|
16 |
+
from ckip_transformers.nlp import (
|
17 |
+
CkipWordSegmenter,
|
18 |
+
CkipPosTagger,
|
19 |
+
CkipNerChunker,
|
20 |
+
)
|
21 |
+
|
22 |
+
drivers = (
|
23 |
+
CkipWordSegmenter(model=nlp_model),
|
24 |
+
CkipPosTagger(model=nlp_model),
|
25 |
+
CkipNerChunker(model=nlp_model),
|
26 |
+
)
|
27 |
+
|
28 |
+
driver_path = ckip_path / f"{nlp_model}_drivers.pickle"
|
29 |
+
async with aiofiles.open(driver_path, mode="wb") as file:
|
30 |
+
result = pickle.dumps(drivers)
|
31 |
+
await file.write(result)
|
32 |
+
print(f"{nlp_model}_drivers.pickle done!")
|
33 |
+
|
34 |
+
|
35 |
+
async def download_ckip_drivers(ckip_nlp_models):
|
36 |
+
await asyncio.gather(*list(map(write_drivers, ckip_nlp_models)))
|
twNLP-app/src/configs/cwn.py
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from pathlib import Path
|
2 |
+
from typing import Optional
|
3 |
+
|
4 |
+
|
5 |
+
cwn_model_path = Path.home().resolve() / ".cwn_graph"
|
6 |
+
|
7 |
+
|
8 |
+
def download_cwn_models(upgrade: Optional[bool] = False):
|
9 |
+
import CwnSenseTagger, DistilTag
|
10 |
+
from CwnGraph import CwnImage
|
11 |
+
|
12 |
+
DistilTag.download(upgrade=upgrade)
|
13 |
+
CwnSenseTagger.download(upgrade=upgrade)
|
14 |
+
CwnImage.latest()
|
twNLP-app/src/context/__init__.py
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .wsg import use_WSG
|
2 |
+
from .actions import WSGKind
|
3 |
+
|
4 |
+
|
5 |
+
__all__ = ["use_WSG", "WSGKind"]
|
twNLP-app/src/context/actions.py
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from typing import Any
|
2 |
+
from enum import Enum, auto
|
3 |
+
from types import SimpleNamespace
|
4 |
+
from dataclasses import dataclass, FrozenInstanceError
|
5 |
+
|
6 |
+
|
7 |
+
class WSGKind(Enum):
|
8 |
+
ADD_WSG = auto()
|
9 |
+
RESET = auto()
|
10 |
+
|
11 |
+
|
12 |
+
class FrozenSimpleNamespace(SimpleNamespace):
|
13 |
+
def __init__(self, **kwargs):
|
14 |
+
super().__init__(**kwargs)
|
15 |
+
|
16 |
+
def __setattr__(self, name: str, value: Any) -> None:
|
17 |
+
raise FrozenInstanceError(f"cannot assign to field '{name}'")
|
18 |
+
|
19 |
+
|
20 |
+
@dataclass(frozen=True)
|
21 |
+
class Action:
|
22 |
+
"""
|
23 |
+
The Action object contains the payload of information.
|
24 |
+
"""
|
25 |
+
|
26 |
+
kind: WSGKind
|
27 |
+
payload: dict
|
28 |
+
|
29 |
+
def __post_init__(self):
|
30 |
+
super().__setattr__("payload", FrozenSimpleNamespace(**self.payload))
|
twNLP-app/src/context/reducer.py
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from typing import Any, Union
|
2 |
+
from .actions import WSGKind, Action
|
3 |
+
|
4 |
+
|
5 |
+
def reducer(state, action: Action) -> Union[str, Any]:
|
6 |
+
"""The reducer function generates new states."""
|
7 |
+
|
8 |
+
initial_state = (state != None) if state else ""
|
9 |
+
|
10 |
+
if action["kind"] == WSGKind.ADD_WSG:
|
11 |
+
return action["payload"]
|
12 |
+
|
13 |
+
return initial_state
|
twNLP-app/src/context/wsg.py
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .reducer import reducer
|
2 |
+
from utils.stores import Store
|
3 |
+
from typing import Callable, List, Union
|
4 |
+
|
5 |
+
wsg_store = None
|
6 |
+
|
7 |
+
|
8 |
+
def return_value():
|
9 |
+
return wsg_store.get_state()
|
10 |
+
|
11 |
+
|
12 |
+
wsg_store = Store(reducer)
|
13 |
+
|
14 |
+
wsg_store.add_listener(return_value)
|
15 |
+
|
16 |
+
|
17 |
+
def use_WSG() -> List[Union[str, Callable]]:
|
18 |
+
"""The use_WSG function contains wsg result and and wsg dispatcher."""
|
19 |
+
return [wsg_store.get_state(), wsg_store.dispatch]
|
twNLP-app/src/controllers/ckip/__init__.py
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .ner import handle_create_ner
|
2 |
+
from .pos import handle_create_pos
|
3 |
+
from .wsg import handle_create_wsg
|
4 |
+
|
5 |
+
|
6 |
+
__all__ = ["handle_create_ner", "handle_create_pos", "handle_create_wsg"]
|
twNLP-app/src/controllers/ckip/ner.py
ADDED
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import asyncio
|
2 |
+
from typing import List, Union
|
3 |
+
from models import connect_ckip_drivers
|
4 |
+
from ckip_transformers.nlp.util import NerToken
|
5 |
+
from utils.ckip.ner import chunk_multiple_entities
|
6 |
+
|
7 |
+
|
8 |
+
def is_list_of_empty_list(ner_token_list: List[Union[NerToken, None]]) -> bool:
|
9 |
+
"""The is_list_of_empty_list function checks whether a list is full of empty lists.
|
10 |
+
Args:
|
11 |
+
ner_token_list (list): the result of the ner driver
|
12 |
+
Returns:
|
13 |
+
a bool
|
14 |
+
"""
|
15 |
+
return all(map(lambda value: not value, ner_token_list))
|
16 |
+
|
17 |
+
|
18 |
+
def handle_create_ner(nlp_model: str, sentence_list: List[str]) -> List[str]:
|
19 |
+
"""The handle_create_ner function handles the request that deals with NER.
|
20 |
+
Args:
|
21 |
+
nlp_model (str): the nlp model name
|
22 |
+
sentence_list (list): a list of sentences
|
23 |
+
Returns:
|
24 |
+
a list of strings
|
25 |
+
"""
|
26 |
+
ner_driver = connect_ckip_drivers(nlp_model)[2]
|
27 |
+
ner_token_list = ner_driver(sentence_list)
|
28 |
+
|
29 |
+
if is_list_of_empty_list(ner_token_list):
|
30 |
+
return sentence_list
|
31 |
+
|
32 |
+
return asyncio.run(chunk_multiple_entities(zip(sentence_list, ner_token_list)))
|
twNLP-app/src/controllers/ckip/pos.py
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import asyncio
|
2 |
+
from typing import List
|
3 |
+
from context import use_WSG
|
4 |
+
from utils.ckip.pos import PosTagging
|
5 |
+
from utils.text import add_multiple_textsubscripts
|
6 |
+
|
7 |
+
|
8 |
+
def handle_create_pos(nlp_model: str, sentence_list: List[str]):
|
9 |
+
"""The handle_create_pos function handles the request that deals with pos-tagging.
|
10 |
+
Args:
|
11 |
+
sentence_list (list): a list of sentences
|
12 |
+
Returns:
|
13 |
+
a list of strings
|
14 |
+
"""
|
15 |
+
|
16 |
+
ws_result = use_WSG()[0]
|
17 |
+
segmented_result = PosTagging(nlp_model, ws_result).tag()
|
18 |
+
return asyncio.run(add_multiple_textsubscripts("pos", segmented_result))
|
twNLP-app/src/controllers/ckip/wsg.py
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import asyncio
|
2 |
+
from typing import List
|
3 |
+
from context import use_WSG, WSGKind
|
4 |
+
from utils.ckip.wsg import WordSegmentation
|
5 |
+
from utils.text import add_multiple_textsubscripts
|
6 |
+
|
7 |
+
|
8 |
+
def handle_create_wsg(nlp_model: str, sentence_list: List[str]) -> List[str]:
|
9 |
+
"""The handle_create_wsg function handles the request that deals with word
|
10 |
+
segmentation.
|
11 |
+
Args:
|
12 |
+
sentence_list (list): a list of sentences
|
13 |
+
Returns:
|
14 |
+
a list of strings
|
15 |
+
"""
|
16 |
+
|
17 |
+
ws_result = WordSegmentation(nlp_model, sentence_list).segment()
|
18 |
+
dispatch = use_WSG()[1]
|
19 |
+
dispatch({"kind": WSGKind.ADD_WSG, "payload": ws_result})
|
20 |
+
return asyncio.run(add_multiple_textsubscripts("ws", ws_result))
|
twNLP-app/src/controllers/cwn/__init__.py
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .cwn_sense_tag import handle_create_cwn_tags
|
2 |
+
|
3 |
+
|
4 |
+
__all__ = ["handle_cwn_sense_tag"]
|
twNLP-app/src/controllers/cwn/cwn_sense_tag.py
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import asyncio
|
2 |
+
from typing import List
|
3 |
+
from utils.text import add_multiple_textsubscripts
|
4 |
+
from utils.cwn import disambiguate_word_sense, create_cwn_sense_tags
|
5 |
+
|
6 |
+
|
7 |
+
async def create_tags(segmented_result: List[str]):
|
8 |
+
"""The create_tags function runs two asynchronous operations (i.e.
|
9 |
+
`add_multiple_textsubscripts` and `create_cwn_sense_tags`).
|
10 |
+
Args:
|
11 |
+
segmented_result (list)
|
12 |
+
"""
|
13 |
+
|
14 |
+
return await asyncio.gather(
|
15 |
+
*[
|
16 |
+
add_multiple_textsubscripts("cwn", segmented_result),
|
17 |
+
create_cwn_sense_tags(segmented_result),
|
18 |
+
]
|
19 |
+
)
|
20 |
+
|
21 |
+
|
22 |
+
def handle_create_cwn_tags(sentence_list: List[str]) -> List[str]:
|
23 |
+
segmented_result = asyncio.run(disambiguate_word_sense(sentence_list))
|
24 |
+
span_tags, cwn_tags = asyncio.run(create_tags(segmented_result))
|
25 |
+
return span_tags, cwn_tags
|
twNLP-app/src/models/.DS_Store
ADDED
Binary file (6.15 kB). View file
|
|
twNLP-app/src/models/__init__.py
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .ckip import connect_ckip_drivers
|
2 |
+
|
3 |
+
|
4 |
+
__all__ = ["connect_ckip_drivers"]
|
twNLP-app/src/models/ckip/__init__.py
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .ckip import connect_ckip_drivers
|
2 |
+
|
3 |
+
|
4 |
+
__all__ = ["connect_ckip_drivers"]
|
twNLP-app/src/models/ckip/ckip.py
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import pickle
|
2 |
+
from configs import ckip_path
|
3 |
+
|
4 |
+
|
5 |
+
def connect_ckip_drivers(nlp_model: str) -> tuple:
|
6 |
+
"""The connect_ckip_drivers function connects to the ckip drivers.
|
7 |
+
|
8 |
+
Args:
|
9 |
+
nlp_model (str): the nlp model name
|
10 |
+
Returns:
|
11 |
+
a tuple, containing CkipWordSegmenter, CkipPosTagger and CkipNerChunker.
|
12 |
+
"""
|
13 |
+
|
14 |
+
driver_path = ckip_path / f"{nlp_model}_drivers.pickle"
|
15 |
+
|
16 |
+
with open(driver_path, "rb") as file:
|
17 |
+
return pickle.load(file)
|
twNLP-app/src/utils/ckip/ner/__init__.py
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .chunker import chunk_entities, chunk_multiple_entities
|
2 |
+
|
3 |
+
|
4 |
+
__all__ = ["chunk_entities", "chunk_multiple_entities"]
|
twNLP-app/src/utils/ckip/ner/chunker.py
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import asyncio
|
2 |
+
from .ner import create_ner
|
3 |
+
from typing import List, Tuple, Union
|
4 |
+
from ckip_transformers.nlp.util import NerToken
|
5 |
+
|
6 |
+
|
7 |
+
async def chunk_entities(zip_value: Tuple[Union[str, NerToken]]) -> str:
|
8 |
+
sentence, ner_token_list = zip_value
|
9 |
+
return create_ner(sentence, ner_token_list)
|
10 |
+
|
11 |
+
|
12 |
+
async def chunk_multiple_entities(data: zip) -> List[str]:
|
13 |
+
return await asyncio.gather(*list(map(chunk_entities, data)))
|
twNLP-app/src/utils/ckip/ner/ner.py
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from functools import lru_cache
|
2 |
+
from ...text import create_entity_color
|
3 |
+
from typing import List, Tuple, Optional
|
4 |
+
from ckip_transformers.nlp.util import NerToken
|
5 |
+
|
6 |
+
|
7 |
+
def add_textsubscript(ner_token_list: List[NerToken]) -> Tuple[Tuple[str]]:
|
8 |
+
"""The add_textsubscript function combines the token word and the
|
9 |
+
NER-tag, and specifies the NER-tag to be displayed as subscript.
|
10 |
+
Args:
|
11 |
+
ner_token_list (NerToken): a list of NerToken
|
12 |
+
Returns:
|
13 |
+
a tuple: (
|
14 |
+
("<span>傅達仁<sub style='margin-right: 0.1rem'>PERSON</sub></span>", (0, 3))
|
15 |
+
...
|
16 |
+
)
|
17 |
+
"""
|
18 |
+
|
19 |
+
combine = lambda value: (
|
20 |
+
f"<span style='color: {create_entity_color(value.ner)};'>{value.word}<sub style='margin-right: 0.6rem'>{value.ner}</sub></span>",
|
21 |
+
value.idx,
|
22 |
+
)
|
23 |
+
return tuple(map(combine, ner_token_list))
|
24 |
+
|
25 |
+
|
26 |
+
@lru_cache(maxsize=None)
|
27 |
+
def modify_sentence(
|
28 |
+
span_tuple: Tuple[Tuple[str]], sentence: str, increased_len: Optional[int] = 0
|
29 |
+
) -> str:
|
30 |
+
if len(list(span_tuple)) == 1:
|
31 |
+
span_list = list(span_tuple)
|
32 |
+
modified_word, index = span_list[0]
|
33 |
+
start_index, end_index = index
|
34 |
+
start_index += increased_len
|
35 |
+
end_index += increased_len
|
36 |
+
return "".join((sentence[:start_index], modified_word, sentence[end_index:]))
|
37 |
+
|
38 |
+
span_list = list(span_tuple)
|
39 |
+
modified_word, index = span_list.pop(0)
|
40 |
+
span_tuple = tuple(span_list)
|
41 |
+
|
42 |
+
start_index, end_index = index
|
43 |
+
|
44 |
+
if increased_len:
|
45 |
+
start_index += increased_len
|
46 |
+
end_index += increased_len
|
47 |
+
|
48 |
+
original_word = sentence[start_index:end_index]
|
49 |
+
modified_sentence = "".join(
|
50 |
+
(sentence[:start_index], modified_word, sentence[end_index:])
|
51 |
+
)
|
52 |
+
|
53 |
+
index_gap = len(modified_word) - len(original_word)
|
54 |
+
return modify_sentence(span_tuple, modified_sentence, increased_len + index_gap)
|
55 |
+
|
56 |
+
|
57 |
+
def create_ner(sentence: str, ner_token_list: List[NerToken]) -> str:
|
58 |
+
"""The replace_entities function replaces words that are recognized
|
59 |
+
as the token words with opening and closing span tags.
|
60 |
+
Args:
|
61 |
+
sentence (str): the orignal sentence
|
62 |
+
ner_token_list (NerToken): a list of NerToken
|
63 |
+
Returns:
|
64 |
+
a str
|
65 |
+
"""
|
66 |
+
modified_ner_token_list = add_textsubscript(ner_token_list)
|
67 |
+
return modify_sentence(modified_ner_token_list, sentence)
|
twNLP-app/src/utils/ckip/pos/__init__.py
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .pos import PosTagging
|
2 |
+
|
3 |
+
|
4 |
+
__all__ = ["PosTagging"]
|
twNLP-app/src/utils/ckip/pos/pos.py
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from typing import List, Union
|
2 |
+
from dataclasses import dataclass
|
3 |
+
from models import connect_ckip_drivers
|
4 |
+
|
5 |
+
|
6 |
+
@dataclass
|
7 |
+
class PosTagging:
|
8 |
+
"""
|
9 |
+
The PosTagging object marks a word in `ws_result` as corresponding to a particular part of speech.
|
10 |
+
"""
|
11 |
+
|
12 |
+
nlp_model: str
|
13 |
+
ws_result: List[Union[List[None], List[str]]]
|
14 |
+
|
15 |
+
def __post_init__(self) -> None:
|
16 |
+
self.pos_driver = connect_ckip_drivers(self.nlp_model)[1]
|
17 |
+
|
18 |
+
def pack_ws_pos_sentece(self, ws_pos_pair: tuple) -> List[tuple]:
|
19 |
+
"""The pack_ws_pos_sentece method packs both words and thier part-of-speech to a pair.
|
20 |
+
Args:
|
21 |
+
ws_pos_pair (tuple): the pair of a word and its corresponding part-of-speech
|
22 |
+
Returns:
|
23 |
+
a list of tuples: [
|
24 |
+
('我', 'Nh'),
|
25 |
+
('喜歡', 'VK'),
|
26 |
+
('程式', 'Na')
|
27 |
+
]
|
28 |
+
"""
|
29 |
+
|
30 |
+
sentence_ws, sentence_pos = ws_pos_pair
|
31 |
+
assert len(sentence_ws) == len(sentence_pos)
|
32 |
+
return list(
|
33 |
+
map(lambda word_pos_pair: word_pos_pair, zip(sentence_ws, sentence_pos))
|
34 |
+
)
|
35 |
+
|
36 |
+
def tag(self):
|
37 |
+
pos_pipeline = self.pos_driver(self.ws_result, use_delim=True)
|
38 |
+
return list(map(self.pack_ws_pos_sentece, zip(self.ws_result, pos_pipeline)))
|
twNLP-app/src/utils/ckip/wsg/__init__.py
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .wsg import WordSegmentation
|
2 |
+
|
3 |
+
|
4 |
+
__all__ = ["WordSegmentation"]
|
twNLP-app/src/utils/ckip/wsg/wsg.py
ADDED
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from typing import List, Union
|
2 |
+
from dataclasses import dataclass
|
3 |
+
from models import connect_ckip_drivers
|
4 |
+
|
5 |
+
|
6 |
+
@dataclass
|
7 |
+
class WordSegmentation:
|
8 |
+
"""
|
9 |
+
The WordSegmentation object divides written text in `sentence_lists` into meaningful units.
|
10 |
+
"""
|
11 |
+
|
12 |
+
nlp_model: str
|
13 |
+
sentence_list: List[str]
|
14 |
+
|
15 |
+
def __post_init__(self) -> None:
|
16 |
+
self.ws_driver = connect_ckip_drivers(self.nlp_model)[0]
|
17 |
+
|
18 |
+
def remove_empty_string(self, sentence_list: List[str]) -> List[str]:
|
19 |
+
"""The remove_empty_string method removes empty string in `sentence_list`.
|
20 |
+
Args:
|
21 |
+
sentence_list (list)
|
22 |
+
Returns:
|
23 |
+
a list
|
24 |
+
"""
|
25 |
+
return list(filter(lambda value: value is not "", sentence_list))
|
26 |
+
|
27 |
+
def segment(self) -> List[Union[List[None], List[List[str]]]]:
|
28 |
+
"""The segment method divides written text in `sentence_lists` into meaningful units.
|
29 |
+
Returns:
|
30 |
+
a list of splitting text, an empty list otherwise.
|
31 |
+
"""
|
32 |
+
invalid_list = not self.sentence_list or all(
|
33 |
+
[value == "" for value in self.sentence_list]
|
34 |
+
)
|
35 |
+
|
36 |
+
if invalid_list:
|
37 |
+
return self.sentence_list
|
38 |
+
|
39 |
+
filtered_list = self.remove_empty_string(self.sentence_list)
|
40 |
+
return self.ws_driver(filtered_list, use_delim=True)
|
twNLP-app/src/utils/cwn/__init__.py
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .tagger import disambiguate_word_sense, create_cwn_sense_tags
|
2 |
+
|
3 |
+
|
4 |
+
__all__ = ["disambiguate_word_sense", "create_cwn_sense_tags"]
|
twNLP-app/src/utils/cwn/tagger.py
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import asyncio
|
2 |
+
from typing import List, Tuple
|
3 |
+
from DistilTag import DistilTag
|
4 |
+
from CwnSenseTagger import senseTag
|
5 |
+
|
6 |
+
|
7 |
+
# --------------------------------------------------------------------
|
8 |
+
# distil tag
|
9 |
+
|
10 |
+
tagger = DistilTag()
|
11 |
+
|
12 |
+
|
13 |
+
async def tag_values(value):
|
14 |
+
"""The tag_values function makes `tagger.tag` function an asynchronous function."""
|
15 |
+
return tagger.tag(value)
|
16 |
+
|
17 |
+
|
18 |
+
async def disambiguate_word_sense(sentence_list: List[str]) -> List[Tuple[str]]:
|
19 |
+
"""The disambiguate_word_sense function disambiuates the word sense.
|
20 |
+
Args:
|
21 |
+
sentence_list (list): a list of sentences
|
22 |
+
Returns:
|
23 |
+
a list of tuples.
|
24 |
+
"""
|
25 |
+
|
26 |
+
return await asyncio.gather(*list(map(tag_values, sentence_list)))
|
27 |
+
|
28 |
+
|
29 |
+
# --------------------------------------------------------------------
|
30 |
+
# CWN sense tag
|
31 |
+
|
32 |
+
|
33 |
+
async def sense_value(value):
|
34 |
+
"""The sense_value function makes `senseTag` function an asynchronous function."""
|
35 |
+
return senseTag(value)
|
36 |
+
|
37 |
+
|
38 |
+
async def create_cwn_sense_tags(disambiguated_list: List[List[List[tuple]]]):
|
39 |
+
return await asyncio.gather(*list(map(sense_value, disambiguated_list)))
|
twNLP-app/src/utils/stores/__init__.py
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .store import Store
|
2 |
+
|
3 |
+
|
4 |
+
__all__ = ["Store"]
|
twNLP-app/src/utils/stores/store.py
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from dataclasses import dataclass
|
2 |
+
from typing import Any, Callable, Dict
|
3 |
+
|
4 |
+
|
5 |
+
@dataclass
|
6 |
+
class Store:
|
7 |
+
"""
|
8 |
+
The Store object keeps tracks of changes and generates new states via a reducer.
|
9 |
+
"""
|
10 |
+
|
11 |
+
reducer: Callable
|
12 |
+
|
13 |
+
def __post_init__(self):
|
14 |
+
if callable(self.reducer) != True:
|
15 |
+
raise ValueError("Expecting a callable reducer function")
|
16 |
+
|
17 |
+
self.__states = None
|
18 |
+
self.__listeners = list()
|
19 |
+
self.__reducer = self.reducer
|
20 |
+
|
21 |
+
def dispatch(self, action: Dict[str, Any]):
|
22 |
+
if type(action) != dict:
|
23 |
+
raise ValueError("Expecting action to be of type dictionary")
|
24 |
+
|
25 |
+
has_kind = "kind" in action
|
26 |
+
|
27 |
+
if not has_kind:
|
28 |
+
raise ValueError("Action is expected to have an attribute 'kind'")
|
29 |
+
|
30 |
+
currentStates = None
|
31 |
+
|
32 |
+
if type(self.__states) == dict:
|
33 |
+
currentStates = self.__states.copy()
|
34 |
+
|
35 |
+
self.__states = self.__reducer(currentStates, action)
|
36 |
+
self.__emitListeners()
|
37 |
+
pass
|
38 |
+
|
39 |
+
def __emitListeners(self):
|
40 |
+
for listener in self.__listeners:
|
41 |
+
listener()
|
42 |
+
|
43 |
+
def add_listener(self, callback):
|
44 |
+
if callable(callback):
|
45 |
+
self.__listeners.append(callback)
|
46 |
+
|
47 |
+
def get_state(self):
|
48 |
+
return self.__states
|
twNLP-app/src/utils/text/__init__.py
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .textsubscript import add_multiple_textsubscripts
|
2 |
+
from .text_color import create_entity_color, create_pos_color
|
3 |
+
|
4 |
+
|
5 |
+
__all__ = ["add_multiple_textsubscripts", "create_entity_color", "create_pos_color"]
|
twNLP-app/src/utils/text/text_color.py
ADDED
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
def create_pos_color(pos: str) -> str:
|
2 |
+
"""The create_color function creats a text color base on the `pos` type.
|
3 |
+
Args:
|
4 |
+
pos (str): part of speech
|
5 |
+
Returns:
|
6 |
+
a str (e.g. 'rgb(255,0,0)' or '#ff0000')
|
7 |
+
"""
|
8 |
+
|
9 |
+
if len(pos) >= 4:
|
10 |
+
return "rgb(102, 102, 102)"
|
11 |
+
|
12 |
+
pos_color_factories = {
|
13 |
+
"A": "rgb(21, 170, 191)",
|
14 |
+
"C": "rgb(231, 41, 138)",
|
15 |
+
"D": "rgb(117, 112, 179)",
|
16 |
+
"I": "rgb(102, 166, 30)",
|
17 |
+
"N": "rgb(27, 158, 119)",
|
18 |
+
"P": "rgb(102, 166, 30)",
|
19 |
+
"S": "rgb(166, 118, 29)",
|
20 |
+
"T": "rgb(102, 166, 30)",
|
21 |
+
"V": "rgb(217, 95, 2)",
|
22 |
+
"F": "rgb(230, 171, 2)",
|
23 |
+
}
|
24 |
+
|
25 |
+
return pos_color_factories[pos[0]]
|
26 |
+
|
27 |
+
|
28 |
+
def create_entity_color(entity: str):
|
29 |
+
"""The create_color function creats a text color base on the `entity` type.
|
30 |
+
Args:
|
31 |
+
entity (str): an entity type from the result of NER
|
32 |
+
Returns:
|
33 |
+
a str (e.g. 'rgb(255,0,0)' or '#ff0000')
|
34 |
+
"""
|
35 |
+
|
36 |
+
entity_color_factories = {
|
37 |
+
"GPE": "rgb(102, 166, 30)",
|
38 |
+
"PERSON": "rgb(166, 118, 29)",
|
39 |
+
"DATE": "rgb(217, 95, 2)",
|
40 |
+
"ORG": "rgb(102, 166, 30)",
|
41 |
+
"CARDINAL": "rgb(27, 158, 119)",
|
42 |
+
"ORDINAL": "rgb(231, 41, 138)",
|
43 |
+
"NORP": "rgb(117, 112, 179)",
|
44 |
+
"LOC": "rgb(27, 158, 119)",
|
45 |
+
"TIME": "rgb(117, 112, 179)",
|
46 |
+
"FAC": "rgb(231, 41, 138)",
|
47 |
+
"MONEY": "rgb(217, 95, 2)",
|
48 |
+
"ORDINAL": "rgb(231, 41, 138)",
|
49 |
+
"EVENT": "rgb(117, 112, 179)",
|
50 |
+
"WORK_OF_ART": "rgb(231, 41, 138)",
|
51 |
+
"QUANTITY": "rgb(217, 95, 2)",
|
52 |
+
"PERCENT": "rgb(230, 171, 2)",
|
53 |
+
"LANGUAGE": "rgb(230, 171, 2)",
|
54 |
+
"PRODUCT": "rgb(27, 158, 119)",
|
55 |
+
"LAW": "rgb(166, 118, 29)",
|
56 |
+
}
|
57 |
+
return entity_color_factories[entity]
|
twNLP-app/src/utils/text/textsubscript.py
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import asyncio
|
2 |
+
from itertools import chain
|
3 |
+
from typing import List, Union
|
4 |
+
from .text_color import create_pos_color
|
5 |
+
|
6 |
+
|
7 |
+
async def add_pos_textsubscript(data_list: List[str]) -> str:
|
8 |
+
|
9 |
+
create = (
|
10 |
+
lambda value: f"""<span>{value[0]}<sub style='margin-right: 0.7rem; color: {create_pos_color(value[1])};'>({value[1]})</sub></span>"""
|
11 |
+
)
|
12 |
+
return "".join(list(map(create, data_list)))
|
13 |
+
|
14 |
+
|
15 |
+
async def add_ws_textsubscript(data_list: List[str]) -> str:
|
16 |
+
create = lambda value: f"<span style='margin-right: 1rem'>{value}</span>"
|
17 |
+
return "".join(list(map(create, data_list)))
|
18 |
+
|
19 |
+
|
20 |
+
async def add_cwn_textsubscript(segmented_list) -> str:
|
21 |
+
create = (
|
22 |
+
lambda value: f"<span>{value[0]}<sub style='margin-right: 1rem; color: {create_pos_color(value[1])};'>{value[1]}</sub></span>"
|
23 |
+
)
|
24 |
+
return "".join(list(map(create, chain(*segmented_list))))
|
25 |
+
|
26 |
+
|
27 |
+
async def add_multiple_textsubscripts(
|
28 |
+
target: str, list_of_lists: List[List[Union[str, tuple]]]
|
29 |
+
) -> List[str]:
|
30 |
+
|
31 |
+
textsubscript_factories = {
|
32 |
+
"ws": add_ws_textsubscript,
|
33 |
+
"pos": add_pos_textsubscript,
|
34 |
+
"cwn": add_cwn_textsubscript,
|
35 |
+
}
|
36 |
+
|
37 |
+
return await asyncio.gather(
|
38 |
+
*list(map(textsubscript_factories[target], list_of_lists))
|
39 |
+
)
|
twNLP-app/src/views/__init__.py
ADDED
File without changes
|
twNLP-app/src/views/components/form/__init__.py
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .form import form_controller
|
2 |
+
|
3 |
+
|
4 |
+
__all__ = ["form_controller"]
|