{"id":39643994,"url":"https://github.com/mbanon/fastspell","last_synced_at":"2026-01-18T09:03:11.171Z","repository":{"id":42470647,"uuid":"383755863","full_name":"mbanon/fastspell","owner":"mbanon","description":"Targetted language identifier, based on FastText and Hunspell.","archived":false,"fork":false,"pushed_at":"2025-09-04T17:02:06.000Z","size":325,"stargazers_count":37,"open_issues_count":5,"forks_count":6,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-11-19T12:27:54.792Z","etag":null,"topics":["fasttext","hunspell","language-identification","nlp"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mbanon.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-07-07T10:13:33.000Z","updated_at":"2025-09-04T17:02:02.000Z","dependencies_parsed_at":"2023-02-13T23:30:22.463Z","dependency_job_id":"2cb95f0f-4934-458b-9be2-9489d89e2830","html_url":"https://github.com/mbanon/fastspell","commit_stats":{"total_commits":180,"total_committers":7,"mean_commits":"25.714285714285715","dds":0.4833333333333333,"last_synced_commit":"43d9f0e4fe8e8fc55f8c2383d1a88375e17fe5dc"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/mbanon/fastspell","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mbanon%2Ffastspell","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mbanon%2Ffastspell/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mbanon%2Ffastspell/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mbanon%2Ffastspell/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mbanon","download_url":"https://codeload.github.com/mbanon/fastspell/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mbanon%2Ffastspell/sbom","scorecard":{"id":630738,"data":{"date":"2025-08-11","repo":{"name":"github.com/mbanon/fastspell","commit":"f9ce990f38aa086d9b1e24ed7c92aec8d6b6317d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"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":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/release.yaml:1","Info: no jobLevel write permissions found"],"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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/mbanon/fastspell/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/mbanon/fastspell/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/mbanon/fastspell/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/mbanon/fastspell/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/mbanon/fastspell/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/mbanon/fastspell/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/mbanon/fastspell/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:72: update your workflow using https://app.stepsecurity.io/secureworkflow/mbanon/fastspell/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:82: update your workflow using https://app.stepsecurity.io/secureworkflow/mbanon/fastspell/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:87: update your workflow using https://app.stepsecurity.io/secureworkflow/mbanon/fastspell/release.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yaml:92: update your workflow using https://app.stepsecurity.io/secureworkflow/mbanon/fastspell/release.yaml/main?enable=pin","Warn: pipCommand not pinned by hash: conda_build/fastspell/build.sh:14","Warn: pipCommand not pinned by hash: .github/workflows/release.yaml:26","Info:   0 out of  10 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned"],"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":"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":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"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: GNU General Public License v3.0: 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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"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":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release.yaml:77"],"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"}}]},"last_synced_at":"2025-08-21T07:50:59.284Z","repository_id":42470647,"created_at":"2025-08-21T07:50:59.284Z","updated_at":"2025-08-21T07:50:59.284Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28534154,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["fasttext","hunspell","language-identification","nlp"],"created_at":"2026-01-18T09:03:11.006Z","updated_at":"2026-01-18T09:03:11.097Z","avatar_url":"https://github.com/mbanon.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FastSpell\n![PyPI - Python Version](https://img.shields.io/pypi/pyversions/fastspell)\n![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/mbanon/fastspell/release.yaml)\n\nTargetted language identifier, based on FastText and Hunspell.\n\n## How it works \n\nFastSpell will try to determine the language of a sentence by using **[FastText](https://fasttext.cc/)**.\n\nIf the language detected is very similar to the target language (i.e. FastText detected Spanish, while the targetted language is Galician), extra checks are performed with **[Hunspell](http://hunspell.github.io/)** to determine the language more precisely.\n\n## Citation\n\nIf you find **FastSpell** useful, please consider citing the following paper:\n\n\u003e Marta Bañón, Gema Ramírez-Sánchez, Jaume Zaragoza-Bernabeu, and Sergio Ortiz Rojas, \\\n\u003e \"[FastSpell: The LangId Magic Spell](https://aclanthology.org/2024.lrec-main.626/)\", \\\n\u003e in **Proceedings of the 2024 Joint International Conference on Computational Linguistics, Language Resources and Evaluation (LREC-COLING 2024)**,\\\n\u003e pages 7133–7140, Torino, Italia. ELRA and ICCL.\n\n```\n@inproceedings{banon-etal-2024-fastspell-langid,\n    title = \"{F}ast{S}pell: The {L}ang{I}d Magic Spell\",\n    author = \"Ba{\\~n}{\\'o}n, Marta  and\n      Ram{\\'\\i}rez-S{\\'a}nchez, Gema  and\n      Zaragoza-Bernabeu, Jaume  and\n      Ortiz Rojas, Sergio\",\n    editor = \"Calzolari, Nicoletta  and\n      Kan, Min-Yen  and\n      Hoste, Veronique  and\n      Lenci, Alessandro  and\n      Sakti, Sakriani  and\n      Xue, Nianwen\",\n    booktitle = \"Proceedings of the 2024 Joint International Conference on Computational Linguistics, Language Resources and Evaluation (LREC-COLING 2024)\",\n    month = may,\n    year = \"2024\",\n    address = \"Torino, Italia\",\n    publisher = \"ELRA and ICCL\",\n    url = \"https://aclanthology.org/2024.lrec-main.626\",\n    pages = \"7133--7140\",\n    abstract = \"Language identification is a crucial component in the automated production of language resources, particularly in multilingual and big data contexts. However, commonly used language identifiers struggle to differentiate between similar or closely-related languages. This paper introduces FastSpell, a language identifier that combines fastText (a pre-trained language identifier tool) and Hunspell (a spell checker) with the aim of having a refined second-opinion before deciding which language should be assigned to a text. We provide a description of the FastSpell algorithm along with an explanation on how to use and configure it. To that end, we motivate the need of such a tool and present a benchmark including some popular language identifiers evaluated during the development of FastSpell. We show how FastSpell is useful not only to improve identification of similar languages, but also to identify new ones ignored by other tools.\",\n}\n```\n\n## Requirements \u0026 Installation\n\n**FastSpell** can be installed from PyPI\n```\npip install fastspell\n```\nor directly from source:\n```\npip install .\n```\nNote that it requires Python3.8 or higher, and the `python3-dev` package:\n\n```\nsudo apt-get install python3-dev\n```\n\nIn order to ensure you get the latest version of FastSpell, you can run:\n\n```\npip install fastspell==0.13 git+https://github.com/MSeal/cython_hunspell@2.0.3  \n```\n\n**IMPORTANT**:\nIn some cases (for example, when using Python 3.10), the `cyhunspell` version 2.0.2 installation will fail. If that's the case, you need to install `cyhunspell==2.0.3` before installing `fastspell`:\n\nFirst make sure build dependencies are installed\n```\nsudo apt install build-essential autoconf autopoint libtool\n```\nthen install the pip package\n```\npip install git+https://github.com/MSeal/cython_hunspell@2.0.3\n```\n\n### Model download\n\nTo trigger the FastText model download before running fastspell, run:\n```\nfastspell-download\n```\nSince version 0.7 all the dictionaries are installed automatically with pip and there is no need to do anything else.\nFor further explanation about how configuration works, [see below](#configuration).\n\n### Conda\nAlso, you can install the conda package:\n```\nconda install -c conda-forge -c bitextor fastspell\n```\n\n### Automatic testing\nSome automatic tests are provided to check that the installation went fine. In order to check it, go to the `/tests` directory and run:\n```\npython3 -m unittest discover\n```\nYou might need to istall the `unittest` package with `pip`, in  case you don't have it installed beforehand.\n\n## Configuration\n\nA few configuration files are provided under the `fastspell/config` directory.\nIf you need to change default configuration, you can provide the path to your config directory with `-c`/`--config` or with the environment variable `FASTSPELL_CONFIG`.\n\n#### similar.yaml\n\nIn this dictionary-like file, similar languages are stored. These are the languages that are going to be \"double-checked\" with Hunspell after being identified with FastText. For example, see the line `gl: [es, pt, gl] `. This means that, when the targetted language is Galician, and FastText identifies a given sentence as Spanish, Portuguese or Galician, extra checks will be performed with Hunspell to confirm which of the three similar languages is more suitable for the sentence.\n\nPlease note that you need Hunspell dictionaries for all the languages in this file (if you use the `fastspell-download` command, there is nothing else to do). This file can be modified to remove a language you are not interested in, or a language for which you don't have Hunspell dictionaries, or to add new similar or target languages.\n\n#### hunspell.yaml\n\nIn this file, the names of the dictionaries are stored. All similar languages must be in this list in order to properly work.\n\nFor example, the first entry in the `hunspell_codes` is ` ca: ca_ES`, and the dictionary path is `~/.local/share/fastspell/`. That means that the Hunspell files for Catalan are  `~/.local/share/fastspell/ca_ES.dic` and `~/.local/share/fastspell/ca_ES.aff`.\n\nBy default `dicpath` is empty, which means FastSpell will look in these directories for the dictionaries:\n```python\nfastspell_dictionaries.__path__[0]\n```\n```\n~/.local/share/fastspell\n~/.local/share/hunspell\n$VIRTUAL_ENV/share/hunspell\n/usr/share/hunspell\n```\nTo use a custom path, put it in `dicpath` and will be the first one to search.\n\n\n## Usage\n\n### Module:\nIn order to use **FastSpell** as a Python module, just install and import it :\n```\nfrom fastspell import FastSpell\n```\nBuild a FastSpell object, like:\n```\nfsobj = FastSpell.FastSpell(\"en\", mode=\"cons\")\n```\n(learn more about modes in the section below)\n\nAnd then use the `getlang` function with the sentences you want to identify, for example:\n```\nfsobj.getlang(\"Hello, world\")\n#'en'\nfsobj.getlang(\"Hola, mundo\")\n#'es'\n\n```\n\n### CLI:\n```\niusage: fastspell [-h] [--aggr] [--cons] [--hbs] [-q] [--debug]\n                 [--logfile LOGFILE] [-v]\n                 lang [input] [output]\n\npositional arguments:\n  lang\n  input              Input sentences. (default: \u003c_io.TextIOWrapper\n                     name='\u003cstdin\u003e' encoding='UTF-8'\u003e)\n  output             Output of the language identification. (default:\n                     \u003c_io.TextIOWrapper name='\u003cstdout\u003e' mode='w'\n                     encoding='UTF-8'\u003e)\n\noptional arguments:\n  -h, --help         show this help message and exit\n  --aggr             Aggressive strategy (more positives) (default: False)\n  --cons             Conservative strategy (less positives) (default: False)\n  --hbs              Return all Serbo-Croatian variants as 'hbs' (default:\n                     False)\n\nLogging:\n  -q, --quiet        Silent logging mode (default: False)\n  --debug            Debug logging mode (default: False)\n  --logfile LOGFILE  Store log to a file (default: \u003c_io.TextIOWrapper\n                     name='\u003cstderr\u003e' mode='w' encoding='UTF-8'\u003e)\n  -v, --version      show version of this script and exit\n```\n\n\n## Aggressive vs Conservative\n\nFastSpell comes in two flavours: Aggressive and Conservative.\n\nThe **Aggressive** mode is less hesitant to tag a sentence with the target language, and never has doubts. The **Conservative** version, on the other hand, is more reluctant to tag a sentence with the target language and will use the `unk`(unknown) tag in case of doubt (when there is a tie between the target language and other language, for example)\n\n## Benchmark \n\nBenchmark data: https://github.com/mbanon/benchmarks\n\nResults:  https://docs.google.com/spreadsheets/d/158ZRWMgRH5TptlFWpKyh5uRL5jTkKW1d4KGJg1AZf7A/edit?usp=sharing \n\n\n## Usage example\n\nInput text:\n```\n19-01-2011 47 comentarios 7o Xornadas de Xardinería de Galicia (RE)PLANTEAR\n• Proceso de valoración de idoneidade: entrevistas psicosociais e visita domiciliaria e aplicación de test psicolóxicos, se é o caso.\n- Chrome e Firefox en MacOS non son compatibles (unicamente Safari é compatible con MacOS), pero invocarase PSAL ao intentar empregar Chrome ou Firefox.\nMago da luz / Maga da luz\nCelebrada a homenaxe a Xosé Manuel Seivane Rivas\nA instalación eléctrica en teletraballo\nSaltar á navegación Navegación INICIO\nJulio Freire, competidor da FGA, invitado polo Kennel club de Inglaterra, para participar nos Crufts 2014 (Birmingham, 6 - 9 de marzo).\n25 de xullo - Truong Tan Sang toma posesión como presidente de Vietnam\nQuen pode solicitar o dito financiamento?\n```\nCommand:\n```\nfastspell  --aggr lang inputtext\nfastspell  --cons lang inputtext\n```\nAggressive output:\n```\n19-01-2011 47 comentarios 7o Xornadas de Xardinería de Galicia (RE)PLANTEAR     gl\n• Proceso de valoración de idoneidade: entrevistas psicosociais e visita domiciliaria e aplicación de test psicolóxicos, se é o caso.   gl\n- Chrome e Firefox en MacOS non son compatibles (unicamente Safari é compatible con MacOS), pero invocarase PSAL ao intentar empregar Chrome ou Firefox.        gl\nMago da luz / Maga da luz       gl\nCelebrada a homenaxe a Xosé Manuel Seivane Rivas        gl\nA instalación eléctrica en teletraballo gl\nSaltar á navegación Navegación INICIO   gl\nJulio Freire, competidor da FGA, invitado polo Kennel club de Inglaterra, para participar nos Crufts 2014 (Birmingham, 6 - 9 de marzo). es\n25 de xullo - Truong Tan Sang toma posesión como presidente de Vietnam  gl\nQuen pode solicitar o dito financiamento?       gl\n```\n\nConservative output:\n```\n19-01-2011 47 comentarios 7o Xornadas de Xardinería de Galicia (RE)PLANTEAR     unk\n• Proceso de valoración de idoneidade: entrevistas psicosociais e visita domiciliaria e aplicación de test psicolóxicos, se é o caso.   gl\n- Chrome e Firefox en MacOS non son compatibles (unicamente Safari é compatible con MacOS), pero invocarase PSAL ao intentar empregar Chrome ou Firefox.        gl\nMago da luz / Maga da luz       unk\nCelebrada a homenaxe a Xosé Manuel Seivane Rivas        gl\nA instalación eléctrica en teletraballo unk\nSaltar á navegación Navegación INICIO   gl\nJulio Freire, competidor da FGA, invitado polo Kennel club de Inglaterra, para participar nos Crufts 2014 (Birmingham, 6 - 9 de marzo). es\n25 de xullo - Truong Tan Sang toma posesión como presidente de Vietnam  gl\nQuen pode solicitar o dito financiamento?       gl\n```\nGetting stats:\n```\ncat inputtext | fastspell --aggr $L | cut -f2 | sort | uniq -c | sort -nr\ncat inputtext | fastspell --cons $L | cut -f2 | sort | uniq -c | sort -nr\n```\nAggressive:\n```\n9 gl\n1 es\n```\nConservative:\n```\n6 gl\n3 unk\n1 es\n```\n\n\n---\n\n![Connecting Europe Facility](https://www.paracrawl.eu/images/logo_en_cef273x39.png)\n\nAll documents and software contained in this repository reflect only the authors' view. The Innovation and Networks Executive Agency of the European Union is not responsible for any use that may be made of the information it contains.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmbanon%2Ffastspell","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmbanon%2Ffastspell","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmbanon%2Ffastspell/lists"}