Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 1 | ! This tokenizer is based on work by |
| 2 | ! - StandardTokenizerImpl by the Lucene project |
| 3 | ! under the Apache License |
| 4 | ! - https://github.com/dlwh/epic by David Hall (2014) |
| 5 | ! under the Apacahe License |
| 6 | ! - KorAPTokenizerImpl.jflex by Marc Kupietz (2016) |
| 7 | ! under the Apache License |
| 8 | ! - https://github.com/coltekin/TRmorph/tokenize.xfst by Çağrı Çöltekin (2011-2015) |
| 9 | ! under the MIT License |
| 10 | ! |
| 11 | ! The abbreviation list is part of the sentence splitter tool |
| 12 | ! of the IDS. |
| 13 | |
Akron | 4af79f1 | 2021-08-11 14:48:17 +0200 | [diff] [blame] | 14 | define NLout "@_TOKEN_SYMBOL_@"; |
Akron | 3de361e | 2021-08-17 09:56:42 +0200 | [diff] [blame] | 15 | ! define NLout "\u000a"; |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 16 | |
| 17 | define Digit [%0|1|2|3|4|5|6|7|8|9]; |
Akron | e8837b5 | 2021-08-11 17:29:58 +0200 | [diff] [blame] | 18 | define AsciiLetter [a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z]; |
Akron | 11a05d9 | 2021-11-06 13:17:11 +0100 | [diff] [blame] | 19 | define HexLetter [Digit|a|A|b|B|c|C|d|D|e|E|f|F]; |
Akron | a854faa | 2021-10-22 19:31:08 +0200 | [diff] [blame] | 20 | define EOT "\u0004"; |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 21 | |
| 22 | !!!!!!!!!!!!!!!!! |
| 23 | ! <from tmorph> ! |
| 24 | !!!!!!!!!!!!!!!!! |
Akron | 3de361e | 2021-08-17 09:56:42 +0200 | [diff] [blame] | 25 | define WS [" "|"\u0009"|"\u00a0"|"\u1680"| |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 26 | "\u2000"|"\u2001"|"\u2002"|"\u2003"|"\u2004"|"\u2005"| |
| 27 | "\u2006"|"\u2007"|"\u2008"|"\u2009"|"\u200a"| |
Akron | 3de361e | 2021-08-17 09:56:42 +0200 | [diff] [blame] | 28 | "\u202f"|"\u205f"|"\u3000"]; |
| 29 | |
Akron | a854faa | 2021-10-22 19:31:08 +0200 | [diff] [blame] | 30 | define NL ["\u000a"|"\u000b"|"\u000c"|"\u000d"|"\u0085"|"\u2028"|"\u2029"|EOT]; |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 31 | |
| 32 | ! Punctuation that ends sentences |
| 33 | ! Differs! |
Akron | 3de361e | 2021-08-17 09:56:42 +0200 | [diff] [blame] | 34 | define SP [["."|"?"|"!"]+|"…"]; |
| 35 | |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 36 | ! Left punctuation |
| 37 | define LP ["("|"["|"{"| |
| 38 | "“"|"‘"|"‹"|"«"| |
| 39 | "'"|%"| |
| 40 | ! differs |
| 41 | ["'" "'"] | |
| 42 | "*"|"/"|"_"| ! Can be Markdown |
| 43 | ! from book |
| 44 | [%, %,]]; |
Akron | 3de361e | 2021-08-17 09:56:42 +0200 | [diff] [blame] | 45 | |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 46 | ! Right punctuation - excluding the characters that can be used as apostrophe |
Akron | e200841 | 2022-03-09 10:10:13 +0100 | [diff] [blame] | 47 | define RP [SP|","|";"|":"| |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 48 | ")"|"]"|"}"| |
Akron | e200841 | 2022-03-09 10:10:13 +0100 | [diff] [blame] | 49 | "”"|"›"|"»"|%"|[%’ %’]|["'" "'"]|[%‘ %‘]| |
Akron | e96895f | 2022-03-08 19:58:37 +0100 | [diff] [blame] | 50 | "*"|"/"|"_"]; ! Can be Markdown |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 51 | |
Akron | 6742b96 | 2021-11-09 01:17:20 +0100 | [diff] [blame] | 52 | define Sym ["-"|"+"|"<"|">"|"*"|"/"|%=|%@|%&]; |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 53 | define Apos %'|%’|%`; |
Akron | 4c2a1ad | 2021-08-31 00:35:53 +0200 | [diff] [blame] | 54 | define Punct [LP|RP|Sym]; |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 55 | !define nonSym \[WS|LP|RP|Sym]; |
| 56 | !!!!!!!!!!!!!!!!!! |
| 57 | ! </from tmorph> ! |
| 58 | !!!!!!!!!!!!!!!!!! |
| 59 | |
| 60 | define Emdash [%- %- (%-)+ | ["\u2014"|"\u2015"|"\u2e3a"|"\u2e3b"|"\ufe58"]+]; |
| 61 | define Dash ["-"|"\u2011"|"\u2012"|"\u2013"|"\u2e1a"|"\ufe63"|"\uff0d"]; |
| 62 | define Slash ["⁄"|"∕"|"/"|"/"]; |
| 63 | define Asterisk ["*"]; |
| 64 | |
Akron | 3de361e | 2021-08-17 09:56:42 +0200 | [diff] [blame] | 65 | define Char \[WS|NL|Punct|Apos]; ! |¨; |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 66 | |
Akron | b02ad07 | 2022-01-19 12:41:44 +0100 | [diff] [blame] | 67 | define Word Char+ ([Apos|Asterisk] Char+)* ([s|S] [%’|%`]); |
Akron | 936c0f5 | 2021-12-07 11:30:53 +0100 | [diff] [blame] | 68 | |
| 69 | define Plusampersand @txt"txt/plusampersand.txt"; |
| 70 | define Word [Plusampersand | Word] (Dash [Plusampersand | Word])*; |
| 71 | |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 72 | !define Alpha ["a"|"b"|"c"|"d"|"e"|"f"|"g"|"h"|"i"|"j"|"k"|"l"|"m"|"n"|"o"|"p"|"q"|"r"|"s"|"t"|"u"|"v"|"w"|"x"|"y"|"z"|"_"]; |
| 73 | |
| 74 | define Caseinsensitive [ |
| 75 | a (->) A, |
| 76 | b (->) B, |
| 77 | c (->) C, |
| 78 | d (->) D, |
| 79 | e (->) E, |
| 80 | f (->) F, |
| 81 | g (->) G, |
| 82 | h (->) H, |
| 83 | i (->) I, |
| 84 | j (->) J, |
| 85 | k (->) K, |
| 86 | l (->) L, |
| 87 | m (->) M, |
| 88 | n (->) N, |
| 89 | o (->) O, |
| 90 | p (->) P, |
| 91 | q (->) Q, |
| 92 | r (->) R, |
| 93 | s (->) S, |
| 94 | t (->) T, |
| 95 | u (->) U, |
| 96 | v (->) V, |
| 97 | w (->) W, |
| 98 | x (->) X, |
| 99 | y (->) Y, |
| 100 | z (->) Z, |
| 101 | ö (->) Ö, |
| 102 | ü (->) Ü, |
| 103 | ä (->) Ä, |
| 104 | ß (->) {SS} |
| 105 | ]; |
| 106 | |
Akron | f1106ec | 2021-11-05 13:04:44 +0100 | [diff] [blame] | 107 | define Letter [ [ AsciiLetter | ö | ü | ä | ß ] .o. Caseinsensitive ]; |
| 108 | |
Akron | 11a05d9 | 2021-11-06 13:17:11 +0100 | [diff] [blame] | 109 | ! Abbreviations and Initials |
Akron | f1106ec | 2021-11-05 13:04:44 +0100 | [diff] [blame] | 110 | define Abbr [ @txt"txt/abbrv.txt" | Letter ] %.; |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 111 | |
| 112 | ! A solution to the "(author): problem" may be to add ) at the end of any |
| 113 | ! string as a possible ending |
| 114 | |
| 115 | define Years ["(" Digit+ (".") ")"] | ["[" Digit+ (".") "]"]; |
| 116 | |
Akron | 17984c8 | 2021-10-30 11:44:37 +0200 | [diff] [blame] | 117 | ! 20:00 Uhr, 00:12:25,34 Minuten |
| 118 | define Times [ ( [%0|1|2|3|4|5] ) Digit [ ":" [%0|1|2|3|4|5] Digit ]^{1,2} ( "," [ Digit ]^{1,3} ) ]; |
Akron | 78dba06 | 2021-10-28 19:30:46 +0200 | [diff] [blame] | 119 | |
Akron | 61948ef | 2022-03-30 14:07:57 +0200 | [diff] [blame^] | 120 | ! Emoticons |
Akron | b98e4cf | 2022-03-27 23:56:49 +0200 | [diff] [blame] | 121 | source emoticons.xfst |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 122 | |
| 123 | ! acronyms: U.S.A., I.B.M., etc. |
| 124 | ! use a post-filter to remove dots |
Akron | 54ed7e7 | 2022-01-04 12:05:00 +0100 | [diff] [blame] | 125 | define AcronymDep Letter %. Letter %. [Letter %.]+; |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 126 | |
Akron | c840636 | 2021-11-09 20:17:50 +0100 | [diff] [blame] | 127 | ! XML sources |
| 128 | source xml.xfst |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 129 | |
Akron | 6742b96 | 2021-11-09 01:17:20 +0100 | [diff] [blame] | 130 | ! XML entities |
| 131 | source entities.xfst |
Akron | 6742b96 | 2021-11-09 01:17:20 +0100 | [diff] [blame] | 132 | |
Akron | 61948ef | 2022-03-30 14:07:57 +0200 | [diff] [blame^] | 133 | ! Technical protocols |
| 134 | source protocols.xfst |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 135 | |
Akron | a0bded5 | 2021-08-11 15:48:02 +0200 | [diff] [blame] | 136 | define Streetname Word {str} %.; |
Akron | 4af79f1 | 2021-08-11 14:48:17 +0200 | [diff] [blame] | 137 | |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 138 | ! Also supports |
| 139 | ! 19.4.2015, 19/4/2015 etc. |
| 140 | define DigitPunct ["_"|"-"|"."|","|Slash]; |
| 141 | define Num Digit+ [DigitPunct Digit+]* (Char+); |
| 142 | |
Akron | a0bded5 | 2021-08-11 15:48:02 +0200 | [diff] [blame] | 143 | ! ordinals |
| 144 | define Ord Digit ( Digit (Digit) ) %.; |
| 145 | |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 146 | ! TODO: |
| 147 | ! floating point, serial, model numbers, ip addresses, etc. |
| 148 | ! every other segment must have at least one digit |
| 149 | |
| 150 | ! Omission words like "fu**ing!" |
| 151 | define Omission Char+ Asterisk Asterisk+ Char*; |
| 152 | |
| 153 | |
| 154 | ! TODO: Name words with ' and ` |
| 155 | |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 156 | ! Support ASCII elements, like |
| 157 | ! +---------------+ |
| 158 | ! <---->, -->, <-- |
| 159 | ! +---------------+ |
| 160 | ! <---> | Worker Node N | |
| 161 | ! +---------------+ |
| 162 | ! |============= Core =============| |
| 163 | |
| 164 | |
Akron | 4c2a1ad | 2021-08-31 00:35:53 +0200 | [diff] [blame] | 165 | echo - Compile Real Token |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 166 | |
Akron | e87906b | 2021-11-24 10:39:14 +0100 | [diff] [blame] | 167 | define RealToken [Punct|Emdash|Abbr|Streetname|Word|SNS|AcronymDep|Ord|Num|Years|Times|XMLEntities|Omission]; |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 168 | |
| 169 | echo - Introduce Token splitter |
Akron | 4c2a1ad | 2021-08-31 00:35:53 +0200 | [diff] [blame] | 170 | |
| 171 | define Token [ |
Akron | 4222ac8 | 2022-03-11 01:06:21 +0100 | [diff] [blame] | 172 | RealToken @-> ... NLout, |
Akron | 7198645 | 2021-11-09 01:36:30 +0100 | [diff] [blame] | 173 | XML @-> ... NLout, |
| 174 | URL @-> ... NLout, |
| 175 | Email @-> ... NLout, |
| 176 | File @-> ... NLout, |
Akron | 7198645 | 2021-11-09 01:36:30 +0100 | [diff] [blame] | 177 | Domain @-> ... NLout, |
Akron | b98e4cf | 2022-03-27 23:56:49 +0200 | [diff] [blame] | 178 | Emoticons @-> ... NLout |
Akron | e96895f | 2022-03-08 19:58:37 +0100 | [diff] [blame] | 179 | ]; |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 180 | |
| 181 | echo - Introduce Sentence splitter |
Akron | e96895f | 2022-03-08 19:58:37 +0100 | [diff] [blame] | 182 | ! And compose Whitespace ignorance |
Akron | ece3f01 | 2022-03-09 19:12:15 +0100 | [diff] [blame] | 183 | |
| 184 | define DQuotes ["”"|%"|"»"|"«"]; |
Akron | 4222ac8 | 2022-03-11 01:06:21 +0100 | [diff] [blame] | 185 | define NotSmallCaps [? - a - b - c - d - e - f - g - h - i - j - k - l - m - n - o - p - q - r - s - t - u - v - w - x - y - z - ü - ö - ä]; |
Akron | ece3f01 | 2022-03-09 19:12:15 +0100 | [diff] [blame] | 186 | |
Akron | e96895f | 2022-03-08 19:58:37 +0100 | [diff] [blame] | 187 | read regex Token .o. [ |
Akron | 7aa1cbe | 2022-03-30 12:44:04 +0200 | [diff] [blame] | 188 | SP NLout [DQuotes (NLout ")") | ["›"|%‹|%’|"'"] ( NLout DQuotes (NLout ")") | NLout ")" ) | ")" ] (NLout SP) @-> ... NLout \/ _ NLout \%, |
Akron | e96895f | 2022-03-08 19:58:37 +0100 | [diff] [blame] | 189 | ] .o. [ |
Akron | f94b9ce | 2022-03-27 18:18:09 +0200 | [diff] [blame] | 190 | SP @-> ... NLout \/ NLout _ NLout [? - "”" - %" - "»" - "«" - "›" - %‹ - %’ - "'" - ")" - NLout] |
Akron | e96895f | 2022-03-08 19:58:37 +0100 | [diff] [blame] | 191 | ] .o. [ |
Akron | 4222ac8 | 2022-03-11 01:06:21 +0100 | [diff] [blame] | 192 | [%. %. %.] @-> ... NLout \/ _ NLout WS+ NotSmallCaps |
| 193 | ] .o. [ |
Akron | e96895f | 2022-03-08 19:58:37 +0100 | [diff] [blame] | 194 | [WS|NL]+ @-> 0 || [ .#. | NLout ] _ |
| 195 | ]; |
Akron | 310905f | 2021-08-11 13:49:50 +0200 | [diff] [blame] | 196 | |
Akron | a854faa | 2021-10-22 19:31:08 +0200 | [diff] [blame] | 197 | ! foma -e "source tokenizer.xfst" -q -s && cat text.txt | flookup tokenizer.fst -x -b |