{"id":42304988,"url":"https://github.com/soras/ajavt","last_synced_at":"2026-01-27T11:05:36.671Z","repository":{"id":85494673,"uuid":"45839750","full_name":"soras/Ajavt","owner":"soras","description":"Ajavt \\ Temporal Expression Tagger for Estonian","archived":false,"fork":false,"pushed_at":"2025-02-04T13:39:36.000Z","size":1706,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-21T05:44:57.148Z","etag":null,"topics":["estonian","estonian-language","information-extraction","java","nlp","temporal-tagger","timex","timex3"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/soras.png","metadata":{"files":{"readme":"readme.txt","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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-11-09T13:32:17.000Z","updated_at":"2025-02-04T13:39:39.000Z","dependencies_parsed_at":null,"dependency_job_id":"9058e0f7-512b-4940-9a8d-f5dc8ac9a02e","html_url":"https://github.com/soras/Ajavt","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/soras/Ajavt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soras%2FAjavt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soras%2FAjavt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soras%2FAjavt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soras%2FAjavt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/soras","download_url":"https://codeload.github.com/soras/Ajavt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soras%2FAjavt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28812367,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-27T07:41:26.337Z","status":"ssl_error","status_checked_at":"2026-01-27T07:41:08.776Z","response_time":168,"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":["estonian","estonian-language","information-extraction","java","nlp","temporal-tagger","timex","timex3"],"created_at":"2026-01-27T11:05:35.713Z","updated_at":"2026-01-27T11:05:36.661Z","avatar_url":"https://github.com/soras.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"===================================================================\r\n   Ajavt (Ajaväljendite tuvastaja): \r\n   Temporal Expression Tagger for Estonian\r\n===================================================================\r\n\r\n  Temporal Expression Tagger is a program that detects time\r\n  referring expressions (timexes) from natural language text and \r\n  normalises semantics of these expressions in a standard format. \r\n  \r\n  This repository contains Ajavt, a rule-based language-specific \r\n  temporal expression tagger for Estonian. The tool uses an\r\n  annotation format that is based on the TimeML's TIMEX3 tag\r\n  (http://www.timeml.org), and it is currently tuned for temporal \r\n  tagging in news domain.\r\n    \r\n  Previous versions of this tool have been introduced in two \r\n  publications. Technical details about the implementation were \r\n  covered in (Orasmaa 2010), and a more general overview, \r\n  accompanied with evaluation of the tagger on different text \r\n  genres, was provided in (Orasmaa 2012).\r\n\r\n\r\n===========================================\r\n   Temporal expression tagging: an example\r\n===========================================\r\n  The sentence:\r\n\r\n    Potsataja ütles eile, et vaatavad nüüd Genaga viie aasta plaanid \r\n    uuesti üle. \r\n    'Potsataja said yesterday that he and Gena will now check over \r\n    the plans for the five years.'\r\n\r\n  is tagged for temporal expressions in a following way (assuming \r\n  that the creation time of the text is 2014-10-06):\r\n\r\n    Potsataja ütles \r\n    \u003cTIMEX tid=\"t1\" type=\"DATE\" value=\"2014-10-05\"\u003e\r\n    eile\r\n    \u003c/TIMEX\u003e, \r\n    et vaatavad \r\n    \u003cTIMEX tid=\"t2\" type=\"DATE\" value=\"PRESENT_REF\" anchorTimeID=\"t0\"\u003e\r\n    nüüd\r\n    \u003c/TIMEX\u003e \r\n    Genaga \r\n    \u003cTIMEX tid=\"t3\" type=\"DURATION\" value=\"P5Y\"\u003e\r\n    viie aasta \r\n    \u003c/TIMEX\u003e \r\n    plaanid uuesti üle. \r\n\r\n\r\n=========================\r\n   Requirements\r\n=========================\r\n For building the program (JAR file):\r\n  ** Java JDK (at least version 1.8.x is expected);\r\n  ** Apache Ant (at least version 1.8.2);\r\n  \r\n For using the program:\r\n  ** A sentence segmentator;\r\n  ** A word tokenizer;\r\n  ** Estonian morphological analyzer and disambiguator, possible \r\n     options:\r\n     -- Filosoft's Vabamorf: https://github.com/Filosoft/vabamorf\r\n     -- PyVabamorf:          https://github.com/estnltk/pyvabamorf\r\n     -- T3MESTA (a commercial morphological analyzer)\r\n     (NB! The program also works on morphologically ambiguous input, \r\n      but the quality of the analysis is expected to be lower than \r\n      on the morphologically disambiguated text.)\r\n \r\n\r\n=========================\r\n   Building the program\r\n=========================\r\n   The most straightforward way for compiling the program is by using\r\n  Apache Ant and the build script (\"build.xml\" in root dir);\r\n  \r\n   Before building, correct path to JDK must be set in the file \r\n  \"build.properties\" (variable \"java.home.location\"). Then, building\r\n  and deploying can be evoked with the command:\r\n\r\n      ant deploy\r\n\r\n  (in the same directory where \"build.xml\" is located);\r\n   This compiles the Java source code, makes the JAR file (Ajavt.jar), \r\n  and copies the JAR file along with required files into the folder \r\n  \"test\";\r\n\r\n\r\n=========================\r\n   Using the program\r\n=========================\r\n   Before Ajavt can be applied on a text, a number of text preprocessing \r\n  steps must be made: text must be split into sentences and tokens \r\n  (words), and words must be morphologically analysed (and \r\n  disambiguated).\r\n   These functionalities are provided by EstNLTK toolkit, so the \r\n  easiest way to use the program is within this toolkit ( see \r\n  https://github.com/estnltk/estnltk   for more details ).\r\n   \r\n   Processing JSON format texts\r\n  ------------------------------\r\n   In the JSON processing mode (flag '-format json'), it is expected that \r\n  the input of the program is in the same format as the output of \r\n  Vabamorf's command 'etana analyze' - a JSON structured text in UTF8 \r\n  encoding. Note that the minimum JSON structure that the input should \r\n  have is:\r\n     {\"words\": [ {\"analysis\": [ ... ],\r\n                   \"text\": \"word1\"},\r\n                  {\"analysis\": [ ... ],\r\n                   \"text\": \"word2\"},\r\n                   ...\r\n                  {\"analysis\": [ ... ],\r\n                   \"text\": \"wordN\"} ]}\r\n   That is, an object with key \"words\" must be present, indicating an \r\n  analysable sentence.\r\n   Also note that Ajavt expects that word root analyses are 'clean', \r\n  i.e. without any phonetic markup symbols (which can be optionally added \r\n  in 'etana' with flag '-phonetic').\r\n\r\n   An example of JSON input can be found in file \"test/example_input.json\";\r\n  In the \"test\" folder, following command evokes Ajavt on the input file \r\n  \"example_input.json\" and outputs the results to standard input:\r\n  \r\n     java -jar Ajavt.jar -format json -in file example_input.json -pretty_print\r\n\r\n     (flag \"-pretty_print\" switches on the pretty printing mode, otherwise, \r\n      all of the output JSON is on a single line);\r\n  \r\n   Alternatively, output can also be directed to a file by specifying:\r\n\r\n     java -jar Ajavt.jar -format json -in file example_input.json -pretty_print -out file my_output.json\r\n\r\n   Document creation time (DCT)\r\n  ------------------------------\r\n   By default, temporal expressions with relative semantics (such as \r\n  'eile' / yesterday, 'reedel' / on Friday) are normalised with respect \r\n  to execution time of the program. This setting can be overridden by \r\n  providing a separate document creation time as an input of the \r\n  program:\r\n   \r\n     java -jar Ajavt.jar 1999-01-01TXX:XX -format json -in file example_input.json -pretty_print\r\n\r\n   The document creation time must be in the format \"YYYY-MM-DDThh:mm\".\r\n  Date/time fields marked with X-es are considered as unspecified/unknown.\r\n  For example, it can be specified that the creation time is only known \r\n  at month level (e.g. 1999-01-XXTXX:XX) or at year level (e.g. \r\n  1999-XX-XXTXX:XX). This also affects the normalisation, e.g. if DCT is\r\n  only specified at the year level, date-granularity relative expressions\r\n  (for example: 'reedel' / on Friday) will be normalised as unspecified \r\n  temporal references (XXXX-XX-XXTXX:XX);\r\n \r\n   Other remarks\r\n  ------------------------------\r\n   The Ajavt.jar should be executed in a directory that contains other files \r\n  required by the program:\r\n       javax.json-1.0.4.jar\r\n       joda-time-1.6.jar\r\n       reeglid.xml\r\n   \r\n   The program can be executed with a custom configuration of rules, using the\r\n  flag \"-r\" followed by the full path to the XML rules file (e.g.\r\n  \"reeglid.xml\"):\r\n    \r\n       java -jar Ajavt.jar -format json -in file example_input.json -pretty_print -r FULL/PATH/TO/reeglid.xml\r\n\r\n  Flag \"-pyvabamorf\" evokes the program in a special standard input/output \r\n  processing mode, where the program reads a JSON formatted line from the \r\n  standard input, analyzes the line, and outputs the results (in a single JSON \r\n  formatted line) to the standard output:\r\n\r\n     java -jar Ajavt.jar -pyvabamorf \r\n\r\n\r\n============================\r\n   Interpreting the output\r\n============================\r\n  The annotation format used by the program is described in the file \r\n \"doc/margendusformaat_et.pdf\" (currently only in Estonian). Here,\r\n we give a brief overview how this format is expressed in JSON.\r\n  \r\n   JSON format output\r\n  ----------------------\r\n  In JSON input/output format, the presence of identified temporal expression(s) \r\n is indicated by adding object \"timexes\" to the token (at the same level as \r\n objects \"text\" and \"analysis\"). The \"timexes\" is a list of objects and each object \r\n has (at minimum) a following structure:\r\n        {\r\n          \"tid\":   string,\r\n        }\r\n  where \"tid\" is an unique identifier of the temporal expression (in form that \r\n  can be described by a regular expression \"t[0-9]+\" ).\r\n   (Note that in \"-pyvabamorf\" processing mode, this uniqueness only holds \r\n    within a single input line, which is expected to be a single document);\r\n\r\n  If the token begins a temporal expression phrase (either a single-word phrase \r\n  or a multiword phrase), additional attribute/value pairs will be specified in \r\n  the timex object:\r\n        \"text\" : string  \r\n            // full extent phrase of the temporal expression\r\n        \"type\" : string  \r\n            // one of the following: \"DATE\", \"TIME\", \"DURATION\", \"SET\"\r\n        \"value\": string\r\n            // calendrical value (largely follows TimeML TIMEX3 value format),\r\n            // but see \"doc/margendusformaat_et.pdf\" for details;\r\n        \"temporalFunction\": string (\"true\" or \"false\")\r\n            // indicates whether the semantics of the expression are relative \r\n            // to the context:\r\n            //  *) For DATE and TIME expressions:\r\n            //      \"true\" indicates that the expression is relative and \r\n            //             semantics have been computed by heuristics;\r\n            //      \"false\" indicates that the expression is absolute and \r\n            //             semantics haven't been computed by heuristics;\r\n            //  *) For DURATION expressions, the value is mostly \"false\", \r\n            //     except for vague durations;\r\n            //  *) For SET expressions, the value is always \"true\";\r\n\r\n  Depending on the (semantics of the) temporal expression, there can also be \r\n  other attribute/value pairs:\r\n         \"mod\" : string\r\n            // largely follows TimeML TIMEX3 mod format, with two additional \r\n            // values used to mark first/second half of the date/time (e.g. \"in \r\n            // the first half of the month\"):  FIRST_HALF, SECOND_HALF;\r\n         \"anchorTimeID\"\r\n            // points to the temporal expression (by identifier) that this \r\n            // expression has been anchored to while calculating or determining \r\n            // the value;\r\n            // \"t0\" -- means that the expression is anchored to document \r\n            // creation time;\r\n         \"beginPoint\"\r\n            // in case of DURATION: points to the temporal expression (by \r\n            // identifier) that serves as a beginning point of this duration;\r\n            // \"?\" -- indicates problems on finding the beginning point;\r\n         \"endPoint\"\r\n            // in case of DURATION: points to the temporal expression (by \r\n            // identifier) that serves as an ending point of this duration;\r\n            // \"?\" -- indicates problems on finding the ending point;\r\n         \"quant\"\r\n            // Quantifier; Used only in some SET expressions, e.g. quant=\"EVERY\"\r\n         \"freq\" \r\n            // Used in some SET expressions, marks frequency of repetition, \r\n            // e.g. \"three days in each month\" will be have freq=\"3D\"\r\n \r\n   An example\r\n  --------------\r\n    The sentence\r\n      \"Potsataja ütles eile, et vaatavad nüüd Genaga viie aasta plaanid uuesti üle.\"\r\n      (created at 2014-10-06)\r\n    \r\n    will obtain following temporal expression annotations:\r\n       {\r\n            \"words\":[  { \"analysis\":[ ... ],\r\n                         \"text\":\"Potsataja\"\r\n                       },\r\n                       { \"analysis\":[ ... ],\r\n                         \"text\":\"ütles\"\r\n                       },\r\n                       { \"analysis\":[ ... ],\r\n                         \"text\":\"eile,\",\r\n                         \"timexes\":[ { \"tid\":\"t1\",\r\n                                       \"text\":\"eile,\",\r\n                                       \"type\":\"DATE\",\r\n                                       \"temporalFunction\":\"true\",\r\n                                       \"value\":\"2014-10-05\" } ]\r\n                       },\r\n                       { \"analysis\":[ ... ],\r\n                         \"text\":\"et\"\r\n                       },\r\n                       { \"analysis\":[ ... ],\r\n                         \"text\":\"vaatavad\"\r\n                       },\r\n                       {\r\n                         \"analysis\":[ ... ],\r\n                         \"text\":\"nüüd\",\r\n                         \"timexes\":[ { \"tid\":\"t2\",\r\n                                       \"text\":\"nüüd\",\r\n                                       \"type\":\"DATE\",\r\n                                       \"temporalFunction\":\"true\",\r\n                                       \"value\":\"PRESENT_REF\",\r\n                                       \"anchorTimeID\":\"t0\"  } ]\r\n                       },\r\n                       { \"analysis\":[ ... ],\r\n                         \"text\":\"Genaga\"\r\n                       },\r\n                       { \"analysis\":[ ... ],\r\n                         \"text\":\"viie\",\r\n                         \"timexes\":[ { \"tid\":\"t3\",\r\n                                       \"text\":\"viie aasta\",\r\n                                       \"type\":\"DURATION\",\r\n                                       \"temporalFunction\":\"false\",\r\n                                       \"value\":\"P5Y\" } ]\r\n                       },\r\n                       { \"analysis\":[ ... ],\r\n                         \"text\":\"aasta\",\r\n                         \"timexes\":[ { \"tid\":\"t3\",\r\n                                       \"text\":\"viie aasta\" } ]\r\n                       },\r\n                       { \"analysis\":[ ... ],\r\n                         \"text\":\"plaanid\"\r\n                       },\r\n                       { \"analysis\":[ ... ],\r\n                         \"text\":\"uuesti\"\r\n                       },\r\n                       { \"analysis\":[ ... ],\r\n                         \"text\":\"üle\"\r\n                       }\r\n                    ]\r\n        }\r\n\r\n    which should be interpreted as:\r\n       \"eile,\" -- is a single-word temporal expression, which is from type \r\n                  \"DATE\", and which refers to the date \"2014-10-05\";\r\n       \"nüüd\" --  is a single-word temporal expression, which is from type \r\n                  \"DATE\", and which has an uncertain calendaric value, but it \r\n                  refers to the present time (PRESENT_REF), contemporary to \r\n                  the document creation time (t0, which is 2014-10-06);\r\n       \"viie\", \"aasta\" -- forms a multiword temporal expression phrase \r\n                  (\"viie aasta\"), referring to a period (\"DURATION\") of \r\n                  length 5 years;\r\n                  \r\n   Specifics\r\n  --------------\r\n  I. Note that there can also be timexes with no \"text\" value, i.e. timexes that \r\n  form an implicit duration (A), or mark implicit beginning or ending points (B):\r\n\r\n    (A) e.g. \"2001-2005\" -- the period covering explicit timepoints \"2001-\" and \r\n                            \"2005\" is annotated as a timex (DURATION) with no \r\n                            textual content;\r\n\r\n    (B) e.g. \"following three years\" -- beginning and ending timepoints of the \r\n                            explicit duration expression (\"three years\") are marked \r\n                            as timexes with no textual content;\r\n\r\n  II. The program does not always resolve the ambiguities of possible multiple \r\n  readings of temporal expressions, e.g. \"aastas 2000 tundi\" can be interpreted \r\n  as \"aastas 2000\" (in year 2000) or as \"2000 tundi\" (2000 hours). In case of \r\n  ambiguities, \"timexes\" also lists multiple timex objects.\r\n\r\n\r\n===============================\r\n   Development and evaluation\r\n===============================\r\n\r\n   The structure\r\n  ------------------\r\n  The Ajavt project has following directory structure:\r\n  \r\n  [doc]                            \u003c--- documentation about the annotation format\r\n                                        and about format of the rules file;  \r\n\r\n  [lib]                            \u003c--- Java dependencies of the program;\r\n\r\n  [res]                            \u003c--- resources used by the program:\r\n  [res\\reeglid.xml]                \u003c--- the rules file\r\n\r\n  [src]                            \u003c--- source of the program:\r\n  [src\\ee\\ut\\soras\\ajavtV2]        \u003c--- main source of the tagger;\r\n  [src\\ee\\ut\\soras\\wrappers]       \u003c--- wrappers for handling different input formats,\r\n                                        and a common model for encapsulating \r\n                                        morphological analyses;\r\n\r\n  [test-src]                       \u003c--- methods for automated testing \u0026 evaluation;\r\n  [test-src\\ee\\ut\\soras\\test_ajavt] --- tools for evaluating the tagger on an \r\n                                        annotated corpus;\r\n      \r\n  [test]                           \u003c--- the testing folder;\r\n                                        tagger's JAR file along with required \r\n                                        dependencies will be deployed here;\r\n      \r\n  readme.txt        \u003c--- you are here :)\r\n  build.properties  \u003c--- configuration for the Ant build script;\r\n  build.xml         \u003c--- the Ant build script for compiling, deploying and testing \r\n                         the tagger;\r\n\r\n\r\n   Automated testing and evaluation\r\n  ----------------------------------\r\n  This distribution also contains tools for automated testing/evaluating the tagger \r\n  against manually annotated TIMEX corpora. In order to set up and use the automatic \r\n  evaluation, proceed in following steps:\r\n  \r\n   I. Download Estonian TIMEX annotated corpora from following repository:\r\n         https://github.com/soras/EstTimexCorpora\r\n\r\n   II. Modify \"build.properties\" of this program and set the root directory of\r\n       evaluation corpora:\r\n         test.root=FULL/PATH/TO/EstTimexCorpora\r\n\r\n   III. Modify \"build.xml\" of this program to enable automated testing: remove \r\n        the comments around properties \"use.tml.corpus.04\" and \"use.t3o.corpus.03\".\r\n       \r\n        The property \"use.tml.corpus.04\" enables the evaluation task \"test-tml-04\",\r\n        and the property \"use.t3o.corpus.03\" enables the task \"test-t3-olp-03\";\r\n\r\n   IV. Execute the automatic evaluation on all corpora with the command:\r\n            ant test-all\r\n\r\n       Alternatively, evaluation can be executed only on the TML format corpus:\r\n            ant test-tml\r\n\r\n       and only on the T3-OLP-AJAV format corpus:\r\n            ant test-t3-olp\r\n\r\n   V. The evaluation program will output a detailed analysis on matching (and \r\n      mismatching) TIMEX annotations for each document. Additionally, precisions \r\n      and recalls on TIMEX extents and attributes will be reported for each \r\n      document, and microaverages of these measures will be reported at the end \r\n      of the evaluation;\r\n      \r\n      The results of the evaluation will also be written into text files, marked \r\n      with the timestamp of evaluation. Each evaluation corpus has a subdirectory \r\n      \"testlog\" that stores these text files.\r\n\r\n\r\n============================\r\n   Acknowledgements and \r\n   license\r\n============================\r\n  Copyright (C) 2009-2016  University of Tartu\r\n  Author:   Siim Orasmaa  ( siim . orasmaa {at} ut . ee )\r\n\r\n  Before 2025, Ajavt was released under GNU General Public License v2.0.\r\n  Since 2025, Ajavt is released under dual license: choose either GNU \r\n  General Public License v2.0 or Apache 2.0 License. \r\n\r\n  Dependency libraries have their own respective license terms, see \r\n  \"lib/LIB_LICENSES.txt\" for details.\r\n\r\n  Development of this tool has been supported by the National Programme \r\n  for Estonian Language Technology under projects EKKTT09-66, EKT7 and \r\n  EKT57.\r\n  \r\n============================\r\n   References\r\n============================\r\n\r\n Orasmaa, S. (2010). Ajaväljendite tuvastamine eestikeelses tekstis \r\n (Recognition and Resolution of Estonian Temporal Expressions). Master’s \r\n thesis, University of Tartu. (in Estonian).\r\n  ( url: http://comserv.cs.ut.ee/forms/ati_report/downloader.php?file=F0E53012D5F88F71DD6E2E84830460F334E14EA2 )\r\n\r\n Orasmaa, S. (2012) \"Automaatne ajaväljendite tuvastamine eestikeelsetes tekstides\" \r\n (Automatic Recognition and Normalization of Temporal Expressions in Estonian \r\n Language Texts). Eesti Rakenduslingvistika Ühingu aastaraamat 8: 153-169.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoras%2Fajavt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsoras%2Fajavt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoras%2Fajavt/lists"}