forked from lkrsnik/classla-api
		
	Initial setup
This commit is contained in:
		
							parent
							
								
									bb73d93cef
								
							
						
					
					
						commit
						30961c7e1c
					
				
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| .idea/ | ||||
| data/ | ||||
| __pycache__/ | ||||
| venv/ | ||||
							
								
								
									
										6
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| FROM python:3.9.1 | ||||
| ADD . /classla-api | ||||
| WORKDIR /classla-api | ||||
| RUN pip install -r requirements.txt | ||||
| 
 | ||||
| CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"] | ||||
							
								
								
									
										73
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								README.md
									
									
									
									
									
								
							| @ -1,2 +1,75 @@ | ||||
| # classla-api | ||||
| 
 | ||||
| ## Description | ||||
| This tool uses classla library as an API. It allows for calls on some preset classla settings, as well as a custom one. | ||||
| 
 | ||||
| ## Standard UD | ||||
| Preset classla settings: | ||||
| ```json | ||||
| { | ||||
|   "lang": "sl", | ||||
|   "pos_lemma_pretag": false | ||||
| } | ||||
| ``` | ||||
| Usage example: | ||||
| ```commandline | ||||
| curl -X POST -d '{"text": "France Prešeren je rojen v Vrbi."}' http://127.0.0.1:5000/standard-ud | ||||
| ``` | ||||
| 
 | ||||
| ## Standard JOS | ||||
| Preset classla settings: | ||||
| ```json | ||||
| { | ||||
|   "lang": "sl", | ||||
|   "pos_use_lexicon": true, | ||||
|   "type": "standard_jos" | ||||
| } | ||||
| ``` | ||||
| Usage example: | ||||
| ```commandline | ||||
| curl -X POST -d '{"text": "France Prešeren je rojen v Vrbi."}' http://127.0.0.1:5000/standard-jos | ||||
| ``` | ||||
| 
 | ||||
| ## Nonstandard UD | ||||
| Preset classla settings: | ||||
| ```json | ||||
| { | ||||
|   "lang": "sl", | ||||
|   "pos_use_lexicon": true, | ||||
|   "type": "nonstandard_jos" | ||||
| } | ||||
| ``` | ||||
| Usage example: | ||||
| ```commandline | ||||
| curl -X POST -d '{"text": "kva smo mi zurali zadnje leto v zagrebu..."}' http://127.0.0.1:5000/nonstandard-ud | ||||
| ``` | ||||
| 
 | ||||
| ## Nonstandard JOS | ||||
| Preset classla settings: | ||||
| ```json | ||||
| { | ||||
|   "lang": "sl", | ||||
|   "pos_use_lexicon": true, | ||||
|   "processors": { | ||||
|       "tokenize": "nonstandard", | ||||
|       "lemma": "nonstandard", | ||||
|       "pos": "nonstandard", | ||||
|       "depparse": "standard_jos", | ||||
|       "ner": "nonstandard" | ||||
|     } | ||||
| } | ||||
| ``` | ||||
| Usage example: | ||||
| ```commandline | ||||
| curl -X POST -d '{"text": "kva smo mi zurali zadnje leto v zagrebu..."}' http://127.0.0.1:5000/nonstandard-jos | ||||
| ``` | ||||
| 
 | ||||
