├── tests ├── __init__.py └── test_nlp_bert.py ├── nlp_bert ├── __init__.py ├── nlp-api.py └── classifier.py ├── pyproject.toml ├── README.md └── poetry.lock /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nlp_bert/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = '0.1.0' 2 | -------------------------------------------------------------------------------- /tests/test_nlp_bert.py: -------------------------------------------------------------------------------- 1 | from nlp_bert import __version__ 2 | 3 | 4 | def test_version(): 5 | assert __version__ == '0.1.0' 6 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "nlp-bert" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["pyantony "] 6 | 7 | [tool.poetry.dependencies] 8 | python = "^3.7" 9 | fastapi = "^0.60.1" 10 | uvicorn = "^0.11.8" 11 | torch = "^1.6.0" 12 | torchvision = "^0.7.0" 13 | transformers = "^3.0.2" 14 | wget = "^3.2" 15 | 16 | [tool.poetry.dev-dependencies] 17 | pytest = "^5.2" 18 | 19 | [build-system] 20 | requires = ["poetry>=0.12"] 21 | build-backend = "poetry.masonry.api" 22 | -------------------------------------------------------------------------------- /nlp_bert/nlp-api.py: -------------------------------------------------------------------------------- 1 | from typing import List, Optional 2 | 3 | from fastapi import FastAPI 4 | from pydantic import BaseModel 5 | 6 | from nlp_bert.classifier import HateClassifier 7 | 8 | app = FastAPI() 9 | cls_model = HateClassifier() 10 | 11 | Vector = List[float] 12 | 13 | 14 | class Request(BaseModel): 15 | text: List[str] 16 | 17 | 18 | class Response(BaseModel): 19 | predictions: List[Vector] 20 | embeddings: Optional[List[Vector]] = None 21 | 22 | 23 | @app.get("/") 24 | def root(): 25 | return {"message": "API running"} 26 | 27 | 28 | @app.post("/model/predict") 29 | def predict(body: Request, embeddings: bool = False): 30 | # will process 5 sentences max 31 | text = body.text[:5] 32 | 33 | if isinstance(cls_model.model, Exception): 34 | raise cls_model.model 35 | 36 | probas, embeds = cls_model.process(text) 37 | 38 | return Response( 39 | predictions=probas, 40 | embeddings=embeds if embeddings else None 41 | ) 42 | -------------------------------------------------------------------------------- /nlp_bert/classifier.py: -------------------------------------------------------------------------------- 1 | from transformers import AutoTokenizer, AutoModelForSequenceClassification 2 | from transformers import PreTrainedModel 3 | from torch.nn import Softmax 4 | import torch 5 | 6 | from fastapi import HTTPException 7 | 8 | from typing import List, Union 9 | import zipfile 10 | import glob 11 | import wget 12 | import os 13 | 14 | PRE_TRAINED_MODEL = "distilbert-base-uncased" 15 | MODEL_DIR = f"{os.getcwd()}/bertEp2" 16 | MODEL_S3_URL = "https://" \ 17 | "cc6e750869d1bf4c575d93c62ceaffbd880f62fdc70d92005eedad24f5865" \ 18 | ".s3.amazonaws.com/bertEp2.zip" 19 | 20 | ResponsePair = (List[List[float]], List[List[float]]) 21 | 22 | 23 | class HateClassifier: 24 | def __init__(self, model_dir=MODEL_DIR, pre_trained=PRE_TRAINED_MODEL): 25 | self.model: Union[Exception, PreTrainedModel] = self._init_model(model_dir) 26 | self.tokenizer = AutoTokenizer.from_pretrained(pre_trained) 27 | self.probaLayer = Softmax(-1) 28 | 29 | def process(self, text: List[str]) -> ResponsePair: 30 | """Return binary predictions and embeddings from CLS token""" 31 | tokenized = self.tokenizer(text, padding=True, return_tensors='pt', truncation=True) 32 | out = self.model(**tokenized, output_hidden_states=True) 33 | 34 | probas, embeds = Softmax(-1)(out[0]), out[1][-1][:, 0] 35 | 36 | return probas.tolist(), embeds.tolist() 37 | 38 | def process_f(self, text: List[str], emb_size=768) -> ResponsePair: 39 | """Generate random probabilities and embeddings. Used for testing.""" 40 | s = len(text) 41 | probas = torch.rand([s, 2]).tolist() 42 | embeddings = torch.rand([s, emb_size]).tolist() 43 | 44 | return probas, embeddings 45 | 46 | def _init_model(self, model_dir: str): 47 | self._download_model() 48 | 49 | try: 50 | return AutoModelForSequenceClassification.from_pretrained(model_dir) 51 | except: 52 | return HTTPException(status_code=501, detail="Unable to load model.") 53 | 54 | def _download_model(self, model_dir=MODEL_DIR, url=MODEL_S3_URL): 55 | if any(glob.glob(model_dir + "/*.bin")): 56 | return 57 | 58 | not os.path.isdir(model_dir) and os.mkdir(model_dir) 59 | model_path = wget.download(url=url, out=model_dir) 60 | 61 | with zipfile.ZipFile(model_path, 'r') as zip_ref: 62 | zip_ref.extractall(model_dir) 63 | 64 | os.remove(model_path) 65 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Hate speech prediction 2 | 3 | This project develops a model for binary classification on hate speech sentences. To accomplish this I am using the 4 | Bert (Bidirectional Encoder Representations from Transformers) language model. Components of the project: 5 | 6 | - A notebook with EDA on the dataset found in *notebooks/EDA.ipynb*. 7 | - A notebook with Bert modeling approaches (the meat of the project) found in *notebooks/bert.ipynb*. 8 | - An API for prediction around the final model. 9 | 10 | ### Background 11 | 12 | The baseline work is described in the following paper: 13 | https://arxiv.org/pdf/1809.04444.pdf. This previous work includes a dataset scraped from a white 14 | nationalist forum (https://www.stormfront.org/forum/), some data exploration, and some baseline models. It also 15 | includes a description of the annotation process. 16 | 17 | Classifying hate speech is not a straight forward task. What is considered hate speech might be very subjective. 18 | Researches describe the issues encountered when annotating/labeling the dataset. They chose to label text at 19 | sentence level because: “Sentence-level annotation allows to work with the minimum unit containing 20 | hate speech and reduce noise introduced by other sentences that are clean” (page 3). The authors 21 | mention that there is no consensus as to what exactly hate speech is, so they set up a criteria/guidelines 22 | for annotators to accurately label the sentences. According to this criteria hate speech must include (page 3): 23 | 24 | - a deliberate attack 25 | - directed towards a specific group of people 26 | - motivated by aspects of the group’s identity. 27 | 28 | Even with these guidelines there was multiple differences among annotators. Some questions that might arise include 29 | (some are mentioned in the paper): 30 | 31 | - can a factual statement constitute an attack? 32 | - can a single individual constitute an entire group if the offense can be generalized? 33 | - when does a trait becomes associated with an entire group's identity? Couldn't a trait be mentioned only in reference 34 | of a single individual or perhaps a subgroup? 35 | 36 | Some of these differences where discussed in order to homogenize the results as much as possible. 37 | 38 | ### Dataset 39 | 40 | Dataset can be found here: https://github.com/Vicomtech/hate-speech-dataset.git. It contains the original train/test 41 | split. There are in total 2392 observations with 1914 and 478 instances for training and testing respectively. Classes 42 | are balanced in both sets. Dataset head: 43 | 44 | file_id text | gSet | label | set | label 45 | ------------ | ----- | ------ | --- | ----- 46 | 0 | 14103132_1 | Five is about what I 've found also . | train | noHate 47 | 1 | 14663016_2 | Mexicans have plenty of open space in their co... | train | hate 48 | 2 | 13860974_1 | I didnt know that bar was owned by a negro i w... | train | hate 49 | 3 | 30484029_2 | If I had one it would 've probably made the li... | train | noHate 50 | 4 | 13864997_3 | Most White Western Women have the racial sense... | train | hate 51 | 52 | Some of the top keywords by log-likelihood test found in out group of interest ***hate*** include: 53 | 54 | keyword | likelihood 55 | ------- | ---------- 56 | black | 58.513906 57 | jews | 54.982564 58 | negro | 40.754824 59 | ape | 33.393051 60 | race | 24.915494 61 | scum | 24.367472 62 | 63 | For more data exploration go to *notebooks/EDA.ipynb* (data is downloaded automatically in the notebook 64 | so you don't need to download it yourself). 65 | 66 | ### Bert Model 67 | 68 | My main goal in the data modeling phase was to compare 2 approaches: fine-tuning vs. embeddings. The first 69 | part of the notebook involves fine-tuning a Bert model (Distilbert) using the transformers 70 | (https://huggingface.co/transformers/) library. The only hyperparameter changed was number of epochs. Results: 71 | 72 | model | epoch | eval_train_loss | eval_loss | eval_accHate | eval_accNoHate | eval_accAll 73 | ----- | ----- | --------------- | ----------- | ------------ | --------------- | ----------- 74 | 0 | 2.0 | 0.150157 | 0.438262 | 0.807531 | 0.836820 | 0.822176 75 | 1 | 3.0 | 0.048003 | 0.556381 | 0.799163 | 0.853556 | 0.826360 76 | 2 | 4.0 | 0.013872 | 0.701802 | 0.861925 | 0.820084 | 0.841004 77 | 78 | We can notice the evaluation loss for 2 epochs is the lowest (this is the most relevant metric). For the second part 79 | of the notebook I used the pre-trained model (without tuning) to extract embeddings for the entire sentences and pass 80 | them as the input to the default head classifier (a 2 layer NN). I could have used any other classifier but I chose 81 | the same default head to make a fair comparison with the fine-tuning approach. There are multiple strategies to select 82 | embeddings; combinations I tried included: 83 | * CLS: embedding for [CLS] token. 84 | * LAST_MEAN: mean of all word embeddings from last layer. 85 | * LAST_MAX: max pooling of all word embeddings from last layer (max at each dimension). 86 | * LAST2_MEAN: mean of all word embeddings from second to last layer. 87 | * LAST2_MAX: max pooling of all word embeddings from second to last layer. 88 | 89 | It should be noted that, although the [CLS] token is used for a general representation of the sentence for 90 | classification problems, this representation is meaningless **unless** fine-tuning occurs, otherwise the model wouldn't 91 | be motivated to fully funnel the sentence meaning in that single vector. The [CLS] token by itself is, therefore, a weak 92 | embedding; it would be better to test some other aggregations of the other vectors found in the hidden states. You can 93 | find more information about this topic in the ***bert-as-service*** library documentation 94 | (https://github.com/hanxiao/bert-as-service#speech_balloon-faq and 95 | https://hanxiao.io/2019/01/02/Serving-Google-BERT-in-Production-using-Tensorflow-and-ZeroMQ/). 96 | 97 | Results for different strategies (all run for 2 epochs and same default parameters): 98 | 99 | model | emb-strategy | eval_train_loss | eval_loss | eval_accHate | eval_accNoHate | eval_accAll 100 | ----- | ------------ | ---------------- | ----------- | ------------ | --------------- | -------------- 101 | 0 | CLS | 0.549668 | 0.574593 | 0.786611 | 0.673640 | 0.730126 102 | 1 | LAST_MEAN | 0.540307 | 0.559487 | 0.836820 | 0.698745 | 0.767782 103 | 2 | LAST_MAX | 0.601751 | 0.612578 | 0.828452 | 0.682008 | 0.755230 104 | 3 | LAST2_MEAN | 0.511449 | 0.542598 | 0.811715 | 0.686192 | 0.748954 105 | 4 | LAST2_MAX | 0.585415 | 0.599830 | 0.824268 | 0.686192 | 0.755230 106 | 107 | We can see the best strategy by eval_loss is LAST2_MEAN. This is also the default implementation by the 108 | ***bert-as-service*** library. 109 | 110 | ### Prediction API 111 | 112 | The fine-tuned model has a small API for prediction (*nlp_bert/nlp-api.py*). To get predictions you send a POST request 113 | to endpoint: 114 | ```bash 115 | model/predict 116 | # to get embeddings 117 | model/predict?embeddings=true 118 | ``` 119 | You can pass up to 5 sentences at a time (you can send more but the API will take only the first 5). POST request 120 | example: 121 | 122 | ```bash 123 | curl -X POST "http://127.0.0.1:8000/model/predict?embeddings=true" \ 124 | -H "accept: application/json" \ 125 | -H "Content-Type: application/json" \ 126 | -d "{\"text\": 127 | [\"Don't bother with black culture , it 's not worth the effort .\", 128 | \"Good going libtards , you ruined Rhodesia .\", 129 | \"I would n't marry a asian even after cirurgy .\"] 130 | }" 131 | ``` 132 | 133 | Predictions at index 0 represent the ***noHAte*** class; index 1 represent ***hate*** class. The embeddings come from 134 | the [CLS] token. Output example: 135 | 136 | ```bash 137 | { 138 | "predictions": [ 139 | [ 140 | 0.44551581144332886, 141 | 0.5544842481613159 142 | ], 143 | [ 144 | 0.44643911719322205, 145 | 0.5535609126091003 146 | ], 147 | [ 148 | 0.47761672735214233, 149 | 0.5223833322525024 150 | ] 151 | ], 152 | "embeddings": [ 153 | [ 154 | -0.0784786194562912, 155 | 0.15456458926200867, 156 | -0.2955276072025299, 157 | -0.07512544095516205, 158 | -0.29915621876716614, 159 | ... 160 | ] 161 | } 162 | ``` 163 | Project was built with *poetry* (https://python-poetry.org/), so it is recommended to get *poetry* first to install all 164 | the dependencies. After *poetry* installation you can simply clone this repo, navigate to the root directory, and run: 165 | 166 | ```bash 167 | # install dependencies 168 | poetry install 169 | 170 | # running the API 171 | cd nlp_bert 172 | uvicorn nlp-api:app 173 | ``` 174 | 175 | The fine-tuned model will be downloaded automatically if its directory is not found. 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | category = "dev" 3 | description = "Atomic file writes." 4 | marker = "sys_platform == \"win32\"" 5 | name = "atomicwrites" 6 | optional = false 7 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 8 | version = "1.4.0" 9 | 10 | [[package]] 11 | category = "dev" 12 | description = "Classes Without Boilerplate" 13 | name = "attrs" 14 | optional = false 15 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 16 | version = "19.3.0" 17 | 18 | [package.extras] 19 | azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"] 20 | dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"] 21 | docs = ["sphinx", "zope.interface"] 22 | tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] 23 | 24 | [[package]] 25 | category = "main" 26 | description = "Python package for providing Mozilla's CA Bundle." 27 | name = "certifi" 28 | optional = false 29 | python-versions = "*" 30 | version = "2020.6.20" 31 | 32 | [[package]] 33 | category = "main" 34 | description = "Universal encoding detector for Python 2 and 3" 35 | name = "chardet" 36 | optional = false 37 | python-versions = "*" 38 | version = "3.0.4" 39 | 40 | [[package]] 41 | category = "main" 42 | description = "Composable command line interface toolkit" 43 | name = "click" 44 | optional = false 45 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 46 | version = "7.1.2" 47 | 48 | [[package]] 49 | category = "dev" 50 | description = "Cross-platform colored terminal text." 51 | marker = "sys_platform == \"win32\"" 52 | name = "colorama" 53 | optional = false 54 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 55 | version = "0.4.3" 56 | 57 | [[package]] 58 | category = "main" 59 | description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" 60 | name = "fastapi" 61 | optional = false 62 | python-versions = ">=3.6" 63 | version = "0.60.1" 64 | 65 | [package.dependencies] 66 | pydantic = ">=0.32.2,<2.0.0" 67 | starlette = "0.13.6" 68 | 69 | [package.extras] 70 | all = ["requests (>=2.24.0,<3.0.0)", "aiofiles (>=0.5.0,<0.6.0)", "jinja2 (>=2.11.2,<3.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "itsdangerous (>=1.1.0,<2.0.0)", "pyyaml (>=5.3.1,<6.0.0)", "graphene (>=2.1.8,<3.0.0)", "ujson (>=3.0.0,<4.0.0)", "orjson (>=3.2.1,<4.0.0)", "email_validator (>=1.1.1,<2.0.0)", "uvicorn (>=0.11.5,<0.12.0)", "async_exit_stack (>=1.0.1,<2.0.0)", "async_generator (>=1.10,<2.0.0)"] 71 | dev = ["python-jose (>=3.1.0,<4.0.0)", "passlib (>=1.7.2,<2.0.0)", "autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "uvicorn (>=0.11.5,<0.12.0)", "graphene (>=2.1.8,<3.0.0)"] 72 | doc = ["mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=5.4.0,<6.0.0)", "markdown-include (>=0.5.1,<0.6.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.2.0)", "typer (>=0.3.0,<0.4.0)", "typer-cli (>=0.0.9,<0.0.10)", "pyyaml (>=5.3.1,<6.0.0)"] 73 | test = ["pytest (5.4.3)", "pytest-cov (2.10.0)", "mypy (0.782)", "black (19.10b0)", "isort (>=5.0.6,<6.0.0)", "requests (>=2.24.0,<3.0.0)", "email_validator (>=1.1.1,<2.0.0)", "sqlalchemy (>=1.3.18,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "databases (>=0.3.2,<0.4.0)", "orjson (>=3.2.1,<4.0.0)", "async_exit_stack (>=1.0.1,<2.0.0)", "async_generator (>=1.10,<2.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "aiofiles (>=0.5.0,<0.6.0)", "flask (>=1.1.2,<2.0.0)"] 74 | 75 | [[package]] 76 | category = "main" 77 | description = "A platform independent file lock." 78 | name = "filelock" 79 | optional = false 80 | python-versions = "*" 81 | version = "3.0.12" 82 | 83 | [[package]] 84 | category = "main" 85 | description = "Clean single-source support for Python 3 and 2" 86 | name = "future" 87 | optional = false 88 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 89 | version = "0.18.2" 90 | 91 | [[package]] 92 | category = "main" 93 | description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" 94 | name = "h11" 95 | optional = false 96 | python-versions = "*" 97 | version = "0.9.0" 98 | 99 | [[package]] 100 | category = "main" 101 | description = "A collection of framework independent HTTP protocol utils." 102 | marker = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"" 103 | name = "httptools" 104 | optional = false 105 | python-versions = "*" 106 | version = "0.1.1" 107 | 108 | [package.extras] 109 | test = ["Cython (0.29.14)"] 110 | 111 | [[package]] 112 | category = "main" 113 | description = "Internationalized Domain Names in Applications (IDNA)" 114 | name = "idna" 115 | optional = false 116 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 117 | version = "2.10" 118 | 119 | [[package]] 120 | category = "dev" 121 | description = "Read metadata from Python packages" 122 | marker = "python_version < \"3.8\"" 123 | name = "importlib-metadata" 124 | optional = false 125 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 126 | version = "1.7.0" 127 | 128 | [package.dependencies] 129 | zipp = ">=0.5" 130 | 131 | [package.extras] 132 | docs = ["sphinx", "rst.linker"] 133 | testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] 134 | 135 | [[package]] 136 | category = "main" 137 | description = "Lightweight pipelining: using Python functions as pipeline jobs." 138 | name = "joblib" 139 | optional = false 140 | python-versions = ">=3.6" 141 | version = "0.16.0" 142 | 143 | [[package]] 144 | category = "dev" 145 | description = "More routines for operating on iterables, beyond itertools" 146 | name = "more-itertools" 147 | optional = false 148 | python-versions = ">=3.5" 149 | version = "8.4.0" 150 | 151 | [[package]] 152 | category = "main" 153 | description = "NumPy is the fundamental package for array computing with Python." 154 | name = "numpy" 155 | optional = false 156 | python-versions = ">=3.6" 157 | version = "1.19.1" 158 | 159 | [[package]] 160 | category = "main" 161 | description = "Core utilities for Python packages" 162 | name = "packaging" 163 | optional = false 164 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 165 | version = "20.4" 166 | 167 | [package.dependencies] 168 | pyparsing = ">=2.0.2" 169 | six = "*" 170 | 171 | [[package]] 172 | category = "main" 173 | description = "Python Imaging Library (Fork)" 174 | name = "pillow" 175 | optional = false 176 | python-versions = ">=3.5" 177 | version = "7.2.0" 178 | 179 | [[package]] 180 | category = "dev" 181 | description = "plugin and hook calling mechanisms for python" 182 | name = "pluggy" 183 | optional = false 184 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 185 | version = "0.13.1" 186 | 187 | [package.dependencies] 188 | [package.dependencies.importlib-metadata] 189 | python = "<3.8" 190 | version = ">=0.12" 191 | 192 | [package.extras] 193 | dev = ["pre-commit", "tox"] 194 | 195 | [[package]] 196 | category = "dev" 197 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 198 | name = "py" 199 | optional = false 200 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 201 | version = "1.9.0" 202 | 203 | [[package]] 204 | category = "main" 205 | description = "Data validation and settings management using python 3.6 type hinting" 206 | name = "pydantic" 207 | optional = false 208 | python-versions = ">=3.6" 209 | version = "1.6.1" 210 | 211 | [package.extras] 212 | dotenv = ["python-dotenv (>=0.10.4)"] 213 | email = ["email-validator (>=1.0.3)"] 214 | typing_extensions = ["typing-extensions (>=3.7.2)"] 215 | 216 | [[package]] 217 | category = "main" 218 | description = "Python parsing module" 219 | name = "pyparsing" 220 | optional = false 221 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 222 | version = "2.4.7" 223 | 224 | [[package]] 225 | category = "dev" 226 | description = "pytest: simple powerful testing with Python" 227 | name = "pytest" 228 | optional = false 229 | python-versions = ">=3.5" 230 | version = "5.4.3" 231 | 232 | [package.dependencies] 233 | atomicwrites = ">=1.0" 234 | attrs = ">=17.4.0" 235 | colorama = "*" 236 | more-itertools = ">=4.0.0" 237 | packaging = "*" 238 | pluggy = ">=0.12,<1.0" 239 | py = ">=1.5.0" 240 | wcwidth = "*" 241 | 242 | [package.dependencies.importlib-metadata] 243 | python = "<3.8" 244 | version = ">=0.12" 245 | 246 | [package.extras] 247 | checkqa-mypy = ["mypy (v0.761)"] 248 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] 249 | 250 | [[package]] 251 | category = "main" 252 | description = "Alternative regular expression module, to replace re." 253 | name = "regex" 254 | optional = false 255 | python-versions = "*" 256 | version = "2020.7.14" 257 | 258 | [[package]] 259 | category = "main" 260 | description = "Python HTTP for Humans." 261 | name = "requests" 262 | optional = false 263 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 264 | version = "2.24.0" 265 | 266 | [package.dependencies] 267 | certifi = ">=2017.4.17" 268 | chardet = ">=3.0.2,<4" 269 | idna = ">=2.5,<3" 270 | urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" 271 | 272 | [package.extras] 273 | security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] 274 | socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] 275 | 276 | [[package]] 277 | category = "main" 278 | description = "SacreMoses" 279 | name = "sacremoses" 280 | optional = false 281 | python-versions = "*" 282 | version = "0.0.43" 283 | 284 | [package.dependencies] 285 | click = "*" 286 | joblib = "*" 287 | regex = "*" 288 | six = "*" 289 | tqdm = "*" 290 | 291 | [[package]] 292 | category = "main" 293 | description = "SentencePiece python wrapper" 294 | name = "sentencepiece" 295 | optional = false 296 | python-versions = "*" 297 | version = "0.1.91" 298 | 299 | [[package]] 300 | category = "main" 301 | description = "Python 2 and 3 compatibility utilities" 302 | name = "six" 303 | optional = false 304 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 305 | version = "1.15.0" 306 | 307 | [[package]] 308 | category = "main" 309 | description = "The little ASGI library that shines." 310 | name = "starlette" 311 | optional = false 312 | python-versions = ">=3.6" 313 | version = "0.13.6" 314 | 315 | [package.extras] 316 | full = ["aiofiles", "graphene", "itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests", "ujson"] 317 | 318 | [[package]] 319 | category = "main" 320 | description = "Fast and Customizable Tokenizers" 321 | name = "tokenizers" 322 | optional = false 323 | python-versions = "*" 324 | version = "0.8.1rc1" 325 | 326 | [package.extras] 327 | testing = ["pytest"] 328 | 329 | [[package]] 330 | category = "main" 331 | description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" 332 | name = "torch" 333 | optional = false 334 | python-versions = ">=3.6.1" 335 | version = "1.6.0" 336 | 337 | [package.dependencies] 338 | future = "*" 339 | numpy = "*" 340 | 341 | [[package]] 342 | category = "main" 343 | description = "image and video datasets and models for torch deep learning" 344 | name = "torchvision" 345 | optional = false 346 | python-versions = "*" 347 | version = "0.7.0" 348 | 349 | [package.dependencies] 350 | numpy = "*" 351 | pillow = ">=4.1.1" 352 | torch = "1.6.0" 353 | 354 | [package.extras] 355 | scipy = ["scipy"] 356 | 357 | [[package]] 358 | category = "main" 359 | description = "Fast, Extensible Progress Meter" 360 | name = "tqdm" 361 | optional = false 362 | python-versions = ">=2.6, !=3.0.*, !=3.1.*" 363 | version = "4.48.2" 364 | 365 | [package.extras] 366 | dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] 367 | 368 | [[package]] 369 | category = "main" 370 | description = "State-of-the-art Natural Language Processing for TensorFlow 2.0 and PyTorch" 371 | name = "transformers" 372 | optional = false 373 | python-versions = ">=3.6.0" 374 | version = "3.0.2" 375 | 376 | [package.dependencies] 377 | filelock = "*" 378 | numpy = "*" 379 | packaging = "*" 380 | regex = "!=2019.12.17" 381 | requests = "*" 382 | sacremoses = "*" 383 | sentencepiece = "!=0.1.92" 384 | tokenizers = "0.8.1.rc1" 385 | tqdm = ">=4.27" 386 | 387 | [package.extras] 388 | all = ["pydantic", "uvicorn", "fastapi", "starlette", "tensorflow", "torch"] 389 | dev = ["pytest", "pytest-xdist", "timeout-decorator", "psutil", "black", "isort", "flake8", "mecab-python3 (<1)", "scikit-learn", "tensorflow", "torch"] 390 | docs = ["recommonmark", "sphinx", "sphinx-markdown-tables", "sphinx-rtd-theme (0.4.3)", "sphinx-copybutton"] 391 | mecab = ["mecab-python3 (<1)"] 392 | quality = ["black", "isort", "flake8"] 393 | serving = ["pydantic", "uvicorn", "fastapi", "starlette"] 394 | sklearn = ["scikit-learn"] 395 | testing = ["pytest", "pytest-xdist", "timeout-decorator", "psutil"] 396 | tf = ["tensorflow", "onnxconverter-common", "keras2onnx"] 397 | tf-cpu = ["tensorflow-cpu", "onnxconverter-common", "keras2onnx"] 398 | torch = ["torch"] 399 | 400 | [[package]] 401 | category = "main" 402 | description = "HTTP library with thread-safe connection pooling, file post, and more." 403 | name = "urllib3" 404 | optional = false 405 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" 406 | version = "1.25.10" 407 | 408 | [package.extras] 409 | brotli = ["brotlipy (>=0.6.0)"] 410 | secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"] 411 | socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] 412 | 413 | [[package]] 414 | category = "main" 415 | description = "The lightning-fast ASGI server." 416 | name = "uvicorn" 417 | optional = false 418 | python-versions = "*" 419 | version = "0.11.8" 420 | 421 | [package.dependencies] 422 | click = ">=7.0.0,<8.0.0" 423 | h11 = ">=0.8,<0.10" 424 | httptools = ">=0.1.0,<0.2.0" 425 | uvloop = ">=0.14.0" 426 | websockets = ">=8.0.0,<9.0.0" 427 | 428 | [package.extras] 429 | watchgodreload = ["watchgod (>=0.6,<0.7)"] 430 | 431 | [[package]] 432 | category = "main" 433 | description = "Fast implementation of asyncio event loop on top of libuv" 434 | marker = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"" 435 | name = "uvloop" 436 | optional = false 437 | python-versions = "*" 438 | version = "0.14.0" 439 | 440 | [[package]] 441 | category = "dev" 442 | description = "Measures the displayed width of unicode strings in a terminal" 443 | name = "wcwidth" 444 | optional = false 445 | python-versions = "*" 446 | version = "0.2.5" 447 | 448 | [[package]] 449 | category = "main" 450 | description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" 451 | name = "websockets" 452 | optional = false 453 | python-versions = ">=3.6.1" 454 | version = "8.1" 455 | 456 | [[package]] 457 | category = "main" 458 | description = "pure python download utility" 459 | name = "wget" 460 | optional = false 461 | python-versions = "*" 462 | version = "3.2" 463 | 464 | [[package]] 465 | category = "dev" 466 | description = "Backport of pathlib-compatible object wrapper for zip files" 467 | marker = "python_version < \"3.8\"" 468 | name = "zipp" 469 | optional = false 470 | python-versions = ">=3.6" 471 | version = "3.1.0" 472 | 473 | [package.extras] 474 | docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] 475 | testing = ["jaraco.itertools", "func-timeout"] 476 | 477 | [metadata] 478 | content-hash = "6f0a6cbc3841f3d5671e8f7b2742e0a2b893226eb3d50d2497d5ba28908a97ca" 479 | lock-version = "1.0" 480 | python-versions = "^3.7" 481 | 482 | [metadata.files] 483 | atomicwrites = [ 484 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, 485 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, 486 | ] 487 | attrs = [ 488 | {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, 489 | {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, 490 | ] 491 | certifi = [ 492 | {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"}, 493 | {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"}, 494 | ] 495 | chardet = [ 496 | {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, 497 | {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, 498 | ] 499 | click = [ 500 | {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, 501 | {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, 502 | ] 503 | colorama = [ 504 | {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, 505 | {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, 506 | ] 507 | fastapi = [ 508 | {file = "fastapi-0.60.1-py3-none-any.whl", hash = "sha256:96f964c3d9da8183f824857ad67c16c00ff3297e7bbca6748f60bd8485ded38c"}, 509 | {file = "fastapi-0.60.1.tar.gz", hash = "sha256:9a4faa0e2b9c88a3772f7ce15eb4005bbdd27d1230ab4a0cd3517316175014a6"}, 510 | ] 511 | filelock = [ 512 | {file = "filelock-3.0.12-py3-none-any.whl", hash = "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"}, 513 | {file = "filelock-3.0.12.tar.gz", hash = "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59"}, 514 | ] 515 | future = [ 516 | {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, 517 | ] 518 | h11 = [ 519 | {file = "h11-0.9.0-py2.py3-none-any.whl", hash = "sha256:4bc6d6a1238b7615b266ada57e0618568066f57dd6fa967d1290ec9309b2f2f1"}, 520 | {file = "h11-0.9.0.tar.gz", hash = "sha256:33d4bca7be0fa039f4e84d50ab00531047e53d6ee8ffbc83501ea602c169cae1"}, 521 | ] 522 | httptools = [ 523 | {file = "httptools-0.1.1-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:a2719e1d7a84bb131c4f1e0cb79705034b48de6ae486eb5297a139d6a3296dce"}, 524 | {file = "httptools-0.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:fa3cd71e31436911a44620473e873a256851e1f53dee56669dae403ba41756a4"}, 525 | {file = "httptools-0.1.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:86c6acd66765a934e8730bf0e9dfaac6fdcf2a4334212bd4a0a1c78f16475ca6"}, 526 | {file = "httptools-0.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bc3114b9edbca5a1eb7ae7db698c669eb53eb8afbbebdde116c174925260849c"}, 527 | {file = "httptools-0.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:ac0aa11e99454b6a66989aa2d44bca41d4e0f968e395a0a8f164b401fefe359a"}, 528 | {file = "httptools-0.1.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:96da81e1992be8ac2fd5597bf0283d832287e20cb3cfde8996d2b00356d4e17f"}, 529 | {file = "httptools-0.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:56b6393c6ac7abe632f2294da53f30d279130a92e8ae39d8d14ee2e1b05ad1f2"}, 530 | {file = "httptools-0.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:96eb359252aeed57ea5c7b3d79839aaa0382c9d3149f7d24dd7172b1bcecb009"}, 531 | {file = "httptools-0.1.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:fea04e126014169384dee76a153d4573d90d0cbd1d12185da089f73c78390437"}, 532 | {file = "httptools-0.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:3592e854424ec94bd17dc3e0c96a64e459ec4147e6d53c0a42d0ebcef9cb9c5d"}, 533 | {file = "httptools-0.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a4b1b2012b28e68306575ad14ad5e9120b34fccd02a81eb08838d7e3bbb48be"}, 534 | {file = "httptools-0.1.1.tar.gz", hash = "sha256:41b573cf33f64a8f8f3400d0a7faf48e1888582b6f6e02b82b9bd4f0bf7497ce"}, 535 | ] 536 | idna = [ 537 | {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, 538 | {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, 539 | ] 540 | importlib-metadata = [ 541 | {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, 542 | {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, 543 | ] 544 | joblib = [ 545 | {file = "joblib-0.16.0-py3-none-any.whl", hash = "sha256:d348c5d4ae31496b2aa060d6d9b787864dd204f9480baaa52d18850cb43e9f49"}, 546 | {file = "joblib-0.16.0.tar.gz", hash = "sha256:8f52bf24c64b608bf0b2563e0e47d6fcf516abc8cfafe10cfd98ad66d94f92d6"}, 547 | ] 548 | more-itertools = [ 549 | {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, 550 | {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, 551 | ] 552 | numpy = [ 553 | {file = "numpy-1.19.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1cca51512299841bf69add3b75361779962f9cee7d9ee3bb446d5982e925b69"}, 554 | {file = "numpy-1.19.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c9591886fc9cbe5532d5df85cb8e0cc3b44ba8ce4367bd4cf1b93dc19713da72"}, 555 | {file = "numpy-1.19.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:cf1347450c0b7644ea142712619533553f02ef23f92f781312f6a3553d031fc7"}, 556 | {file = "numpy-1.19.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:ed8a311493cf5480a2ebc597d1e177231984c818a86875126cfd004241a73c3e"}, 557 | {file = "numpy-1.19.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3673c8b2b29077f1b7b3a848794f8e11f401ba0b71c49fbd26fb40b71788b132"}, 558 | {file = "numpy-1.19.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:56ef7f56470c24bb67fb43dae442e946a6ce172f97c69f8d067ff8550cf782ff"}, 559 | {file = "numpy-1.19.1-cp36-cp36m-win32.whl", hash = "sha256:aaf42a04b472d12515debc621c31cf16c215e332242e7a9f56403d814c744624"}, 560 | {file = "numpy-1.19.1-cp36-cp36m-win_amd64.whl", hash = "sha256:082f8d4dd69b6b688f64f509b91d482362124986d98dc7dc5f5e9f9b9c3bb983"}, 561 | {file = "numpy-1.19.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e4f6d3c53911a9d103d8ec9518190e52a8b945bab021745af4939cfc7c0d4a9e"}, 562 | {file = "numpy-1.19.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:5b6885c12784a27e957294b60f97e8b5b4174c7504665333c5e94fbf41ae5d6a"}, 563 | {file = "numpy-1.19.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1bc0145999e8cb8aed9d4e65dd8b139adf1919e521177f198529687dbf613065"}, 564 | {file = "numpy-1.19.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:5a936fd51049541d86ccdeef2833cc89a18e4d3808fe58a8abeb802665c5af93"}, 565 | {file = "numpy-1.19.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ef71a1d4fd4858596ae80ad1ec76404ad29701f8ca7cdcebc50300178db14dfc"}, 566 | {file = "numpy-1.19.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b9792b0ac0130b277536ab8944e7b754c69560dac0415dd4b2dbd16b902c8954"}, 567 | {file = "numpy-1.19.1-cp37-cp37m-win32.whl", hash = "sha256:b12e639378c741add21fbffd16ba5ad25c0a1a17cf2b6fe4288feeb65144f35b"}, 568 | {file = "numpy-1.19.1-cp37-cp37m-win_amd64.whl", hash = "sha256:8343bf67c72e09cfabfab55ad4a43ce3f6bf6e6ced7acf70f45ded9ebb425055"}, 569 | {file = "numpy-1.19.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e45f8e981a0ab47103181773cc0a54e650b2aef8c7b6cd07405d0fa8d869444a"}, 570 | {file = "numpy-1.19.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:667c07063940e934287993366ad5f56766bc009017b4a0fe91dbd07960d0aba7"}, 571 | {file = "numpy-1.19.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:480fdd4dbda4dd6b638d3863da3be82873bba6d32d1fc12ea1b8486ac7b8d129"}, 572 | {file = "numpy-1.19.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:935c27ae2760c21cd7354402546f6be21d3d0c806fffe967f745d5f2de5005a7"}, 573 | {file = "numpy-1.19.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:309cbcfaa103fc9a33ec16d2d62569d541b79f828c382556ff072442226d1968"}, 574 | {file = "numpy-1.19.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7ed448ff4eaffeb01094959b19cbaf998ecdee9ef9932381420d514e446601cd"}, 575 | {file = "numpy-1.19.1-cp38-cp38-win32.whl", hash = "sha256:de8b4a9b56255797cbddb93281ed92acbc510fb7b15df3f01bd28f46ebc4edae"}, 576 | {file = "numpy-1.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:92feb989b47f83ebef246adabc7ff3b9a59ac30601c3f6819f8913458610bdcc"}, 577 | {file = "numpy-1.19.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:e1b1dc0372f530f26a03578ac75d5e51b3868b9b76cd2facba4c9ee0eb252ab1"}, 578 | {file = "numpy-1.19.1.zip", hash = "sha256:b8456987b637232602ceb4d663cb34106f7eb780e247d51a260b84760fd8f491"}, 579 | ] 580 | packaging = [ 581 | {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, 582 | {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, 583 | ] 584 | pillow = [ 585 | {file = "Pillow-7.2.0-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae"}, 586 | {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f"}, 587 | {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38"}, 588 | {file = "Pillow-7.2.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5"}, 589 | {file = "Pillow-7.2.0-cp35-cp35m-win32.whl", hash = "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad"}, 590 | {file = "Pillow-7.2.0-cp35-cp35m-win_amd64.whl", hash = "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f"}, 591 | {file = "Pillow-7.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d"}, 592 | {file = "Pillow-7.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233"}, 593 | {file = "Pillow-7.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f"}, 594 | {file = "Pillow-7.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8"}, 595 | {file = "Pillow-7.2.0-cp36-cp36m-win32.whl", hash = "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a"}, 596 | {file = "Pillow-7.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce"}, 597 | {file = "Pillow-7.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4"}, 598 | {file = "Pillow-7.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727"}, 599 | {file = "Pillow-7.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b"}, 600 | {file = "Pillow-7.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d"}, 601 | {file = "Pillow-7.2.0-cp37-cp37m-win32.whl", hash = "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63"}, 602 | {file = "Pillow-7.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1"}, 603 | {file = "Pillow-7.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6"}, 604 | {file = "Pillow-7.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9"}, 605 | {file = "Pillow-7.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41"}, 606 | {file = "Pillow-7.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8"}, 607 | {file = "Pillow-7.2.0-cp38-cp38-win32.whl", hash = "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f"}, 608 | {file = "Pillow-7.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6"}, 609 | {file = "Pillow-7.2.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d"}, 610 | {file = "Pillow-7.2.0.tar.gz", hash = "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626"}, 611 | ] 612 | pluggy = [ 613 | {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, 614 | {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, 615 | ] 616 | py = [ 617 | {file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"}, 618 | {file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"}, 619 | ] 620 | pydantic = [ 621 | {file = "pydantic-1.6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:418b84654b60e44c0cdd5384294b0e4bc1ebf42d6e873819424f3b78b8690614"}, 622 | {file = "pydantic-1.6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4900b8820b687c9a3ed753684337979574df20e6ebe4227381d04b3c3c628f99"}, 623 | {file = "pydantic-1.6.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:b49c86aecde15cde33835d5d6360e55f5e0067bb7143a8303bf03b872935c75b"}, 624 | {file = "pydantic-1.6.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:2de562a456c4ecdc80cf1a8c3e70c666625f7d02d89a6174ecf63754c734592e"}, 625 | {file = "pydantic-1.6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f769141ab0abfadf3305d4fcf36660e5cf568a666dd3efab7c3d4782f70946b1"}, 626 | {file = "pydantic-1.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2dc946b07cf24bee4737ced0ae77e2ea6bc97489ba5a035b603bd1b40ad81f7e"}, 627 | {file = "pydantic-1.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:36dbf6f1be212ab37b5fda07667461a9219c956181aa5570a00edfb0acdfe4a1"}, 628 | {file = "pydantic-1.6.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:1783c1d927f9e1366e0e0609ae324039b2479a1a282a98ed6a6836c9ed02002c"}, 629 | {file = "pydantic-1.6.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:cf3933c98cb5e808b62fae509f74f209730b180b1e3c3954ee3f7949e083a7df"}, 630 | {file = "pydantic-1.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f8af9b840a9074e08c0e6dc93101de84ba95df89b267bf7151d74c553d66833b"}, 631 | {file = "pydantic-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:40d765fa2d31d5be8e29c1794657ad46f5ee583a565c83cea56630d3ae5878b9"}, 632 | {file = "pydantic-1.6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3fa799f3cfff3e5f536cbd389368fc96a44bb30308f258c94ee76b73bd60531d"}, 633 | {file = "pydantic-1.6.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:6c3f162ba175678218629f446a947e3356415b6b09122dcb364e58c442c645a7"}, 634 | {file = "pydantic-1.6.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:eb75dc1809875d5738df14b6566ccf9fd9c0bcde4f36b72870f318f16b9f5c20"}, 635 | {file = "pydantic-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:530d7222a2786a97bc59ee0e0ebbe23728f82974b1f1ad9a11cd966143410633"}, 636 | {file = "pydantic-1.6.1-py36.py37.py38-none-any.whl", hash = "sha256:b5b3489cb303d0f41ad4a7390cf606a5f2c7a94dcba20c051cd1c653694cb14d"}, 637 | {file = "pydantic-1.6.1.tar.gz", hash = "sha256:54122a8ed6b75fe1dd80797f8251ad2063ea348a03b77218d73ea9fe19bd4e73"}, 638 | ] 639 | pyparsing = [ 640 | {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, 641 | {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, 642 | ] 643 | pytest = [ 644 | {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, 645 | {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, 646 | ] 647 | regex = [ 648 | {file = "regex-2020.7.14-cp27-cp27m-win32.whl", hash = "sha256:e46d13f38cfcbb79bfdb2964b0fe12561fe633caf964a77a5f8d4e45fe5d2ef7"}, 649 | {file = "regex-2020.7.14-cp27-cp27m-win_amd64.whl", hash = "sha256:6961548bba529cac7c07af2fd4d527c5b91bb8fe18995fed6044ac22b3d14644"}, 650 | {file = "regex-2020.7.14-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c50a724d136ec10d920661f1442e4a8b010a4fe5aebd65e0c2241ea41dbe93dc"}, 651 | {file = "regex-2020.7.14-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8a51f2c6d1f884e98846a0a9021ff6861bdb98457879f412fdc2b42d14494067"}, 652 | {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9c568495e35599625f7b999774e29e8d6b01a6fb684d77dee1f56d41b11b40cd"}, 653 | {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:51178c738d559a2d1071ce0b0f56e57eb315bcf8f7d4cf127674b533e3101f88"}, 654 | {file = "regex-2020.7.14-cp36-cp36m-win32.whl", hash = "sha256:9eddaafb3c48e0900690c1727fba226c4804b8e6127ea409689c3bb492d06de4"}, 655 | {file = "regex-2020.7.14-cp36-cp36m-win_amd64.whl", hash = "sha256:14a53646369157baa0499513f96091eb70382eb50b2c82393d17d7ec81b7b85f"}, 656 | {file = "regex-2020.7.14-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:1269fef3167bb52631ad4fa7dd27bf635d5a0790b8e6222065d42e91bede4162"}, 657 | {file = "regex-2020.7.14-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d0a5095d52b90ff38592bbdc2644f17c6d495762edf47d876049cfd2968fbccf"}, 658 | {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4c037fd14c5f4e308b8370b447b469ca10e69427966527edcab07f52d88388f7"}, 659 | {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bc3d98f621898b4a9bc7fecc00513eec8f40b5b83913d74ccb445f037d58cd89"}, 660 | {file = "regex-2020.7.14-cp37-cp37m-win32.whl", hash = "sha256:46bac5ca10fb748d6c55843a931855e2727a7a22584f302dd9bb1506e69f83f6"}, 661 | {file = "regex-2020.7.14-cp37-cp37m-win_amd64.whl", hash = "sha256:0dc64ee3f33cd7899f79a8d788abfbec168410be356ed9bd30bbd3f0a23a7204"}, 662 | {file = "regex-2020.7.14-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5ea81ea3dbd6767873c611687141ec7b06ed8bab43f68fad5b7be184a920dc99"}, 663 | {file = "regex-2020.7.14-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bbb332d45b32df41200380fff14712cb6093b61bd142272a10b16778c418e98e"}, 664 | {file = "regex-2020.7.14-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c11d6033115dc4887c456565303f540c44197f4fc1a2bfb192224a301534888e"}, 665 | {file = "regex-2020.7.14-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:75aaa27aa521a182824d89e5ab0a1d16ca207318a6b65042b046053cfc8ed07a"}, 666 | {file = "regex-2020.7.14-cp38-cp38-win32.whl", hash = "sha256:d6cff2276e502b86a25fd10c2a96973fdb45c7a977dca2138d661417f3728341"}, 667 | {file = "regex-2020.7.14-cp38-cp38-win_amd64.whl", hash = "sha256:7a2dd66d2d4df34fa82c9dc85657c5e019b87932019947faece7983f2089a840"}, 668 | {file = "regex-2020.7.14.tar.gz", hash = "sha256:3a3af27a8d23143c49a3420efe5b3f8cf1a48c6fc8bc6856b03f638abc1833bb"}, 669 | ] 670 | requests = [ 671 | {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, 672 | {file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"}, 673 | ] 674 | sacremoses = [ 675 | {file = "sacremoses-0.0.43.tar.gz", hash = "sha256:123c1bf2664351fb05e16f87d3786dbe44a050cfd7b85161c09ad9a63a8e2948"}, 676 | ] 677 | sentencepiece = [ 678 | {file = "sentencepiece-0.1.91-cp27-cp27m-macosx_10_6_x86_64.whl", hash = "sha256:f2f109514b28326d5c6d69b43ba6b08e6fedf8fc77416b9a9c16be55c9ac138d"}, 679 | {file = "sentencepiece-0.1.91-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b3643634e043fd7a5914d51d7dc60003dad0af976b8496df0406a487b0b83a8e"}, 680 | {file = "sentencepiece-0.1.91-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:21a2e9f476f0c3e45da1e5da00b7ec5241bbddb524bd7b1b3d61b1bcbc05efa6"}, 681 | {file = "sentencepiece-0.1.91-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:30224b1f77af9cef79ffe3a40ed0e536be44df75c066f771e9e769b48379bd98"}, 682 | {file = "sentencepiece-0.1.91-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:679fcdd01e01d990950a46a814210445f2202260d092d3b69f9826739d8aed2b"}, 683 | {file = "sentencepiece-0.1.91-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:123ac26429025b3153f8bae53d044e9dd29539e888dcb9f39a4982e6daf9dbe9"}, 684 | {file = "sentencepiece-0.1.91-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:53f4a91c8a6b55a75caad70d9f34bf331a576e9708c549729b06412c857aacb9"}, 685 | {file = "sentencepiece-0.1.91-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f1c0cf36fcff4a3ea8925babc3ed7f5f3d58628e062b24f9fad92c400bc9210c"}, 686 | {file = "sentencepiece-0.1.91-cp36-cp36m-macosx_10_6_x86_64.whl", hash = "sha256:c0b01bb8ab3b62aba76d6b0851a1d0fcf5df5ef5616f114ea85917d8ab5f59db"}, 687 | {file = "sentencepiece-0.1.91-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:70b4164c98dba43246a068c848fab5ac9966b5bcd731ee4cb9bcf6ae976389a4"}, 688 | {file = "sentencepiece-0.1.91-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b858805ac3c6d92e5454a89476b1f9e0505e1511276cd258d5a70776c70374f1"}, 689 | {file = "sentencepiece-0.1.91-cp36-cp36m-win32.whl", hash = "sha256:8bbb9173168d53165ba00172a5db7734e4826c30e6ffc4b3f8a6098713f6111d"}, 690 | {file = "sentencepiece-0.1.91-cp36-cp36m-win_amd64.whl", hash = "sha256:51c25d504beeef4c697b8f55e2baf7c6b31733a190ff9b983a6db57faa59d3d8"}, 691 | {file = "sentencepiece-0.1.91-cp37-cp37m-macosx_10_6_x86_64.whl", hash = "sha256:a04218f1b93b5669f3cee1dc8d6c397428e2f6af8843a20ddb2b629f6a86e632"}, 692 | {file = "sentencepiece-0.1.91-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:7fcda06cab76136346dd279268664c65f0b66bb2147ceb97e2cec25b426e8210"}, 693 | {file = "sentencepiece-0.1.91-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3b4175a9d883a3b27436d51cb82794e3a62d0955bb36cc96d5d7932095c13135"}, 694 | {file = "sentencepiece-0.1.91-cp37-cp37m-win32.whl", hash = "sha256:f0b383de68604195fe806072e7c8837eb5156455dfdb18fd26a9a94df3f57d42"}, 695 | {file = "sentencepiece-0.1.91-cp37-cp37m-win_amd64.whl", hash = "sha256:82d819eb1e997b39424d7422aa885d2ef514f754dd2935a4f4fcfdedeee955c6"}, 696 | {file = "sentencepiece-0.1.91-cp38-cp38-macosx_10_6_x86_64.whl", hash = "sha256:f331fd58f438d5d5476d189e9a4944c84f7e4b027533809292b9c119b58e43b8"}, 697 | {file = "sentencepiece-0.1.91-cp38-cp38-manylinux1_i686.whl", hash = "sha256:79ad2f82b412859c516b569fb89b5e5c0ceba74d71c8d4b99cc8a2c734f3c79d"}, 698 | {file = "sentencepiece-0.1.91-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:796726d680d6c26f0f4ff213a0f6b1ef790b02071268adf5f449739c1c903f93"}, 699 | {file = "sentencepiece-0.1.91-cp38-cp38-win32.whl", hash = "sha256:9bdff324279359598a516de8413fd2c62bc3c9c8f569f4431829599fbe57e417"}, 700 | {file = "sentencepiece-0.1.91-cp38-cp38-win_amd64.whl", hash = "sha256:c2a004470d388272d6c17ca160ef73d6ea1ffcddc345771d817ece5c85d85dcb"}, 701 | {file = "sentencepiece-0.1.91.tar.gz", hash = "sha256:f9700cf607ea064d9fad34c751fbf49953dcc56fe68c54b277481aa0aec5c18f"}, 702 | ] 703 | six = [ 704 | {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, 705 | {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, 706 | ] 707 | starlette = [ 708 | {file = "starlette-0.13.6-py3-none-any.whl", hash = "sha256:bd2ffe5e37fb75d014728511f8e68ebf2c80b0fa3d04ca1479f4dc752ae31ac9"}, 709 | {file = "starlette-0.13.6.tar.gz", hash = "sha256:ebe8ee08d9be96a3c9f31b2cb2a24dbdf845247b745664bd8a3f9bd0c977fdbc"}, 710 | ] 711 | tokenizers = [ 712 | {file = "tokenizers-0.8.1rc1-cp35-cp35m-macosx_10_10_x86_64.whl", hash = "sha256:49f421fe35695aebe010180923e28044035ff8099d211ce736772cb9de685d6e"}, 713 | {file = "tokenizers-0.8.1rc1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9a1b06d64822d74ced767a584812034386133e1cd11a7330ac1b59ce2c807dd2"}, 714 | {file = "tokenizers-0.8.1rc1-cp35-cp35m-win32.whl", hash = "sha256:206ee9d10d46415eca527055d7468f6ad43fe5cf5f4629dbcb0674e621bf193a"}, 715 | {file = "tokenizers-0.8.1rc1-cp35-cp35m-win_amd64.whl", hash = "sha256:8fb9657b43baa7230c15db7cf1d040914580431342a0e16c3cb2f8f682745654"}, 716 | {file = "tokenizers-0.8.1rc1-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:ef206a95d89133f30e918c7f7a5c5e123fb8a1f6471362df08131dded3539002"}, 717 | {file = "tokenizers-0.8.1rc1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:49dec8c6cb1fcbd3f0c997ec1f31a7ef83285c2e12855bd80c8009c3d9d66126"}, 718 | {file = "tokenizers-0.8.1rc1-cp36-cp36m-win32.whl", hash = "sha256:6191f3d707a865e57cd211dd91076b66039c1b0f580d5dfe71e0c84d146614a4"}, 719 | {file = "tokenizers-0.8.1rc1-cp36-cp36m-win_amd64.whl", hash = "sha256:210fc91ff4dfaf43b558f958fa0edbfe98724c2a6cbba25ffe4477ca941cfeaa"}, 720 | {file = "tokenizers-0.8.1rc1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:b211e4837e709fbf36612ac8821406d4b29dde311b58ffbc609e229665759605"}, 721 | {file = "tokenizers-0.8.1rc1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:b108431ef2e0375c28339266886719cfc2431494047fd682dd7c72c5795e08f9"}, 722 | {file = "tokenizers-0.8.1rc1-cp37-cp37m-win32.whl", hash = "sha256:39a989338cb77c3897340b977b0db1e75b59b98bd0c10182fa2f8901233049f0"}, 723 | {file = "tokenizers-0.8.1rc1-cp37-cp37m-win_amd64.whl", hash = "sha256:f8239f602f636c0d3727925a9686362d05477d1dcef4bfa9d097d40dfc53ffd3"}, 724 | {file = "tokenizers-0.8.1rc1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:76dd23a1eaae5f9ed0deda05b5361a979c11ac621a901e729227564d0936383f"}, 725 | {file = "tokenizers-0.8.1rc1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:da0a7c7df84805315f732e471eb7ae25be50f07f53042202aeb36ecc23244730"}, 726 | {file = "tokenizers-0.8.1rc1-cp38-cp38-win32.whl", hash = "sha256:6ef5fb622383b437ec71412f2457211f330286abc35953ba150a7f58ebee217b"}, 727 | {file = "tokenizers-0.8.1rc1-cp38-cp38-win_amd64.whl", hash = "sha256:6b8fe503a38afe67085accc433ce3692c002d3c48baf20e67a3e93b558b96597"}, 728 | {file = "tokenizers-0.8.1rc1.tar.gz", hash = "sha256:98af43fa61f1fc0ade954102d3d34e02df3c6f896315500865b93400f93dd99e"}, 729 | ] 730 | torch = [ 731 | {file = "torch-1.6.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:7669f4d923b5758e28b521ea749c795ed67ff24b45ba20296bc8cff706d08df8"}, 732 | {file = "torch-1.6.0-cp36-none-macosx_10_9_x86_64.whl", hash = "sha256:728facb972a5952323c6d790c2c5922b2b35c44b0bc7bdfa02f8639727671a0c"}, 733 | {file = "torch-1.6.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:87d65c01d1b70bb46070824f28bfd93c86d3c5c56b90cbbe836a3f2491d91c76"}, 734 | {file = "torch-1.6.0-cp37-none-macosx_10_9_x86_64.whl", hash = "sha256:3838bd01af7dfb1f78573973f6842ce75b17e8e4f22be99c891dcb7c94bc13f5"}, 735 | {file = "torch-1.6.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5357873e243bcfa804c32dc341f564e9a4c12addfc9baae4ee857fcc09a0a216"}, 736 | {file = "torch-1.6.0-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:4f9a4ad7947cef566afb0a323d99009fe8524f0b0f2ca1fb7ad5de0400381a5b"}, 737 | ] 738 | torchvision = [ 739 | {file = "torchvision-0.7.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a70d80bb8749c1e4a46fa56dc2fc857e98d14600841e02cc2fed766daf96c245"}, 740 | {file = "torchvision-0.7.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:14c0bf60fa26aabaea64ef30b8e5d441ee78d1a5eed568c30806af19bbe6b638"}, 741 | {file = "torchvision-0.7.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8c8df7e1d1f3d4e088256be1e8c8d3eb90b016302baa4649742d47ae1531da37"}, 742 | {file = "torchvision-0.7.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0d1a5adfef4387659c7a0af3b72e16caa0c67224a422050ab65184d13ac9fb13"}, 743 | {file = "torchvision-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f5686e0a0dd511ac33eb9d6279bd34edd9f282dcb7c8ad21e290882c6206504f"}, 744 | {file = "torchvision-0.7.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cfa2b367bc9acf20f18b151d0525970279719e81969c17214effe77245875354"}, 745 | ] 746 | tqdm = [ 747 | {file = "tqdm-4.48.2-py2.py3-none-any.whl", hash = "sha256:1a336d2b829be50e46b84668691e0a2719f26c97c62846298dd5ae2937e4d5cf"}, 748 | {file = "tqdm-4.48.2.tar.gz", hash = "sha256:564d632ea2b9cb52979f7956e093e831c28d441c11751682f84c86fc46e4fd21"}, 749 | ] 750 | transformers = [ 751 | {file = "transformers-3.0.2-py3-none-any.whl", hash = "sha256:53ecfd27839d5ecf38af6978211462d44d76b526edd7b65d84eaa9b29c9610b8"}, 752 | {file = "transformers-3.0.2.tar.gz", hash = "sha256:e3a72bdba426b7202ed90611aa5b1a1f695c484e937182cbbfa9e719a5400d7e"}, 753 | ] 754 | urllib3 = [ 755 | {file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"}, 756 | {file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"}, 757 | ] 758 | uvicorn = [ 759 | {file = "uvicorn-0.11.8-py3-none-any.whl", hash = "sha256:4b70ddb4c1946e39db9f3082d53e323dfd50634b95fd83625d778729ef1730ef"}, 760 | {file = "uvicorn-0.11.8.tar.gz", hash = "sha256:46a83e371f37ea7ff29577d00015f02c942410288fb57def6440f2653fff1d26"}, 761 | ] 762 | uvloop = [ 763 | {file = "uvloop-0.14.0-cp35-cp35m-macosx_10_11_x86_64.whl", hash = "sha256:08b109f0213af392150e2fe6f81d33261bb5ce968a288eb698aad4f46eb711bd"}, 764 | {file = "uvloop-0.14.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:4544dcf77d74f3a84f03dd6278174575c44c67d7165d4c42c71db3fdc3860726"}, 765 | {file = "uvloop-0.14.0-cp36-cp36m-macosx_10_11_x86_64.whl", hash = "sha256:b4f591aa4b3fa7f32fb51e2ee9fea1b495eb75b0b3c8d0ca52514ad675ae63f7"}, 766 | {file = "uvloop-0.14.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:f07909cd9fc08c52d294b1570bba92186181ca01fe3dc9ffba68955273dd7362"}, 767 | {file = "uvloop-0.14.0-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:afd5513c0ae414ec71d24f6f123614a80f3d27ca655a4fcf6cabe50994cc1891"}, 768 | {file = "uvloop-0.14.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:e7514d7a48c063226b7d06617cbb12a14278d4323a065a8d46a7962686ce2e95"}, 769 | {file = "uvloop-0.14.0-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:bcac356d62edd330080aed082e78d4b580ff260a677508718f88016333e2c9c5"}, 770 | {file = "uvloop-0.14.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4315d2ec3ca393dd5bc0b0089d23101276778c304d42faff5dc4579cb6caef09"}, 771 | {file = "uvloop-0.14.0.tar.gz", hash = "sha256:123ac9c0c7dd71464f58f1b4ee0bbd81285d96cdda8bc3519281b8973e3a461e"}, 772 | ] 773 | wcwidth = [ 774 | {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, 775 | {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, 776 | ] 777 | websockets = [ 778 | {file = "websockets-8.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:3762791ab8b38948f0c4d281c8b2ddfa99b7e510e46bd8dfa942a5fff621068c"}, 779 | {file = "websockets-8.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:3db87421956f1b0779a7564915875ba774295cc86e81bc671631379371af1170"}, 780 | {file = "websockets-8.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4f9f7d28ce1d8f1295717c2c25b732c2bc0645db3215cf757551c392177d7cb8"}, 781 | {file = "websockets-8.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:295359a2cc78736737dd88c343cd0747546b2174b5e1adc223824bcaf3e164cb"}, 782 | {file = "websockets-8.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:1d3f1bf059d04a4e0eb4985a887d49195e15ebabc42364f4eb564b1d065793f5"}, 783 | {file = "websockets-8.1-cp36-cp36m-win32.whl", hash = "sha256:2db62a9142e88535038a6bcfea70ef9447696ea77891aebb730a333a51ed559a"}, 784 | {file = "websockets-8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:0e4fb4de42701340bd2353bb2eee45314651caa6ccee80dbd5f5d5978888fed5"}, 785 | {file = "websockets-8.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:9b248ba3dd8a03b1a10b19efe7d4f7fa41d158fdaa95e2cf65af5a7b95a4f989"}, 786 | {file = "websockets-8.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ce85b06a10fc65e6143518b96d3dca27b081a740bae261c2fb20375801a9d56d"}, 787 | {file = "websockets-8.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:965889d9f0e2a75edd81a07592d0ced54daa5b0785f57dc429c378edbcffe779"}, 788 | {file = "websockets-8.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:751a556205d8245ff94aeef23546a1113b1dd4f6e4d102ded66c39b99c2ce6c8"}, 789 | {file = "websockets-8.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3ef56fcc7b1ff90de46ccd5a687bbd13a3180132268c4254fc0fa44ecf4fc422"}, 790 | {file = "websockets-8.1-cp37-cp37m-win32.whl", hash = "sha256:7ff46d441db78241f4c6c27b3868c9ae71473fe03341340d2dfdbe8d79310acc"}, 791 | {file = "websockets-8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:20891f0dddade307ffddf593c733a3fdb6b83e6f9eef85908113e628fa5a8308"}, 792 | {file = "websockets-8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c1ec8db4fac31850286b7cd3b9c0e1b944204668b8eb721674916d4e28744092"}, 793 | {file = "websockets-8.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5c01fd846263a75bc8a2b9542606927cfad57e7282965d96b93c387622487485"}, 794 | {file = "websockets-8.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9bef37ee224e104a413f0780e29adb3e514a5b698aabe0d969a6ba426b8435d1"}, 795 | {file = "websockets-8.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d705f8aeecdf3262379644e4b55107a3b55860eb812b673b28d0fbc347a60c55"}, 796 | {file = "websockets-8.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:c8a116feafdb1f84607cb3b14aa1418424ae71fee131642fc568d21423b51824"}, 797 | {file = "websockets-8.1-cp38-cp38-win32.whl", hash = "sha256:e898a0863421650f0bebac8ba40840fc02258ef4714cb7e1fd76b6a6354bda36"}, 798 | {file = "websockets-8.1-cp38-cp38-win_amd64.whl", hash = "sha256:f8a7bff6e8664afc4e6c28b983845c5bc14965030e3fb98789734d416af77c4b"}, 799 | {file = "websockets-8.1.tar.gz", hash = "sha256:5c65d2da8c6bce0fca2528f69f44b2f977e06954c8512a952222cea50dad430f"}, 800 | ] 801 | wget = [ 802 | {file = "wget-3.2.zip", hash = "sha256:35e630eca2aa50ce998b9b1a127bb26b30dfee573702782aa982f875e3f16061"}, 803 | ] 804 | zipp = [ 805 | {file = "zipp-3.1.0-py3-none-any.whl", hash = "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b"}, 806 | {file = "zipp-3.1.0.tar.gz", hash = "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"}, 807 | ] 808 | --------------------------------------------------------------------------------