{"id":44809133,"url":"https://github.com/fidelisrafael/esperanto-analyzer","last_synced_at":"2026-02-16T15:44:49.804Z","repository":{"id":52159715,"uuid":"146654449","full_name":"fidelisrafael/esperanto-analyzer","owner":"fidelisrafael","description":"Morphological and syntactic analysis of Esperanto sentences","archived":false,"fork":false,"pushed_at":"2021-05-06T19:15:21.000Z","size":214,"stargazers_count":33,"open_issues_count":1,"forks_count":1,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-08-20T19:08:04.073Z","etag":null,"topics":["analyzer","esperanto","grammar","grammar-checker","grammar-learning","grammar-parser","grammars","language","language-learning","languages","linguistic-analysis","linguistics","natural-language","natural-language-interface","natural-language-processing","natural-language-programming","python","tokenizer"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/esperanto-analyzer/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fidelisrafael.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-08-29T20:22:29.000Z","updated_at":"2025-07-03T10:15:10.000Z","dependencies_parsed_at":"2022-09-19T06:01:05.805Z","dependency_job_id":null,"html_url":"https://github.com/fidelisrafael/esperanto-analyzer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fidelisrafael/esperanto-analyzer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fidelisrafael%2Fesperanto-analyzer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fidelisrafael%2Fesperanto-analyzer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fidelisrafael%2Fesperanto-analyzer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fidelisrafael%2Fesperanto-analyzer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fidelisrafael","download_url":"https://codeload.github.com/fidelisrafael/esperanto-analyzer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fidelisrafael%2Fesperanto-analyzer/sbom","scorecard":{"id":399014,"data":{"date":"2025-08-11","repo":{"name":"github.com/fidelisrafael/esperanto-analyzer","commit":"af1e8609ec0696e3d1975aa0ba0c88e5f04f8468"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.1,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/14 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 2-Clause \"Simplified\" License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'master'","Info: 'force pushes' disabled on branch 'master'","Info: 'branch protection settings apply to administrators' is required to merge on branch 'master'","Warn: could not determine whether codeowners review is allowed","Warn: no status checks found to merge onto branch 'master'","Warn: PRs are not required to make changes on branch 'master'; or we don't have data to detect it.If you think it might be the latter, make sure to run Scorecard with a PAT or use Repo Rules (that are always public) instead of Branch Protection settings"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"13 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-29gw-9793-fvw7","Warn: Project is vulnerable to: PYSEC-2015-24 / GHSA-4vwq-x64q-j4cj","Warn: Project is vulnerable to: PYSEC-2017-46 / GHSA-66gw-5xpf-gfp5","Warn: Project is vulnerable to: PYSEC-2015-25 / GHSA-92mr-v722-f48m","Warn: Project is vulnerable to: PYSEC-2022-12 / GHSA-pq7m-3gw7-gq5x","Warn: Project is vulnerable to: PYSEC-2017-47","Warn: Project is vulnerable to: PYSEC-2023-62 / GHSA-m2qf-hxjv-5gpq","Warn: Project is vulnerable to: GHSA-43qf-4rqw-9q2g","Warn: Project is vulnerable to: GHSA-7rxf-gvfg-47g4","Warn: Project is vulnerable to: GHSA-84pr-m4jr-85g5","Warn: Project is vulnerable to: GHSA-8vgw-p6qm-5gr7","Warn: Project is vulnerable to: PYSEC-2024-71 / GHSA-hxwh-jpp2-84pm","Warn: Project is vulnerable to: PYSEC-2020-43 / GHSA-xc3p-ff3m-f46v"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 20 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T19:41:59.302Z","repository_id":52159715,"created_at":"2025-08-18T19:41:59.302Z","updated_at":"2025-08-18T19:41:59.302Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29511881,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-16T09:05:14.864Z","status":"ssl_error","status_checked_at":"2026-02-16T08:55:59.364Z","response_time":115,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analyzer","esperanto","grammar","grammar-checker","grammar-learning","grammar-parser","grammars","language","language-learning","languages","linguistic-analysis","linguistics","natural-language","natural-language-interface","natural-language-processing","natural-language-programming","python","tokenizer"],"created_at":"2026-02-16T15:44:49.074Z","updated_at":"2026-02-16T15:44:49.798Z","avatar_url":"https://github.com/fidelisrafael.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Esperanto Analyzer\n\n----\n\n![Esperanto Flag](https://upload.wikimedia.org/wikipedia/commons/thumb/f/f5/Flag_of_Esperanto.svg/640px-Flag_of_Esperanto.svg.png?1535986891157)\n\n## Build Status:\n\n### Development:\n\n[![Build Status](https://travis-ci.com/fidelisrafael/esperanto-analyzer.svg?token=k5uMpn3U564QqWar8oA1\u0026branch=development)](https://travis-ci.com/fidelisrafael/esperanto-analyzer)\n\n[![codecov](https://codecov.io/gh/fidelisrafael/esperanto-analyzer/branch/development/graph/badge.svg)](https://codecov.io/gh/fidelisrafael/esperanto-analyzer)\n\n### Master:\n\n[![Build Status](https://travis-ci.com/fidelisrafael/esperanto-analyzer.svg?token=k5uMpn3U564QqWar8oA1\u0026branch=master)](https://travis-ci.com/fidelisrafael/esperanto-analyzer)\n\n[![codecov](https://codecov.io/gh/fidelisrafael/esperanto-analyzer/branch/master/graph/badge.svg)](https://codecov.io/gh/fidelisrafael/esperanto-analyzer)\n\n---\n\n### Atendu! Kio estas Esperanto? (_Wait! What is Esperanto?_)\n\nThat is a fair question! Esperanto is the most widely spoken  constructed international auxiliary language\n(_conlang_) in the world. It was created back in **1887** by a polish-jewish guy named \"Ludwik Lejzer Zamenhof\"_(often refered as L.L Zamenhof)_.  Zamenhof's goal was to **create an easy and flexible language** that would serve as a universal second language to foster peace and international understanding of people from all around the world.\n\nThe phonology, grammar, vocabulary, and semantics are based on the **Indo-European**(_Italian_,_Spanish_,_French_, _Catalan_, _Russian_, _German_...) languages spoken in Europe. The sound inventory is essentially **Slavic**, as is much of the semantics, whereas the vocabulary derives primarily from the **Romance languages**, with a lesser contribution from **Germanic languages** and minor contributions from **Slavic languages** and **Greek**.\n\nThe language has more than **130 years of history** and culture now, and a very active community  as well.\n\nEsperanto is a SUPER  regular language, this means that the language does not have **irregular verbs** or **gender distinction for articles**, beside this Esperanto has only **16 grammar rules**.\nFor example, one of the rules:  ALL **Nouns** MUST end with the vowel `o`, eg:\n\n- `domo`\n- `homo`\n- `komputilo`\n- `komputilisto`\n\nOr  **Adjectives** MUST end with the letter `a`, eg:\n\n- `bela`\n- `granda`\n- `varma`\n- `malvarma`\n\nIf you want to know (or learn) more about Esperanto, you should read the following links:\n\n - [Esperanto at Wikipedia](https://www.wikiwand.com/en/Esperanto)\n - [Kio estas Esperanto? (in Esperanto)](https://lernu.net/eo/esperanto) or in [English](https://lernu.net/es/esperanto)\n- Esperanto course at Duolingo for: [[English speakers]](https://www.duolingo.com/course/eo/en/Learn-Esperanto-Online), [[Portuguese speakers]](https://www.duolingo.com/course/eo/pt/Learn-Esperanto-Online), [[Spanish speakers]](https://www.duolingo.com/course/eo/es/Learn-Esperanto-Online)\n - [Esperanto course at Lernu.net](http://lernu.net/kurso)\n - [Youtube serie: Esperanto estas...](https://www.youtube.com/watch?v=RlftmTm8I18\u0026list=PL83728C14BFC5822F)\n\n---\n\n## About this project\n\nThe aim of this project is to create one tool that can read and grammarly classify Esperanto sentences.\n\nThe first part of project consists in **Morphological Analyzes** of Esperanto words, the next step is to create a **Syntactical Analyzer** for the language as well.\n\n---\n\n## How to use it?\n\n### Demo\n\nYou can check it out the demo application built with React: [Online Demo](https://fidelisrafael.github.io/esperanto-analyzer-react/) or [Github Repository](https://github.com/fidelisrafael/esperanto-analyzer-react/)\n\n[![Frontend application](./docs/esperanto_analyzer_screenshot.png)](https://fidelisrafael.github.io/esperanto-analyzer-react/)\n\n\nOr you can try the demo API hosted on Heroku:\n\n[https://esperanto-analyzer-api.herokuapp.com/analyze?sentence=Esperanto%20estas%20tre%20facila%20lingvo%20al%20lerni](\nhttps://esperanto-analyzer-api.herokuapp.com/analyze?sentence=Esperanto%20estas%20tre%20facila%20lingvo%20al%20lerni)\n\n---\n\n## Installation\n\nFirst, install it:\n\n```bash\n$ pip install esperanto-analyzer\n```\n\n## CLI usage:\n\n[TODO] (Skip it for now)\n\nNow you will have the libraries source-code files in your system, and also the executable `binary` through CLI, test it:\n\n```bash\n$ eo-analyzer --version\n\u003e Version: 0.0.1\n```\n\n\n```sh\n$ eo-analyzer \"Jen la alfabeto de Esperanto. Ĉiu litero ĉiam sonas same kaj literumado estas perfekte regula. Klaku la ekzemplojn por aŭdi la elparolon!\"\n```\n\n![eo-analyzer response](https://i.imgur.com/4hWUcWY.png)\n\nPretty cool humn?\n\n## Python library usage\n\nOk, so now you want to import this library in your project, right? That's super simple, just drop these lines in your project:\n\n### Morphological analyzes of sentences\n\n```py\nfrom esperanto_analyzer import MorphologicalSentenceAnalyzer\n\n# Creates one instance to morphologically analyzes one sentence\nanalyzer = MorphologicalSentenceAnalyzer(\"Esperanto estas tre facila lingvo al lerni.\")\nanalyzer.analyze() # =\u003e Returns True/False\n\n# This is the simplest human-readable response of the morphological analyzes' results\nprint(analyzer.simple_results())\n# =\u003e [['Esperanto', 'Noun'], ['estas', 'Verb'], ['tre', 'Adverb'], ['facila', 'Adjective'], ['lingvo', 'Noun'], ['al', 'Preposition'], ['lerni', 'Verb']]\n\n```\n\nBut you can always deal with a more complex results set if you (or better, your software) want/need to:\n\n```py\n# The `#results()` method returns a Array object wirh a more complex structure than `#simple_results()` method\nresults = analyzer.analyzes_results()\nfirst_analyze = results[0]\n\n# Returns and Array object with `AnalyzeResult` objects\nprint(results)\n# =\u003e [\u003cesperanto_analyzer.analyzers.morphological.analyze_result.AnalyzeResult at 0x106888470\u003e, \u003cesperanto_analyzer.analyzers.morphological.analyze_result.AnalyzeResult at 0x106888710\u003e,(...)]\n\nprint(first_analyze)\n# =\u003e \u003cesperanto_analyzer.analyzers.morphological.analyze_result.AnalyzeResult object at 0x106888470\u003e\n\n# Rich and detailed results using `AnalyzeResult`\nprint(first_analyze.result)\n# =\u003e \u003cesperanto_analyzer.analyzers.morphological.noun.NounMorphologicalAnalyzer object at 0x106888898\u003e\n\n# Get any information that you might need using the response objects API\nprint((first_analyze.result.raw_word, first_analyze.result.matches, first_analyze.result.word_class() ))\n# =\u003e ('Esperanto', \u003cre.Match object; span=(0, 9), match='Esperanto'\u003e, \u003cclass 'esperanto_analyzer.speech.noun.Noun'\u003e)\n\n```\n---\n\n### Morphological analyze of a single WORD\n\nYou can also use the internal analyzers of **words** if you want so, ex:\n\n```py\nfrom esperanto_analyzer.analyzers.morphological import AdjectiveMorphologicalAnalyzer, NumeralMorphologicalAnalyzer\n\n# There's the total of `10` morphological analyzers, such as `VerbMorphologicalAnalyzer`, `NumeralMorphologicalAnalyzer`\nanalyzer = AdjectiveMorphologicalAnalyzer('belajn')\n# If it returns true, that means that the inputed word is a valid adjective. False otherwise\nanalyzer.analyze() # =\u003e returns True/False\n\nprint(analyzer.matches)\n# =\u003e \u003cre.Match object; span=(0, 6), match='belajn'\u003e\nprint(analyzer.raw_word) # =\u003e 'belajn'\n\n# The `word` property is one class object that inherits from the `Word` class.\nprint(analyzer.word)\n# =\u003e \u003cesperanto_analyzer.speech.adjective.Adjective at 0x1069079e8\u003e\n\n# Get the base class name for the detected 'Part of Speech' class\nprint(analyzer.word.__class__.__name__) # =\u003e 'Adjective'\n\nnumeral_analyzer = NumeralMorphologicalAnalyzer('naŭcent')\nnumeral_analyzer.analyze() # =\u003e True\n\nprint(numeral_analyzer.word)\n# =\u003e \u003cesperanto_analyzer.speech.numeral.Numeral at 0x106964cf8\u003e\n\nprint(numeral_analyzer.matches)\n# =\u003e \u003cre.Match object; span=(0, 7), match='naŭcent'\u003e\n\n```\n\n---\n\n### Parts of Speech:  Word, Article, Adverb, Adjective, Verb...\n\nYou can even use the **Parts of Speech**(such as `Article`, `Adverb`, `Pronoun`, `Conjunction`) of the language:\n\n```py\n# `esperanto_analyzer.speech` is home for all parts-of-speech classes\nfrom esperanto_analyzer.speech import Article\n\n# Raises an `InvalidArticleError` Exception, since 'lo' is not an Esperanto article\narticle = Article('lo')\n\n# 'La' is the ONLY valid article in Esperanto\nvalid_article = Article('la')\n\n\n# All `esperanto_analyzer.speech` objects inherits from `esperanto_analyzer.speech.word.Word` class\nprint(valid_article.__class__.__bases__) # =\u003e (esperanto_analyzer.speech.word.Word,)\n\n# La is invariable article, it's the same for plural and singular sentences, ex:\n# 'La domo' # The house\n# 'La domoj' # The houses\nprint(valid_article.plural) # =\u003e False\n\n# You can provide some `context` when creating the `Part of Speech` so it can determine if the word should be in plural or singular, eg:\nprint(Article('la', 'domoj').plural) # =\u003e True\n\n\n```\n\n---\n\n## Development Setup\n\nClone this repository:\n\n```bash\n$ git clone https://github.com/fidelisrafael/esperanto-analyzer.git\n$ cd esperanto-analyzer\n```\n\nMake sure you have `python` \u003e= `3.7.0` and  `virtualenv` \u003e= `16.0.0` installed:\n\n```bash\n$ python --version\n\u003e Python 3.7.0\n$ virtualenv --version\n\u003e 16.0.0\n```\n\nOtherwise, [install it](https://virtualenv.pypa.io/en/stable/installation/).\n\nThen, create one new `virtualenv` and activate it:\n\n```bash\n$ virtualenv venv\n$ source venv/bin/activate\n```\n\nInstall the dependencies for development and test enviroments:\n\n```bash\n# If you just want to install the needed dependencies for production, just run: `make init`\n$ make init_dev\n\u003e pip install -r development_requirements.txt\n\u003e pip install -r test_requirements.txt\n\u003e pip install -r requirements.txt\n```\n\nRun the tests:\n\n```bash\n$ make test\n\u003e pytest tests --cov-config .coveragerc --cov=esperanto_analyzer --cov-report=html\n\u003e =============================================================================== test session starts ================================================================================\n\u003e platform darwin -- Python 3.7.0, pytest-3.7.4, py-1.6.0, pluggy-0.7.1\n\u003e rootdir: /(...)/esperanto_analyzer, inifile:\n\u003e plugins: cov-2.5.1\n\u003e collected 492 items\n\n\u003e (...)\n\n\u003e ====================================================================== 492 passed, 2 warnings in 2.61 seconds ======================================================================\n```\n\nYou can follow the code coverage stats opening: `coverage/index.html`\n\n### OBS: This library has **100%** code coverage at the time of this writing!\n\n---\n\n### Built-in JSON Web API\n\n**_Note: This web API will be published as a separated package in a near future._**\n\nThis library cames with a very simple HTTP Server built on top of Flask to provide an WEB API interface for integration with others systems. You can run the HTTP server running the following make task in the root folder of the project:\n\n```bash\n$ make web_api # or simply running: python web/runserver.py\n\u003e python esperanto_analyzer/web/runserver.py\n\u003e * Serving Flask app \"esperanto_analyzer.web.api.server\" (lazy loading)\n\u003e * Environment: production\n\u003e   WARNING: Do not use the development server in a production environment.\n\u003e   Use a production WSGI server instead.\n\u003e * Debug mode: on\n\u003e * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)\n```\n\nOr you can just run it from inside any python project with:\n\n```py\nfrom esperanto_analyzer.web import run_app\n\nrun_app(debug=True, port=9090)\n# * Serving Flask app \"esperanto_analyzer.web.api.server\" (lazy loading)\n# * Environment: production\n#   WARNING: Do not use the development server in a production environment.\n#   Use a production WSGI server instead.\n# * Debug mode: off\n# * Running on http://127.0.0.1:9090/ (Press CTRL+C to quit)\n\n```\n\nThis server has auto-reload(or hot-reload) enabled by default, so you don't need to restart the server when you change the source code.\n\nTo test it:\n\n```bash\ncurl http://127.0.0.1:5000/analyze?sentence=Kio%20estas%20Esperanto%3F%20%C4%9Ci%20estas%20lingvo%20tre%20ta%C5%ADga%20por%20internacia%20komunikado.\n```\n\n### HTTP API Deploy\n\nIf you need an API(like [this one](https://esperanto-analyzer-api.herokuapp.com/analyze?sentence=Esperanto%20estas%20tre%20facila%20lingvo%20al%20lerni)) you can just easily deploy this project to `Heroku` since it comes with a `Procfile` file, this will take no more than 4 commands:\n\nOBS: You will need [Heroku's CLI](https://devcenter.heroku.com/articles/heroku-cli) for this.\n\n```bash\n$ git clone https://github.com/fidelisrafael/esperanto-analyzer.git\n$ cd esperanto-analyzer\n$ heroku create my-esperanto-analyzer\n\u003e Creating ⬢ my-analyzer-test... done\n$ git push heroku master:master\n# Open https://my-esperanto-analyzer.herokuapp.com/analyze?sentence=Kiel%20%vi%fartas\n$ heroku open '/analyze?sentence=Kiel%20vi%20fartas?'\n```\n\n---\n\n## How it works?\n\nThis library can be used in a miriad of ways to analyze Esperanto sentences and words, for a complete reference of the API and all the possibilities you should check the 'Full API' section.\n\n[TODO]\n\n---\n\n\n## :calendar: Roadmap \u003ca name=\"roadmap\"\u003e\u003c/a\u003e\n\n- :white_medium_small_square: Create syntactical analyzers\n- :white_medium_small_square: Update this Roadmap with more plans\n- :white_check_mark: Front-end application. (Done, [check it out](https://fidelisrafael.github.io/esperanto-analyzer-react/))\n\n\n---\n\n## :thumbsup: Contributing\n\nBug reports and pull requests are welcome on GitHub at http://github.com/fidelisrafael/esperanto-analyzer. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.\n\n---\n\n## :memo: License\n\nThe library is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffidelisrafael%2Fesperanto-analyzer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffidelisrafael%2Fesperanto-analyzer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffidelisrafael%2Fesperanto-analyzer/lists"}