{"id":37078869,"url":"https://github.com/rsgoncalves/text2term","last_synced_at":"2026-01-14T09:32:57.489Z","repository":{"id":247444037,"uuid":"823369232","full_name":"rsgoncalves/text2term","owner":"rsgoncalves","description":"a tool for mapping free-text descriptions of entities to ontology terms","archived":false,"fork":false,"pushed_at":"2025-06-17T21:53:48.000Z","size":435,"stargazers_count":15,"open_issues_count":0,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-31T13:08:23.439Z","etag":null,"topics":["data-annotation","fair","fair-data","metadata","metadata-curation","ontology","ontology-mapping","text-mining"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/text2term","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"ccb-hms/ontology-mapper","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rsgoncalves.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":".github/code_of_conduct.md","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}},"created_at":"2024-07-02T22:58:35.000Z","updated_at":"2025-07-15T08:26:44.000Z","dependencies_parsed_at":null,"dependency_job_id":"3961c805-3ca5-483e-b168-ab19ec49784f","html_url":"https://github.com/rsgoncalves/text2term","commit_stats":null,"previous_names":["rsgoncalves/text2term"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/rsgoncalves/text2term","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsgoncalves%2Ftext2term","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsgoncalves%2Ftext2term/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsgoncalves%2Ftext2term/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsgoncalves%2Ftext2term/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rsgoncalves","download_url":"https://codeload.github.com/rsgoncalves/text2term/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsgoncalves%2Ftext2term/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28416096,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T08:38:59.149Z","status":"ssl_error","status_checked_at":"2026-01-14T08:38:43.588Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["data-annotation","fair","fair-data","metadata","metadata-curation","ontology","ontology-mapping","text-mining"],"created_at":"2026-01-14T09:32:56.914Z","updated_at":"2026-01-14T09:32:57.476Z","avatar_url":"https://github.com/rsgoncalves.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n   \u003ch1\u003etext2term\u003c/h1\u003e\n   \u003ch4\u003eA tool for mapping free-text descriptions of (biomedical) entities to ontology terms\u003c/h4\u003e\n\n   \u003ca href=\"https://pypi.org/project/text2term\" target=\"_blank\"\u003e\n      \u003cimg alt=\"Latest release version\" src=\"https://img.shields.io/pypi/v/text2term\" /\u003e\n   \u003c/a\u003e\n   \u003ca href=\"https://pypi.org/project/text2term\" target=\"_blank\"\u003e\n      \u003cimg alt=\"Latest release date\" src=\"https://img.shields.io/github/release-date/rsgoncalves/text2term?\u0026color=%2393c8eb\" /\u003e\n   \u003c/a\u003e\n   \u003ca href=\"https://github.com/rsgoncalves/text2term/actions/workflows/github_test.yml\" target=\"_blank\"\u003e\n      \u003cimg alt=\"Tests\" src=\"https://github.com/rsgoncalves/text2term/actions/workflows/github_test.yml/badge.svg\" /\u003e\n   \u003c/a\u003e\n   \u003ca href=\"https://codecov.io/gh/rsgoncalves/text2term\" target=\"_blank\"\u003e \n      \u003cimg alt=\"Test coverage\" src=\"https://codecov.io/gh/rsgoncalves/text2term/graph/badge.svg?token=7O155IVIYC\"/\u003e \n   \u003c/a\u003e\n   \u003ca href=\"https://doi.org/10.1093/database/baae119\" target=\"_blank\"\u003e\n      \u003cimg alt=\"Citation\" src=\"https://img.shields.io/badge/DOI-10.1093/database/baae119-white\" /\u003e\n   \u003c/a\u003e\n   \u003ca href=\"https://shields.io/badges/py-pi-downloads\" target=\"_blank\"\u003e\n      \u003cimg alt=\"PyPI Installs\" src=\"https://img.shields.io/pypi/dm/text2term?label=pypi%20installs\u0026color=D3CB40\"\u003e\n   \u003c/a\u003e\n   \u003ca href=\"https://shields.io/badges/pepy-total-downloads\" target=\"_blank\"\u003e\n      \u003cimg alt=\"Total Downloads\" src=\"https://img.shields.io/pepy/dt/text2term?label=downloads\u0026color=D10000\"\u003e\n   \u003c/a\u003e\n   \u003ca href=\"https://github.com/rsgoncalves/text2term/blob/main/LICENSE\" target=\"_blank\"\u003e\n        \u003cimg alt=\"License\" src=\"https://img.shields.io/pypi/l/text2term\" /\u003e\n   \u003c/a\u003e\n   \u003ca href=\"https://github.com/rsgoncalves/text2term/blob/main/.github/code_of_conduct.md\" target=\"_blank\"\u003e\n      \u003cimg alt=\"Contributor Covenant\" src=\"https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg\"\u003e\n   \u003c/a\u003e\n\u003c/div\u003e\n\n## 🛠️ Installation\nInstall the package from [PyPI](https://pypi.org/project/text2term/) using the **pip** package installer:\n\n```shell\npip install text2term\n```\n\n## 💡 Usage Examples\n\n### 🎯 Examples of Programmatic Mapping\ntext2term supports mapping strings specified in multiple input formats. In the first example, we map strings in a list to an ontology specified by its URL:\n\n```python\nimport text2term \ndf = text2term.map_terms(source_terms=[\"asthma\", \"acute bronchitis\"], \n                         target_ontology=\"http://purl.obolibrary.org/obo/mondo.owl\")\n```\n\nThere is also support for file-based input, for example a file containing a list of strings:\n```python\ndf = text2term.map_terms(source_terms=\"test/test_input.txt\", \n                         target_ontology=\"http://purl.obolibrary.org/obo/mondo.owl\")\n```\n\nor a table where we can specify the column of terms to map and the table value separator:\n```python\ndf = text2term.map_terms(source_terms=\"test/some_table.tsv\", \n                         csv_columns=('diseases','optional_ids'), separator=\"\\t\",\n                         target_ontology=\"http://purl.obolibrary.org/obo/mondo.owl\")\n```\n\nFinally it is possible map strings in a dictionary with associated tags that are preserved in the output:\n```python\ndf = text2term.map_terms(source_terms={\"asthma\":\"disease\", \n                                       \"acute bronchitis\":[\"disease\", \"lung\"]}, \n                         target_ontology=\"http://purl.obolibrary.org/obo/mondo.owl\")\n```\n\n\n### 💾 Examples of Programmatic Caching\ntext2term supports caching an ontology for repeated use. Here we cache an ontology and give it a name:\n```python\nmondo = text2term.cache_ontology(ontology_url=\"http://purl.obolibrary.org/obo/mondo.owl\", \n                                 ontology_acronym=\"MONDO\",\n                                 cache_folder=\".cache\")  # specify custom cache location\n```\n\nThe name given in `ontology_acronym` acts as a reference. Now we can map strings to the cached ontology by specifying as `target_ontology` the name specified above (\"MONDO\") and the flag `use_cache=True`\n\n```python\ndf = text2term.map_terms(source_terms=[\"asthma\", \"acute bronchitis\"], \n                         target_ontology=\"MONDO\", \n                         use_cache=True,\n                         cache_folder=\".cache\")  # specify custom cache location\n```\n\nMore succinctly, we can use the returned `OntologyCache` object `mondo` as such:\n```python\ndf = mondo.map_terms(source_terms=[\"asthma\", \"acute bronchitis\"])\n```\n\n\n### 🖥️ Examples of Command Line Usage\nTo use text2term from the command line, the current working directory must be the one containing the text2term package. This can be achieved as follows:\n\nIdentify where pip installed the text2term package by running:\n\n```shell\npip show text2term\n```\n\nThe output should contain a field called `Location` with a system path. Copy the path and then navigate to it, e.g.:\n\n```shell\ncd /opt/homebrew/lib/python3.9/site-packages\n```\n\n\u003e [!NOTE]\n\u003e When cloned from GitHub and then installed using `pip install path/to/text2term`—where `path/to/text2term` is the cloned folder containing `setup.py`—text2term can be called from that folder\n\nThen you can run text2term commands from the terminal. For example, to show a help message describing all arguments, type into a terminal:\n```shell\npython text2term --help\n```\n\nThe basic use of text2term requires a `source` file containing the terms to map to a given `target` ontology:  \n```shell\npython text2term -s test/test_input.txt -t http://purl.obolibrary.org/obo/mondo.owl\n```\n\n---\nMap to a local ontology and specify an output file where the mappings should be saved using `-o`:  \n```shell\npython text2term -s test/test_input.txt -t test/mondo.owl -o test/mymappings.csv\n```\n\n---\nSet the minimum acceptable similarity score for mapping each given term to an ontology term using `-min`:  \n```shell\npython text2term -s test/test_input.txt -t test/mondo.owl -min 0.8\n```\nThe mapped terms returned will have been determined to be 0.8 similar to their source terms in a 0-1 scale.  \n\n---\nExclude deprecated ontology terms (declared as such via *owl:deprecated true*) using `-d`:  \n```shell\npython text2term -s test/test_input.txt -t test/mondo.owl -d\n```\n\n---\nLimit search to only terms whose IRIs start with any IRI given in a list specified using `-iris`:  \n```shell\npython text2term.py -s test/test_input.txt -t test/mondo.owl -iris http://purl.obolibrary.org/obo/mondo,http://identifiers.org/hgnc\n```\nWhile MONDO uses terms from other ontologies such as CHEBI and Uberon, the tool only considers terms whose IRIs start either with \"http://purl.obolibrary.org/obo/mondo\" or \"http://identifiers.org/hgnc\".\n\n---\nCache an ontology for repeated use by running the tool while instructing it to cache the ontology via `-c \u003cname\u003e`:\n```shell\npython text2term -s test/test_input.txt -t http://purl.obolibrary.org/obo/mondo.owl -c MONDO\n```\n\nNow the ontology is cached and we can refer to it as the target ontology using the name given beforehand: \n```shell\npython text2term -s test/test_input.txt -t MONDO\n```\n\n\n## 📦 Programmatic Usage\nAfter installing and importing to a Python environment, the tool's main function is `map_terms()`:\n\n```python\ntext2term.map_terms(source_terms,               # strings to map or pointer to file \n                    target_ontology='mondo',    # ontology to map to (URL or name)\n                    max_mappings=3,             # maximum mappings per string\n                    mapper=Mapper.TFIDF,        # mapping method to be used\n                    min_score=0.3,              # minimum mapping score  \n                    base_iris=(),               # map to terms with given base IRIs \n                    excl_deprecated=False,      # exclude ontology deprecated terms\n                    term_type='class',          # ontology term type(s) to map to\n                    save_graphs=False,          # save vis.js file with term graphs\n                    save_mappings=False,        # save mappings to file\n                    output_file='',             # filepath of output mappings file\n                    csv_columns=(),             # table columns with strings and IDs\n                    separator=',',              # column separator of input table \n                    use_cache=False,            # use a locally cached ontology\n                    incl_unmapped=False,        # include unmapped strings in output\n                    bioportal_apikey='',        # API key to use the BioPortal mapper\n                    excl_metadata=False)        # exclude metadata from the output file\n```\nThis function returns a pandas `DataFrame` containing the generated ontology mappings.\n\n### ⚙️ Argument Details\n\n`source_terms`\u0026mdash;Strings to be mapped to an ontology, which can be specified as a:\n1. list of strings\n2. string containing a file path\n3. dictionary of terms and associated tags, where each key is a term and the value is a list of tags\n4. list of `TaggedTerm` objects\n   - Tags do not affect the mapping, they are simply added to the output dataframe \n   - If a term is tagged with \"Ignore\", text2term will not map it\n   - Unmapped terms can still be included in the output if `incl_unmapped` is True\n\n`target_ontology`\u0026mdash;Path, URL or name of 'target' ontology to map the source terms to. Ontology names can be given as values to `target_ontology` e.g. \"EFO\" or \"CL\"\u0026mdash;text2term uses [Bioregistry](https://bioregistry.io) to get URLs for such names. Similarly, when the target ontology has been cached, enter the name used upon caching.\n\nWhen using the BioPortal or Zooma interfaces, the value for `target_ontology` should be a comma-separated list of ontology acronyms (eg 'EFO,HPO') or **'all'** to search all ontologies.\n\n`base_iris`\u0026mdash;Map only to ontology terms whose IRIs start with one of the strings given in this tuple\n\n`excl_deprecated`\u0026mdash;Exclude ontology terms stated as deprecated via `owl:deprecated true`\n\n`source_terms_ids`\u0026mdash;Collection of identifiers for the given source terms\n\n`csv_column`\u0026mdash;Specify the name of the column containing the terms to map, when the input file is a table. Optionally provide a second column name, containing the respective term identifiers\n\n`separator`\u0026mdash;Character that separates columns when input is a table (eg '\\t' for TSV) \n\n`mapper`\u0026mdash;Method used to compare source terms with ontology terms. One of `levenshtein, jaro, jarowinkler, jaccard, fuzzy, tfidf, zooma, bioportal` (see [Supported Mappers](#supported-mappers))\n\n`max_mappings`\u0026mdash;Maximum number of top-ranked mappings returned per source term\n\n`min_score`\u0026mdash;Minimum similarity score [0,1] for the mappings (1=exact match)\n\n`save_mappings`\u0026mdash;Save the generated mappings to a file (specified by `output_file`) \n\n`output_file`\u0026mdash;Path to desired output file for the mappings dataframe\n\n`save_graphs`\u0026mdash;Save vis.js graphs representing the neighborhood of each ontology term\n\n`use_cache`\u0026mdash;Use the cache for the ontology\n\n`term_type`\u0026mdash;Specifies whether to map to ontology classes, properties or both. One of `class, property, any`\n\n`incl_unmapped`\u0026mdash;Include unmapped terms in the output. If a term has been tagged 'Ignore' or has less than the `min_score`, it is included in the output data frame\n\n`bioportal_apikey`\u0026mdash;BioPortal API Key to use along with the BioPortal mapper option\n\n`excl_metadata`\u0026mdash;Exclude the metadata header from the output file\n\n\n### 💾 Ontology Caching\ntext2term supports caching ontologies for faster or repeated mapping to the same ontology. An ontology can be cached using the function:\n\n```python\ntext2term.cache_ontology(ontology_url=\"https://purl.obolibrary.org/obo/mondo.owl\", \n                         ontology_acronym=\"MONDO\", \n                         base_iris=(), \n                         cache_folder=\".cache\")\n```\nThis caches a single ontology from a URL or file path, and takes an optional acronym that will be used to reference the cached ontology later. If no acronym is given, the URL is used as the name. The `cache_folder` parameter allows specifying a custom location for the cache (defaults to \".cache\").\n\nIt is also possible to cache multiple ontologies, whose names and URLs are specified in a table formatted as such `acronym,version,url`. An example is provided in [resources/ontologies.csv](https://github.com/rsgoncalves/text2term/blob/main/text2term/resources/ontologies.csv):\n```python\ntext2term.cache_ontology_set(ontology_registry_path, cache_folder=\".cache\")\n```\n\nOnce an ontology has been cached by either function, it is stored in a cache folder locally, and thus can be referenced even in different Python instances. Users can leverage the cache by using the assigned acronym as the value for the `target_ontology` argument, and setting the `use_cache` argument to `True`. The `cache_folder` parameter can be used to specify a custom cache location.\n\nTo clear the ontology cache, the following function can be used:\n\n```python\ntext2term.clear_cache(ontology_acronym='', cache_folder=\".cache\")\n```\n\nIf no arguments are specified, the entire cache will be cleared. Otherwise, only the ontology with the given acronym will be cleared.\nFinally, `cache_exists(ontology_acronym='', cache_folder=\".cache\")` is a simple function that returns `True` if the given acronym exists in the cache, and `False` otherwise.\n\n\u003e [!NOTE]\n\u003e The `cache_ontology` function returns an object that can be used to directly call the `map_terms` function, as well as `clear_cache` and `cache_exists`. These have the same arguments, except `ontology_target` is no longer specified and there is no `use_cache` option, since it is always True. \n\n\u003e [!CAUTION]\n\u003e While ontology URLs can be repeatedly used, acronyms must be distinct in a given environment.\n\n\n### 🧹 Input Preprocessing\ntext2term includes a module `preprocess.py` that supports regular expression-based preprocessing functionality for input terms. There are functions that take the input terms and a collection of (user-defined) regular expressions, then match each term to each regular expression to simplify the input term.\n\n```python\ntext2term.preprocess_terms(terms, template_path, output_file='', blocklist_path='', \n                           blocklist_char='', rem_duplicates=False)\n``` \nThis returns a dictionary where the keys are the original terms and the values are the preprocessed terms.\n\n```python\ntext2term.preprocess_tagged_terms(file_path, template_path='', \n                                  blocklist_path='', blocklist_char='', \n                                  rem_duplicates=False, separator=';:;')\n```\n\nThis returns a list of `TaggedTerm` objects.\n\nThe regex templates file `template_path` and the blocklist `blocklist_path` must each be a newline-separated file. If an output file is specified, the preprocessed strings are written to that file.\n\nThe blocklist functionality allows specifying another file with regular expressions that, when terms match any such regex in the blocklist, they are removed from the list of terms to map. Alternatively, if a blocklist character is specified, the input is replaced with that character. \n\nThe `rem_duplicates` option removes all duplicate terms after processing, if set to `True`.\n\nWhen the input to text2term is a table, any rows that contain `NA` values in the specified term column, or in the term ID column (if provided), will be ignored.\n\nIf an ignore tag `\"ignore\"` or `\"Ignore\"` is added to a term, that term will not be mapped to any terms in the ontology. It will only be included in the output if the `incl_unmapped` argument is True. The following values are regarded as ignore tags: `\"ignore\", \"Ignore\".\n\n\n## 🖥️ Command Line Usage\n\nAfter installing, execute the tool from a command line as follows:\n\n`python text2term [-h] -s SOURCE -t TARGET [-o OUTPUT] [-m MAPPER] [-csv CSV_INPUT] [-sep SEPARATOR] [-top TOP_MAPPINGS] [-min MIN_SCORE] [-iris BASE_IRIS] [-d] [-g] [-c STORE_IN_CACHE] [-type TERM_TYPE] [-u] [-bp BIOPORTAL_APIKEY] [-md]`\n\nTo display a help message with descriptions of tool arguments do:\n\n`python text2term -h` or `python text2term --help`\n\n### ❗ Required Arguments\n`-s SOURCE` Input file containing 'source' terms to map to ontology terms (list of terms or CSV file)\n\n`-t TARGET` Path or URL of 'target' ontology to map source terms to. When the chosen mapper is BioPortal or Zooma, provide a comma-separated list of acronyms (eg 'EFO,HPO') or write `'all'` to search all ontologies\n\n\n### ❕ Optional Arguments\n\n`-o OUTPUT` Path to desired output file for the mappings\n\n`-m MAPPER` Method used to compare source terms with ontology terms. One of: *levenshtein, jaro, jarowinkler, jaccard, indel, fuzzy, tfidf, zooma, bioportal*\n\n`-csv CSV_INPUT` Indicates a CSV format input—follow with the name of the column containing terms to map, optionally followed by the name of the column containing identifiers for the terms (eg 'my terms,my term ids')\n\n`-sep SEPARATOR` Specifies the cell separator to be used when reading a table\n\n`-top TOP_MAPPINGS` Maximum number of top-ranked mappings returned per source term\n\n`-min MIN_SCORE` Minimum similarity score [0,1] for the mappings (1=exact match)\n\n`-iris BASE_IRIS` Map only to ontology terms whose IRIs start with a value given in this comma-separated list (eg 'http://www.ebi.ac.uk/efo,http://purl.obolibrary.org/obo/HP)')\n\n`-d` Exclude ontology terms stated as deprecated via `owl:deprecated true`\n\n`-g` Save [vis.js](https://visjs.org) graphs representing the neighborhood of each ontology term\n\n`-c STORE_IN_CACHE` Cache the target ontology using the name given here\n\n`-type TERM_TYPE` Specify whether to map to ontology classes, properties, or both\n\n`-u` Include all unmapped terms in the output\n\n`-bp` BioPortal API Key to use along with the BioPortal mapper option\n\n`-md` Exclude the metadata header in the output file\n\n## 🔧️ Supported Mappers \n\nThe mapping score of each mapping indicates how similar an input term is to an ontology term (via its labels or synonyms). The mapping scores generated by text2term are the result of applying one of the following _mappers_:\n\n**TF-IDF-based mapper**\u0026mdash;[TF-IDF](https://en.wikipedia.org/wiki/Tf–idf) is a statistical measure often used in information retrieval that measures how important a word is to a document in a corpus of documents. We first generate TF-IDF-based vectors of the source terms and of labels and synonyms of ontology terms. Then we compute the [cosine similarity](https://en.wikipedia.org/wiki/Cosine_similarity) between vectors to determine how similar a source term is to a target term (label or synonym).\n\n**Syntactic distance-based mappers**\u0026mdash;text2term provides support for commonly used and popular syntactic (edit) distance metrics: Levenshtein, Jaro, Jaro-Winkler, Jaccard, and Indel. We use the [nltk](https://pypi.org/project/nltk/) package to compute Jaccard distances and [rapidfuzz](https://pypi.org/project/rapidfuzz/) to compute all others.  \n\n**BioPortal Web API-based mapper**\u0026mdash;uses an interface to the [BioPortal Annotator](https://bioportal.bioontology.org/annotator) that we built to allow mapping terms in bulk to ontologies in the [BioPortal](https://bioportal.bioontology.org) repository.\n\n\u003e [!WARNING]\n\u003e There are no scores associated with BioPortal annotations, so the score of all mappings is always 1\n\n**Zooma Web API-based mapper**\u0026mdash;uses a [Zooma](https://www.ebi.ac.uk/spot/zooma/) interface that we built to allow mapping terms in bulk to ontologies in the [Ontology Lookup Service (OLS)](https://www.ebi.ac.uk/ols4) repository. \n\n\u003e [!IMPORTANT]\n\u003e When using the BioPortal or Zooma interfaces, make sure to specify the target ontology name(s) as they appear in BioPortal or OLS, respectively\n\n\u003e [!NOTE]\n\u003e Syntactic distance-based mappers and Web API-based mappers perform slowly (much slower than the TF-IDF mapper). The former because they do pairwise comparisons between each input string and each ontology term label/synonym. In the Web API-based approaches there are networking and API load overheads\n\n## 📖 Citation\n\nIf you use text2term in your research, please cite:\n\u003e [The text2term tool to map free-text descriptions of biomedical terms to ontologies](https://doi.org/10.1093/database/baae119)\u003cbr/\u003e\n\u003e Rafael S Gonçalves, Jason Payne, Amelia Tan, Carmen Benitez, Jamie Haddock, Robert Gentleman\u003cbr/\u003e\n\u003e _Database_, Volume 2024, 2024, baae119, https://doi.org/10.1093/database/baae119\n\n```latex\n@article{10.1093/database/baae119,\n    author = {Gonçalves, Rafael S and Payne, Jason and Tan, Amelia and Benitez, Carmen and Haddock, Jamie and Gentleman, Robert},\n    title = {The text2term tool to map free-text descriptions of biomedical terms to ontologies},\n    journal = {Database},\n    volume = {2024},\n    pages = {baae119},\n    year = {2024},\n    month = {11},\n    issn = {1758-0463},\n    doi = {10.1093/database/baae119},\n    url = {https://doi.org/10.1093/database/baae119}\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frsgoncalves%2Ftext2term","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frsgoncalves%2Ftext2term","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frsgoncalves%2Ftext2term/lists"}