@mailwoman/classifiers 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/out/AdjacencyClassifier.d.ts +16 -0
  2. package/out/AdjacencyClassifier.d.ts.map +1 -0
  3. package/out/AdjacencyClassifier.js +50 -0
  4. package/out/AdjacencyClassifier.js.map +1 -0
  5. package/out/AlphaNumericClassifier.d.ts +10 -0
  6. package/out/AlphaNumericClassifier.d.ts.map +1 -0
  7. package/out/AlphaNumericClassifier.js +23 -0
  8. package/out/AlphaNumericClassifier.js.map +1 -0
  9. package/out/CentralEuropeanStreetNameClassifier.d.ts +16 -0
  10. package/out/CentralEuropeanStreetNameClassifier.d.ts.map +1 -0
  11. package/out/CentralEuropeanStreetNameClassifier.js +36 -0
  12. package/out/CentralEuropeanStreetNameClassifier.js.map +1 -0
  13. package/out/ChainClassifier.d.ts +14 -0
  14. package/out/ChainClassifier.d.ts.map +1 -0
  15. package/out/ChainClassifier.js +25 -0
  16. package/out/ChainClassifier.js.map +1 -0
  17. package/out/CompoundLevelClassifier.d.ts +16 -0
  18. package/out/CompoundLevelClassifier.d.ts.map +1 -0
  19. package/out/CompoundLevelClassifier.js +58 -0
  20. package/out/CompoundLevelClassifier.js.map +1 -0
  21. package/out/CompoundStreetClassifier.d.ts +12 -0
  22. package/out/CompoundStreetClassifier.d.ts.map +1 -0
  23. package/out/CompoundStreetClassifier.js +50 -0
  24. package/out/CompoundStreetClassifier.js.map +1 -0
  25. package/out/CompoundUnitDesignatorClassifier.d.ts +16 -0
  26. package/out/CompoundUnitDesignatorClassifier.d.ts.map +1 -0
  27. package/out/CompoundUnitDesignatorClassifier.js +57 -0
  28. package/out/CompoundUnitDesignatorClassifier.js.map +1 -0
  29. package/out/DirectionalClassifier.d.ts +11 -0
  30. package/out/DirectionalClassifier.d.ts.map +1 -0
  31. package/out/DirectionalClassifier.js +31 -0
  32. package/out/DirectionalClassifier.js.map +1 -0
  33. package/out/GivenNameClassifier.d.ts +11 -0
  34. package/out/GivenNameClassifier.d.ts.map +1 -0
  35. package/out/GivenNameClassifier.js +32 -0
  36. package/out/GivenNameClassifier.js.map +1 -0
  37. package/out/HouseNumberClassifier.d.ts +15 -0
  38. package/out/HouseNumberClassifier.d.ts.map +1 -0
  39. package/out/HouseNumberClassifier.js +79 -0
  40. package/out/HouseNumberClassifier.js.map +1 -0
  41. package/out/IntersectionClassifier.d.ts +11 -0
  42. package/out/IntersectionClassifier.d.ts.map +1 -0
  43. package/out/IntersectionClassifier.js +33 -0
  44. package/out/IntersectionClassifier.js.map +1 -0
  45. package/out/LevelClassifier.d.ts +11 -0
  46. package/out/LevelClassifier.d.ts.map +1 -0
  47. package/out/LevelClassifier.js +28 -0
  48. package/out/LevelClassifier.js.map +1 -0
  49. package/out/LevelDesignatorClassifier.d.ts +11 -0
  50. package/out/LevelDesignatorClassifier.d.ts.map +1 -0
  51. package/out/LevelDesignatorClassifier.js +21 -0
  52. package/out/LevelDesignatorClassifier.js.map +1 -0
  53. package/out/MiddleInitialClassifier.d.ts +10 -0
  54. package/out/MiddleInitialClassifier.d.ts.map +1 -0
  55. package/out/MiddleInitialClassifier.js +18 -0
  56. package/out/MiddleInitialClassifier.js.map +1 -0
  57. package/out/OrdinalClassifier.d.ts +10 -0
  58. package/out/OrdinalClassifier.d.ts.map +1 -0
  59. package/out/OrdinalClassifier.js +23 -0
  60. package/out/OrdinalClassifier.js.map +1 -0
  61. package/out/PersonClassifier.d.ts +11 -0
  62. package/out/PersonClassifier.d.ts.map +1 -0
  63. package/out/PersonClassifier.js +30 -0
  64. package/out/PersonClassifier.js.map +1 -0
  65. package/out/PersonalSuffixClassifier.d.ts +11 -0
  66. package/out/PersonalSuffixClassifier.d.ts.map +1 -0
  67. package/out/PersonalSuffixClassifier.js +31 -0
  68. package/out/PersonalSuffixClassifier.js.map +1 -0
  69. package/out/PersonalTitleClassifier.d.ts +11 -0
  70. package/out/PersonalTitleClassifier.d.ts.map +1 -0
  71. package/out/PersonalTitleClassifier.js +32 -0
  72. package/out/PersonalTitleClassifier.js.map +1 -0
  73. package/out/PlaceClassifier.d.ts +11 -0
  74. package/out/PlaceClassifier.d.ts.map +1 -0
  75. package/out/PlaceClassifier.js +38 -0
  76. package/out/PlaceClassifier.js.map +1 -0
  77. package/out/PostcodeClassifier.d.ts +14 -0
  78. package/out/PostcodeClassifier.d.ts.map +1 -0
  79. package/out/PostcodeClassifier.js +62 -0
  80. package/out/PostcodeClassifier.js.map +1 -0
  81. package/out/RoadTypeClassifier.d.ts +11 -0
  82. package/out/RoadTypeClassifier.d.ts.map +1 -0
  83. package/out/RoadTypeClassifier.js +20 -0
  84. package/out/RoadTypeClassifier.js.map +1 -0
  85. package/out/StopWordClassifier.d.ts +14 -0
  86. package/out/StopWordClassifier.d.ts.map +1 -0
  87. package/out/StopWordClassifier.js +35 -0
  88. package/out/StopWordClassifier.js.map +1 -0
  89. package/out/StreetPrefixClassifier.d.ts +11 -0
  90. package/out/StreetPrefixClassifier.d.ts.map +1 -0
  91. package/out/StreetPrefixClassifier.js +40 -0
  92. package/out/StreetPrefixClassifier.js.map +1 -0
  93. package/out/StreetProperNameClassifier.d.ts +16 -0
  94. package/out/StreetProperNameClassifier.d.ts.map +1 -0
  95. package/out/StreetProperNameClassifier.js +32 -0
  96. package/out/StreetProperNameClassifier.js.map +1 -0
  97. package/out/StreetSuffixClassifier.d.ts +11 -0
  98. package/out/StreetSuffixClassifier.d.ts.map +1 -0
  99. package/out/StreetSuffixClassifier.js +50 -0
  100. package/out/StreetSuffixClassifier.js.map +1 -0
  101. package/out/SurnameClassifier.d.ts +11 -0
  102. package/out/SurnameClassifier.d.ts.map +1 -0
  103. package/out/SurnameClassifier.js +29 -0
  104. package/out/SurnameClassifier.js.map +1 -0
  105. package/out/TokenPositionClassifier.d.ts +20 -0
  106. package/out/TokenPositionClassifier.d.ts.map +1 -0
  107. package/out/TokenPositionClassifier.js +41 -0
  108. package/out/TokenPositionClassifier.js.map +1 -0
  109. package/out/ToponymClassifier.d.ts +11 -0
  110. package/out/ToponymClassifier.d.ts.map +1 -0
  111. package/out/ToponymClassifier.js +26 -0
  112. package/out/ToponymClassifier.js.map +1 -0
  113. package/out/UnitClassifier.d.ts +11 -0
  114. package/out/UnitClassifier.d.ts.map +1 -0
  115. package/out/UnitClassifier.js +43 -0
  116. package/out/UnitClassifier.js.map +1 -0
  117. package/out/UnitDesignatorClassifier.d.ts +11 -0
  118. package/out/UnitDesignatorClassifier.d.ts.map +1 -0
  119. package/out/UnitDesignatorClassifier.js +25 -0
  120. package/out/UnitDesignatorClassifier.js.map +1 -0
  121. package/out/WhosOnFirstClassifier.d.ts +16 -0
  122. package/out/WhosOnFirstClassifier.d.ts.map +1 -0
  123. package/out/WhosOnFirstClassifier.js +148 -0
  124. package/out/WhosOnFirstClassifier.js.map +1 -0
  125. package/out/adapter.d.ts +77 -0
  126. package/out/adapter.d.ts.map +1 -0
  127. package/out/adapter.js +125 -0
  128. package/out/adapter.js.map +1 -0
  129. package/out/composite/index.d.ts +12 -0
  130. package/out/composite/index.d.ts.map +1 -0
  131. package/out/composite/index.js +12 -0
  132. package/out/composite/index.js.map +1 -0
  133. package/out/composite/intersection.d.ts +10 -0
  134. package/out/composite/intersection.d.ts.map +1 -0
  135. package/out/composite/intersection.js +115 -0
  136. package/out/composite/intersection.js.map +1 -0
  137. package/out/composite/person.d.ts +10 -0
  138. package/out/composite/person.d.ts.map +1 -0
  139. package/out/composite/person.js +112 -0
  140. package/out/composite/person.js.map +1 -0
  141. package/out/composite/street.d.ts +10 -0
  142. package/out/composite/street.d.ts.map +1 -0
  143. package/out/composite/street.js +384 -0
  144. package/out/composite/street.js.map +1 -0
  145. package/out/composite/street_name.d.ts +10 -0
  146. package/out/composite/street_name.d.ts.map +1 -0
  147. package/out/composite/street_name.js +78 -0
  148. package/out/composite/street_name.js.map +1 -0
  149. package/out/composite/subdivision.d.ts +10 -0
  150. package/out/composite/subdivision.d.ts.map +1 -0
  151. package/out/composite/subdivision.js +29 -0
  152. package/out/composite/subdivision.js.map +1 -0
  153. package/out/composite/venue.d.ts +10 -0
  154. package/out/composite/venue.d.ts.map +1 -0
  155. package/out/composite/venue.js +213 -0
  156. package/out/composite/venue.js.map +1 -0
  157. package/out/index.d.ts +39 -0
  158. package/out/index.d.ts.map +1 -0
  159. package/out/index.js +39 -0
  160. package/out/index.js.map +1 -0
  161. package/package.json +29 -0
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { SectionClassifier, Span } from "@mailwoman/core";
7
+ /**
8
+ * An adjacency classifier is used to find three adjacent words in a section.
9
+ *
10
+ * The first word must be a house number, the second word must be a street, and the third word must
11
+ * be a street suffix.
12
+ */
13
+ export declare class AdjacencyClassifier extends SectionClassifier {
14
+ explore(section: Span): void;
15
+ }
16
+ //# sourceMappingURL=AdjacencyClassifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdjacencyClassifier.d.ts","sourceRoot":"","sources":["../AdjacencyClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAEzD;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,iBAAiB;IACzD,OAAO,CAAC,OAAO,EAAE,IAAI,GAAG,IAAI;CA6C5B"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { SectionClassifier, Span } from "@mailwoman/core";
7
+ /**
8
+ * An adjacency classifier is used to find three adjacent words in a section.
9
+ *
10
+ * The first word must be a house number, the second word must be a street, and the third word must
11
+ * be a street suffix.
12
+ */
13
+ export class AdjacencyClassifier extends SectionClassifier {
14
+ explore(section) {
15
+ Array.from(section.children).forEach((primaryChild, i, children) => {
16
+ // skip last two elements
17
+ if (i >= section.children.size - 2)
18
+ return;
19
+ const secondaryChild = children[i + 1];
20
+ const tertiaryChild = children[i + 2];
21
+ const primaryChildHasHouseNumber = primaryChild.is("house_number");
22
+ const secondaryChildHasStreet = secondaryChild.is("street");
23
+ const secondaryChildPhraseHasStreet = SectionClassifier.findPhrasesContaining(section, secondaryChild).some((p) => {
24
+ return p.is("street");
25
+ });
26
+ const tertiaryChildHasStreetSuffix = tertiaryChild.is("street_suffix");
27
+ if (primaryChildHasHouseNumber &&
28
+ (secondaryChildHasStreet || secondaryChildPhraseHasStreet) &&
29
+ tertiaryChildHasStreetSuffix) {
30
+ // Every child must be part of the set above and must not omit any children.
31
+ const matches = Iterator.from(section.phrases).filter((phrase) => {
32
+ if (phrase.children.size !== 3)
33
+ return false;
34
+ const [primaryPhrase, secondPhrase, tertiaryPhrase] = phrase.children;
35
+ return (
36
+ // ---
37
+ primaryPhrase === primaryChild &&
38
+ // ---
39
+ secondPhrase === secondaryChild &&
40
+ // ---
41
+ tertiaryPhrase === tertiaryChild);
42
+ });
43
+ for (const match of matches) {
44
+ match.classifications.add("adjacent");
45
+ }
46
+ }
47
+ });
48
+ }
49
+ }
50
+ //# sourceMappingURL=AdjacencyClassifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdjacencyClassifier.js","sourceRoot":"","sources":["../AdjacencyClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAEzD;;;;;GAKG;AACH,MAAM,OAAO,mBAAoB,SAAQ,iBAAiB;IACzD,OAAO,CAAC,OAAa;QACpB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,CAAC,EAAE,QAAyB,EAAE,EAAE;YACnF,yBAAyB;YACzB,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;gBAAE,OAAM;YAE1C,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAE,CAAA;YACvC,MAAM,aAAa,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAE,CAAA;YAEtC,MAAM,0BAA0B,GAAG,YAAY,CAAC,EAAE,CAAC,cAAc,CAAC,CAAA;YAClE,MAAM,uBAAuB,GAAG,cAAc,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAA;YAC3D,MAAM,6BAA6B,GAAG,iBAAiB,CAAC,qBAAqB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,IAAI,CAC1G,CAAC,CAAC,EAAE,EAAE;gBACL,OAAO,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAA;YACtB,CAAC,CACD,CAAA;YAED,MAAM,4BAA4B,GAAG,aAAa,CAAC,EAAE,CAAC,eAAe,CAAC,CAAA;YAEtE,IACC,0BAA0B;gBAC1B,CAAC,uBAAuB,IAAI,6BAA6B,CAAC;gBAC1D,4BAA4B,EAC3B,CAAC;gBACF,4EAA4E;gBAC5E,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;oBAChE,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;wBAAE,OAAO,KAAK,CAAA;oBAE5C,MAAM,CAAC,aAAa,EAAE,YAAY,EAAE,cAAc,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAA;oBAErE,OAAO;oBACN,MAAM;oBACN,aAAa,KAAK,YAAY;wBAC9B,MAAM;wBACN,YAAY,KAAK,cAAc;wBAC/B,MAAM;wBACN,cAAc,KAAK,aAAa,CAChC,CAAA;gBACF,CAAC,CAAC,CAAA;gBAEF,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC7B,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBACtC,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAA;IACH,CAAC;CACD"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { Span, WordClassifier } from "@mailwoman/core";
7
+ export declare class AlphaNumericClassifier extends WordClassifier {
8
+ explore(span: Span): void;
9
+ }
10
+ //# sourceMappingURL=AlphaNumericClassifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlphaNumericClassifier.d.ts","sourceRoot":"","sources":["../AlphaNumericClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEtD,qBAAa,sBAAuB,SAAQ,cAAc;IAClD,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;CAWhC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { Span, WordClassifier } from "@mailwoman/core";
7
+ export class AlphaNumericClassifier extends WordClassifier {
8
+ explore(span) {
9
+ if (span.flags.has("numeric")) {
10
+ span.classifications.add("numeric");
11
+ }
12
+ else if (span.flags.has("numeral")) {
13
+ span.classifications.add("alphanumeric");
14
+ }
15
+ else if (span.flags.has("punctuation")) {
16
+ span.classifications.add("punctuation");
17
+ }
18
+ else {
19
+ span.classifications.add("alpha");
20
+ }
21
+ }
22
+ }
23
+ //# sourceMappingURL=AlphaNumericClassifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlphaNumericClassifier.js","sourceRoot":"","sources":["../AlphaNumericClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,OAAO,sBAAuB,SAAQ,cAAc;IAClD,OAAO,CAAC,IAAU;QACxB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACpC,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;QACzC,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QACxC,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAClC,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { SectionClassifier, Span } from "@mailwoman/core";
7
+ /**
8
+ * Classifies street names with no suffix or prefix when accompanied by a house number in the same
9
+ * section.
10
+ *
11
+ * @see {@link https://github.com/pelias/parser/issues/83 | Issue #83}
12
+ */
13
+ export declare class CentralEuropeanStreetNameClassifier extends SectionClassifier {
14
+ explore(section: Span): void;
15
+ }
16
+ //# sourceMappingURL=CentralEuropeanStreetNameClassifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CentralEuropeanStreetNameClassifier.d.ts","sourceRoot":"","sources":["../CentralEuropeanStreetNameClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAEzD;;;;;GAKG;AACH,qBAAa,mCAAoC,SAAQ,iBAAiB;IAClE,OAAO,CAAC,OAAO,EAAE,IAAI,GAAG,IAAI;CAsBnC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { SectionClassifier, Span } from "@mailwoman/core";
7
+ /**
8
+ * Classifies street names with no suffix or prefix when accompanied by a house number in the same
9
+ * section.
10
+ *
11
+ * @see {@link https://github.com/pelias/parser/issues/83 | Issue #83}
12
+ */
13
+ export class CentralEuropeanStreetNameClassifier extends SectionClassifier {
14
+ explore(section) {
15
+ const { first, last } = section.children;
16
+ // Does the section have at least two children?
17
+ if (!first || !last)
18
+ return;
19
+ // Is the first child a toponym, like a region or city?
20
+ if (first.is("toponym"))
21
+ return;
22
+ // Section doesn't end with a housenumber?
23
+ if (!last.is("house_number"))
24
+ return;
25
+ // Other elements cannot contain any public classifications.
26
+ if (first.classifications.hasVisibleClassification())
27
+ return;
28
+ // Assume the first token is a street name...
29
+ first.classifications.add({
30
+ classification: "street",
31
+ confidence: 0.5,
32
+ flags: new Set(["central_european_street_name"]),
33
+ });
34
+ }
35
+ }
36
+ //# sourceMappingURL=CentralEuropeanStreetNameClassifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CentralEuropeanStreetNameClassifier.js","sourceRoot":"","sources":["../CentralEuropeanStreetNameClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAEzD;;;;;GAKG;AACH,MAAM,OAAO,mCAAoC,SAAQ,iBAAiB;IAClE,OAAO,CAAC,OAAa;QAC3B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAA;QAExC,+CAA+C;QAC/C,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;YAAE,OAAM;QAE3B,uDAAuD;QACvD,IAAI,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC;YAAE,OAAM;QAE/B,0CAA0C;QAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC;YAAE,OAAM;QAEpC,4DAA4D;QAC5D,IAAI,KAAK,CAAC,eAAe,CAAC,wBAAwB,EAAE;YAAE,OAAM;QAE5D,6CAA6C;QAC7C,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC;YACzB,cAAc,EAAE,QAAQ;YACxB,UAAU,EAAE,GAAG;YACf,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,8BAA8B,CAAC,CAAC;SAChD,CAAC,CAAA;IACH,CAAC;CACD"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { PhraseClassifier, Span } from "@mailwoman/core";
7
+ /**
8
+ * Chain-restaurants and other franchises.
9
+ */
10
+ export declare class ChainClassifier extends PhraseClassifier {
11
+ ready(): Promise<this>;
12
+ explore(span: Span): void;
13
+ }
14
+ //# sourceMappingURL=ChainClassifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChainClassifier.d.ts","sourceRoot":"","sources":["../ChainClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAsB,MAAM,iBAAiB,CAAA;AAE5E;;GAEG;AACH,qBAAa,eAAgB,SAAQ,gBAAgB;IACvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;CAUhC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { PhraseClassifier, Span, prepareLocaleIndex } from "@mailwoman/core";
7
+ /**
8
+ * Chain-restaurants and other franchises.
9
+ */
10
+ export class ChainClassifier extends PhraseClassifier {
11
+ async ready() {
12
+ this.index = await prepareLocaleIndex(this.languages, "chains.txt");
13
+ return this;
14
+ }
15
+ explore(span) {
16
+ const languages = this.index.get(span.normalized);
17
+ if (languages) {
18
+ span.classifications.add({
19
+ classification: "chain",
20
+ languages,
21
+ });
22
+ }
23
+ }
24
+ }
25
+ //# sourceMappingURL=ChainClassifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChainClassifier.js","sourceRoot":"","sources":["../ChainClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAE5E;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,gBAAgB;IAC7C,KAAK,CAAC,KAAK;QACjB,IAAI,CAAC,KAAK,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;QAEnE,OAAO,IAAI,CAAA;IACZ,CAAC;IAEM,OAAO,CAAC,IAAU;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAEjD,IAAI,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;gBACxB,cAAc,EAAE,OAAO;gBACvB,SAAS;aACT,CAAC,CAAA;QACH,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { type Classifier, type ClassifierOptions, type LibPostalLanguageCode, LocaleIndex, Span, TokenContext } from "@mailwoman/core";
7
+ export declare class CompoundLevelClassifier implements Classifier {
8
+ index: LocaleIndex<LibPostalLanguageCode>;
9
+ protected languages?: LibPostalLanguageCode[];
10
+ constructor({ languages }?: ClassifierOptions);
11
+ ready(): Promise<this>;
12
+ classifyTokens(context: TokenContext): void;
13
+ classify(input: Span | string): Span;
14
+ explore(span: Span, section: Span): void;
15
+ }
16
+ //# sourceMappingURL=CompoundLevelClassifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompoundLevelClassifier.d.ts","sourceRoot":"","sources":["../CompoundLevelClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEN,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,WAAW,EAEX,IAAI,EACJ,YAAY,EACZ,MAAM,iBAAiB,CAAA;AAExB,qBAAa,uBAAwB,YAAW,UAAU;IAClD,KAAK,EAAG,WAAW,CAAC,qBAAqB,CAAC,CAAA;IACjD,SAAS,CAAC,SAAS,CAAC,EAAE,qBAAqB,EAAE,CAAA;gBAEjC,EAAE,SAAS,EAAE,GAAE,iBAAsB;IAIpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAU3C,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI;IAQpC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,IAAI;CAkC/C"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { Alpha2LanguageCode, LocaleIndex, prepareLocaleIndex, Span, TokenContext, } from "@mailwoman/core";
7
+ export class CompoundLevelClassifier {
8
+ index;
9
+ languages;
10
+ constructor({ languages } = {}) {
11
+ this.languages = languages ? Array.from(languages) : undefined;
12
+ }
13
+ async ready() {
14
+ const languages = this.languages ?? [Alpha2LanguageCode.English];
15
+ this.index = await prepareLocaleIndex(languages, "level_types_numbered.txt");
16
+ return this;
17
+ }
18
+ classifyTokens(context) {
19
+ for (let sectionIndex = 0; sectionIndex < context.sections.length; sectionIndex++) {
20
+ const { children } = context.sections[sectionIndex];
21
+ for (const child of children) {
22
+ this.explore(child, context.sections[sectionIndex]);
23
+ }
24
+ }
25
+ }
26
+ classify(input) {
27
+ const span = Span.from(input);
28
+ this.explore(span, span);
29
+ return span;
30
+ }
31
+ explore(span, section) {
32
+ if (!span.flags.has("alphanumeric"))
33
+ return;
34
+ // We a searching spans like `F12` which means `Floor 12`
35
+ for (const token of this.index.keys()) {
36
+ if (span.body.length < token.length)
37
+ continue;
38
+ if (span.normalized.substring(0, token.length) === token &&
39
+ /^\d+$/.test(span.normalized.substring(token.length))) {
40
+ const levelTypeBody = span.body.substring(0, token.length);
41
+ const levelBody = span.body.substring(token.length);
42
+ const levelType = Span.from(levelTypeBody, { start: span.start });
43
+ const level = Span.from(levelBody, { start: span.start + levelTypeBody.length });
44
+ // We are creating two spans `{level_type} {level}`
45
+ levelType.classifications.add("level_designator");
46
+ levelType.nextSiblings.add(level);
47
+ level.classifications.add("level");
48
+ level.previousSiblings.add(levelType);
49
+ span.previousSiblings.forEach((previousSibling) => levelType.previousSiblings.add(previousSibling));
50
+ span.nextSiblings.forEach((nextSibling) => level.nextSiblings.add(nextSibling));
51
+ section.children.add(levelType);
52
+ section.children.add(level);
53
+ return;
54
+ }
55
+ }
56
+ }
57
+ }
58
+ //# sourceMappingURL=CompoundLevelClassifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompoundLevelClassifier.js","sourceRoot":"","sources":["../CompoundLevelClassifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { type LibPostalLanguageCode, LocaleIndex, Span, WordClassifier } from "@mailwoman/core";
7
+ export declare class CompoundStreetClassifier extends WordClassifier {
8
+ suffixes: LocaleIndex<LibPostalLanguageCode>;
9
+ ready(): Promise<this>;
10
+ explore(span: Span): void;
11
+ }
12
+ //# sourceMappingURL=CompoundStreetClassifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompoundStreetClassifier.d.ts","sourceRoot":"","sources":["../CompoundStreetClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEN,KAAK,qBAAqB,EAC1B,WAAW,EAEX,IAAI,EACJ,cAAc,EACd,MAAM,iBAAiB,CAAA;AAExB,qBAAa,wBAAyB,SAAQ,cAAc;IACpD,QAAQ,EAAG,WAAW,CAAC,qBAAqB,CAAC,CAAA;IAE9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgCrB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;CAqBhC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { Alpha2LanguageCode, LocaleIndex, prepareLocaleIndex, Span, WordClassifier, } from "@mailwoman/core";
7
+ export class CompoundStreetClassifier extends WordClassifier {
8
+ suffixes;
9
+ async ready() {
10
+ const [separable, inseparable] = await Promise.all([
11
+ prepareLocaleIndex([
12
+ Alpha2LanguageCode.German,
13
+ Alpha2LanguageCode.Dutch,
14
+ Alpha2LanguageCode.Swedish,
15
+ Alpha2LanguageCode.NorwegianBokmål,
16
+ ], "concatenated_suffixes_separable.txt", {
17
+ // Removes suffixes such as 'r.' which can be ambiguous
18
+ minLength: 3,
19
+ }),
20
+ prepareLocaleIndex([Alpha2LanguageCode.German, Alpha2LanguageCode.Dutch, Alpha2LanguageCode.NorwegianBokmål], "concatenated_suffixes_inseparable.txt", {
21
+ // Removes suffixes such as 'r.' which can be ambiguous
22
+ minLength: 3,
23
+ }),
24
+ ]);
25
+ this.suffixes = new LocaleIndex([...separable, ...inseparable], {
26
+ displayName: "libpostal",
27
+ });
28
+ return this;
29
+ }
30
+ explore(span) {
31
+ if (span.flags.has("numeral"))
32
+ return;
33
+ // else use a slower suffix check which is O(n)
34
+ // this allows us to match Germanic compound words such as:
35
+ // 'Grolmanstraße' which end with the dictionary term '-straße'
36
+ for (const [token, languages] of this.suffixes) {
37
+ const offset = span.body.length - token.length;
38
+ if (offset < 1)
39
+ continue;
40
+ if (span.normalized.substring(offset) === token) {
41
+ span.classifications.add({
42
+ classification: "street",
43
+ languages,
44
+ });
45
+ return;
46
+ }
47
+ }
48
+ }
49
+ }
50
+ //# sourceMappingURL=CompoundStreetClassifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompoundStreetClassifier.js","sourceRoot":"","sources":["../CompoundStreetClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACN,kBAAkB,EAElB,WAAW,EACX,kBAAkB,EAClB,IAAI,EACJ,cAAc,GACd,MAAM,iBAAiB,CAAA;AAExB,MAAM,OAAO,wBAAyB,SAAQ,cAAc;IACpD,QAAQ,CAAqC;IAEpD,KAAK,CAAC,KAAK;QACV,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAClD,kBAAkB,CACjB;gBACC,kBAAkB,CAAC,MAAM;gBACzB,kBAAkB,CAAC,KAAK;gBACxB,kBAAkB,CAAC,OAAO;gBAC1B,kBAAkB,CAAC,eAAe;aAClC,EACD,qCAAqC,EACrC;gBACC,uDAAuD;gBACvD,SAAS,EAAE,CAAC;aACZ,CACD;YACD,kBAAkB,CACjB,CAAC,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,CAAC,eAAe,CAAC,EACzF,uCAAuC,EACvC;gBACC,uDAAuD;gBACvD,SAAS,EAAE,CAAC;aACZ,CACD;SACD,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,GAAG,IAAI,WAAW,CAAwB,CAAC,GAAG,SAAS,EAAE,GAAG,WAAW,CAAC,EAAE;YACtF,WAAW,EAAE,WAAW;SACxB,CAAC,CAAA;QAEF,OAAO,IAAI,CAAA;IACZ,CAAC;IAEM,OAAO,CAAC,IAAU;QACxB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAM;QAErC,+CAA+C;QAC/C,2DAA2D;QAC3D,+DAA+D;QAC/D,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;YAE9C,IAAI,MAAM,GAAG,CAAC;gBAAE,SAAQ;YAExB,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC;gBACjD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;oBACxB,cAAc,EAAE,QAAQ;oBACxB,SAAS;iBACT,CAAC,CAAA;gBAEF,OAAM;YACP,CAAC;QACF,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { type Classifier, type ClassifierOptions, type LibPostalLanguageCode, LocaleIndex, Span, TokenContext } from "@mailwoman/core";
7
+ export declare class CompoundUnitDesignatorClassifier implements Classifier {
8
+ index: LocaleIndex<LibPostalLanguageCode>;
9
+ protected languages?: LibPostalLanguageCode[];
10
+ constructor({ languages }?: ClassifierOptions);
11
+ ready(): Promise<this>;
12
+ classifyTokens(context: TokenContext): void;
13
+ classify(input: Span | string): Span;
14
+ explore(span: Span, section: Span): void;
15
+ }
16
+ //# sourceMappingURL=CompoundUnitDesignatorClassifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompoundUnitDesignatorClassifier.d.ts","sourceRoot":"","sources":["../CompoundUnitDesignatorClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEN,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,WAAW,EAEX,IAAI,EACJ,YAAY,EACZ,MAAM,iBAAiB,CAAA;AAExB,qBAAa,gCAAiC,YAAW,UAAU;IAC3D,KAAK,EAAG,WAAW,CAAC,qBAAqB,CAAC,CAAA;IACjD,SAAS,CAAC,SAAS,CAAC,EAAE,qBAAqB,EAAE,CAAA;gBAEjC,EAAE,SAAS,EAAE,GAAE,iBAAsB;IAIpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAQ3C,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI;IAQpC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,IAAI;CAkC/C"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { Alpha2LanguageCode, LocaleIndex, prepareLocaleIndex, Span, TokenContext, } from "@mailwoman/core";
7
+ export class CompoundUnitDesignatorClassifier {
8
+ index;
9
+ languages;
10
+ constructor({ languages } = {}) {
11
+ this.languages = languages ? Array.from(languages) : undefined;
12
+ }
13
+ async ready() {
14
+ const languages = this.languages ?? [Alpha2LanguageCode.English];
15
+ this.index = await prepareLocaleIndex(languages, "unit_types_numbered.txt");
16
+ return this;
17
+ }
18
+ classifyTokens(context) {
19
+ for (const section of context.sections) {
20
+ for (const child of section.children) {
21
+ this.explore(child, section);
22
+ }
23
+ }
24
+ }
25
+ classify(input) {
26
+ const span = Span.from(input);
27
+ this.explore(span, span);
28
+ return span;
29
+ }
30
+ explore(span, section) {
31
+ if (!span.flags.has("alphanumeric"))
32
+ return;
33
+ // We a searching spans like `U12` which means `Unit 12`
34
+ for (const token of this.index.keys()) {
35
+ if (span.body.length < token.length)
36
+ continue;
37
+ if (span.normalized.substring(0, token.length) === token &&
38
+ /^\d+$/.test(span.normalized.substring(token.length))) {
39
+ const unitTypeBody = span.body.substring(0, token.length);
40
+ const unitBody = span.body.substring(token.length);
41
+ const unitType = Span.from(unitTypeBody, { start: span.start });
42
+ const unit = Span.from(unitBody, { start: span.start + unitTypeBody.length });
43
+ // We are creating two spans `{unit_type} {unit}`
44
+ unitType.classifications.add("unit_designator");
45
+ unitType.nextSiblings.add(unit);
46
+ unit.classifications.add("unit");
47
+ unit.previousSiblings.add(unitType);
48
+ span.previousSiblings.forEach((prev) => unitType.previousSiblings.add(prev));
49
+ span.nextSiblings.forEach((next) => unit.nextSiblings.add(next));
50
+ section.children.add(unitType);
51
+ section.children.add(unit);
52
+ return;
53
+ }
54
+ }
55
+ }
56
+ }
57
+ //# sourceMappingURL=CompoundUnitDesignatorClassifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompoundUnitDesignatorClassifier.js","sourceRoot":"","sources":["../CompoundUnitDesignatorClassifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { Span, WordClassifier } from "@mailwoman/core";
7
+ export declare class DirectionalClassifier extends WordClassifier {
8
+ ready(): Promise<this>;
9
+ explore(span: Span): void;
10
+ }
11
+ //# sourceMappingURL=DirectionalClassifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DirectionalClassifier.d.ts","sourceRoot":"","sources":["../DirectionalClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAsB,IAAI,EAAE,cAAc,EAAsB,MAAM,iBAAiB,CAAA;AAE9F,qBAAa,qBAAsB,SAAQ,cAAc;IAC3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5B,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;CAWhC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { Alpha2LanguageCode, Span, WordClassifier, prepareLocaleIndex } from "@mailwoman/core";
7
+ export class DirectionalClassifier extends WordClassifier {
8
+ async ready() {
9
+ this.index = await prepareLocaleIndex(this.languages || [
10
+ Alpha2LanguageCode.English,
11
+ Alpha2LanguageCode.Spanish,
12
+ Alpha2LanguageCode.German,
13
+ Alpha2LanguageCode.French,
14
+ Alpha2LanguageCode.Dutch,
15
+ Alpha2LanguageCode.NorwegianBokmål,
16
+ ], "directionals.txt");
17
+ return this;
18
+ }
19
+ explore(span) {
20
+ if (span.flags.has("numeral"))
21
+ return;
22
+ if (this.index.has(span.normalized)) {
23
+ span.classifications.add("directional");
24
+ // try again for abbreviations denoted by a period such as 'n.'
25
+ }
26
+ else if (span.normalized.slice(-1) === "." && this.index.has(span.normalized.slice(0, -1))) {
27
+ span.classifications.add("directional");
28
+ }
29
+ }
30
+ }
31
+ //# sourceMappingURL=DirectionalClassifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DirectionalClassifier.js","sourceRoot":"","sources":["../DirectionalClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAE9F,MAAM,OAAO,qBAAsB,SAAQ,cAAc;IACjD,KAAK,CAAC,KAAK;QACjB,IAAI,CAAC,KAAK,GAAG,MAAM,kBAAkB,CACpC,IAAI,CAAC,SAAS,IAAI;YACjB,kBAAkB,CAAC,OAAO;YAC1B,kBAAkB,CAAC,OAAO;YAC1B,kBAAkB,CAAC,MAAM;YACzB,kBAAkB,CAAC,MAAM;YACzB,kBAAkB,CAAC,KAAK;YACxB,kBAAkB,CAAC,eAAe;SAClC,EACD,kBAAkB,CAClB,CAAA;QAED,OAAO,IAAI,CAAA;IACZ,CAAC;IAEM,OAAO,CAAC,IAAU;QACxB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAM;QAErC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;YAEvC,+DAA+D;QAChE,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9F,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QACxC,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { PhraseClassifier, Span } from "@mailwoman/core";
7
+ export declare class GivenNameClassifier extends PhraseClassifier {
8
+ ready(): Promise<this>;
9
+ explore(span: Span): void;
10
+ }
11
+ //# sourceMappingURL=GivenNameClassifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GivenNameClassifier.d.ts","sourceRoot":"","sources":["../GivenNameClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAsB,IAAI,EAAkB,MAAM,iBAAiB,CAAA;AAE5F,qBAAa,mBAAoB,SAAQ,gBAAgB;IAC3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;CAiBhC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { PhraseClassifier, prepareLocaleIndex, Span, TextNormalizer } from "@mailwoman/core";
7
+ export class GivenNameClassifier extends PhraseClassifier {
8
+ async ready() {
9
+ this.index = await prepareLocaleIndex(this.languages ?? ["all"], "given_names.txt", new TextNormalizer({
10
+ lowercase: true,
11
+ // Omit short names.
12
+ minLength: 3,
13
+ }));
14
+ return this;
15
+ }
16
+ explore(span) {
17
+ if (span.flags.has("numeral"))
18
+ return;
19
+ const languages = this.index.get(span.normalized);
20
+ if (!languages)
21
+ return;
22
+ const firstChild = span.children.first || span;
23
+ const { previousSibling } = firstChild;
24
+ // if (previousSibling?.is("stop_word")) return
25
+ span.classifications.add({
26
+ classification: "given_name",
27
+ confidence: 1,
28
+ languages,
29
+ });
30
+ }
31
+ }
32
+ //# sourceMappingURL=GivenNameClassifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GivenNameClassifier.js","sourceRoot":"","sources":["../GivenNameClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAE5F,MAAM,OAAO,mBAAoB,SAAQ,gBAAgB;IACjD,KAAK,CAAC,KAAK;QACjB,IAAI,CAAC,KAAK,GAAG,MAAM,kBAAkB,CACpC,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,EACzB,iBAAiB,EACjB,IAAI,cAAc,CAAC;YAClB,SAAS,EAAE,IAAI;YACf,oBAAoB;YACpB,SAAS,EAAE,CAAC;SACZ,CAAC,CACF,CAAA;QAED,OAAO,IAAI,CAAA;IACZ,CAAC;IAEM,OAAO,CAAC,IAAU;QACxB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAM;QAErC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACjD,IAAI,CAAC,SAAS;YAAE,OAAM;QAEtB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAA;QAC9C,MAAM,EAAE,eAAe,EAAE,GAAG,UAAU,CAAA;QAEtC,+CAA+C;QAE/C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;YACxB,cAAc,EAAE,YAAY;YAC5B,UAAU,EAAE,CAAC;YACb,SAAS;SACT,CAAC,CAAA;IACH,CAAC;CACD"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { Span, WordClassifier } from "@mailwoman/core";
7
+ /**
8
+ * Flags for house number classifications, used to distinguish between different types of house
9
+ * numbers.
10
+ */
11
+ export type HouseNumberFlag = "alphanumeric" | "numeric" | "fractional" | "directional" | "separator" | "cyrillic";
12
+ export declare class HouseNumberClassifier extends WordClassifier {
13
+ explore(span: Span): void;
14
+ }
15
+ //# sourceMappingURL=HouseNumberClassifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HouseNumberClassifier.d.ts","sourceRoot":"","sources":["../HouseNumberClassifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAmBtD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,SAAS,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,CAAA;AAoClH,qBAAa,qBAAsB,SAAQ,cAAc;IACjD,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;CAoChC"}