| ## Custom settings | ||||
| Custom settings may be used, however they have to be in compliance with what the library allows (you can check this on https://github.com/clarinsi/classla) | ||||
| 
 | ||||
| ###Warning: Usage of custom settings is a slow action! It may take more than 30s to get a result! | ||||
| 
 | ||||
| Usage example: | ||||
| ```commandline | ||||
| curl -X POST -d '{"text": "France Prešeren je rojen v Vrbi.", "settings": {"lang": "sl", "pos_lemma_pretag": false}}' http://127.0.0.1:5000/custom-settings | ||||
| ``` | ||||
							
								
								
									
										107
									
								
								app.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								app.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,107 @@ | ||||
| from datetime import timedelta | ||||
| 
 | ||||
| import torch | ||||
| from flask import Flask, request, jsonify, session | ||||
| import classla | ||||
| import gc | ||||
| 
 | ||||
| classla.download('sl') | ||||
| classla.download('sl', type='standard_jos') | ||||
| classla.download('sl', type='nonstandard') | ||||
| 
 | ||||
| print(f'USE GPU = {torch.cuda.is_available()}') | ||||
| 
 | ||||
| nlp_standard_UD = classla.Pipeline('sl', pos_use_lexicon=True) | ||||
| nlp_standard_JOS = classla.Pipeline('sl', pos_use_lexicon=True, type='standard_jos') | ||||
| nlp_nonstandard_UD = classla.Pipeline('sl', type='nonstandard') | ||||
| nlp_nonstandard_JOS = classla.Pipeline('sl', processors={ | ||||
|       "tokenize": "nonstandard", | ||||
|       "lemma": "nonstandard", | ||||
|       "pos": "nonstandard", | ||||
|       "depparse": "standard_jos", | ||||
|       "ner": "nonstandard" | ||||
|     }) | ||||
| app = Flask(__name__) | ||||
| app.config['SESSION_TYPE'] = 'filesystem' | ||||
| app.config['SECRET_KEY'] = "78df924389h138g01308ghj0d913" | ||||
| # app.config['SESSION_PERMANENT']= False | ||||
| 
 | ||||
| 
 | ||||
| # @app.before_request | ||||
| # def make_session_permanent(): | ||||
| #     session.permanent = True | ||||
| #     app.permanent_session_lifetime = timedelta(seconds=20) | ||||
| #     # app.permanent_session_lifetime = timedelta(minutes=1) | ||||
| 
 | ||||
| @app.route('/') | ||||
| def hello_world(): | ||||
|     return 'This is my first API call!' | ||||
| 
 | ||||
| # @app.route('/run', methods=['GET', "POST"]) | ||||
| # def run(): | ||||
| #     if 'settings' not in session: | ||||
| #         return jsonify({'status': 'ERROR', 'details': 'No settings uploaded!'}) | ||||
| # | ||||
| #     input_json = request.get_json(force=True) | ||||
| #     doc = session['nlp'](input_json['text']) | ||||
| # | ||||
| #     return doc.to_conll() | ||||
| # | ||||
| #     # return 'NOT IN SESSION!\n' | ||||
| 
 | ||||
| # @app.route('/upload-settings', methods=['POST']) | ||||
| # def upload_settings(): | ||||
| #     input_json = request.get_json(force=True) | ||||
| #     try: | ||||
| #         settings = input_json['settings'] | ||||
| #         session['nlp_id'] = classla.Pipeline(**settings) | ||||
| #     except: | ||||
| #         return jsonify({'status': 'ERROR', 'details': 'Incorrect settings!'}) | ||||
| # | ||||
| #     return jsonify({'status': 'OK'}) | ||||
| 
 | ||||
| @app.route('/custom-settings', methods=["POST"]) | ||||
| def custom_settings(): | ||||
|     input_json = request.get_json(force=True) | ||||
|     if 'settings' in input_json: | ||||
|         settings = input_json['settings'] | ||||
|         nlp = classla.Pipeline(**settings) | ||||
|         # classla.Pipeline('sl', processors='tokenize,pos,lemma', pos_use_lexicon=True) | ||||
|         result = nlp(input_json['text']).to_conll() | ||||
|         del(nlp) | ||||
|         gc.collect() | ||||
|     else: | ||||
|         return f'ERROR `settings` were not given!' | ||||
|     return result | ||||
| 
 | ||||
| 
 | ||||
| @app.route('/standard-ud', methods=["POST"]) | ||||
| def standard_ud(): | ||||
|     input_json = request.get_json(force=True) | ||||
|     doc = nlp_standard_UD(input_json['text']) | ||||
|     return doc.to_conll() | ||||
| 
 | ||||
| 
 | ||||
| @app.route('/standard-jos', methods=["POST"]) | ||||
| def standard_jos(): | ||||
|     input_json = request.get_json(force=True) | ||||
|     doc = nlp_standard_JOS(input_json['text']) | ||||
|     return doc.to_conll() | ||||
| 
 | ||||
| 
 | ||||
| @app.route('/nonstandard-ud', methods=["POST"]) | ||||
| def nonstandard_ud(): | ||||
|     input_json = request.get_json(force=True) | ||||
|     doc = nlp_nonstandard_UD(input_json['text']) | ||||
|     return doc.to_conll() | ||||
| 
 | ||||
| 
 | ||||
| @app.route('/nonstandard-jos', methods=["POST"]) | ||||
| def nonstandard_jos(): | ||||
|     input_json = request.get_json(force=True) | ||||
|     doc = nlp_nonstandard_JOS(input_json['text']) | ||||
|     return doc.to_conll() | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     app.run(host="0.0.0.0", debug=True) | ||||
							
								
								
									
										23
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| certifi==2021.10.8 | ||||
| charset-normalizer==2.0.8 | ||||
| classla==1.1.0 | ||||
| click==8.0.3 | ||||
| Flask==2.0.2 | ||||
| idna==3.3 | ||||
| importlib-metadata==4.8.2 | ||||
| itsdangerous==2.0.1 | ||||
| Jinja2==3.0.3 | ||||
| lxml==4.6.4 | ||||
| MarkupSafe==2.0.1 | ||||
| numpy==1.21.4 | ||||
| obeliks==1.1.3 | ||||
| protobuf==3.19.1 | ||||
| regex==2021.11.10 | ||||
| reldi-tokeniser==1.0.0 | ||||
| requests==2.26.0 | ||||
| torch==1.10.0 | ||||
| tqdm==4.62.3 | ||||
| typing_extensions==4.0.1 | ||||
| urllib3==1.26.7 | ||||
| Werkzeug==2.0.2 | ||||
| zipp==3.6.0 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user