Repository: joke2k/faker
Pull request #1650 (2022-05-04 04:51:50)

Add sq-AL automotive provider
Added automotive provider methods for sq-AL locale.


Patch:
diff --git a/.bumpversion.cfg b/.bumpversion.cfg
index a432bd77..feb3e645 100644
--- a/.bumpversion.cfg
+++ b/.bumpversion.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 13.7.0
+current_version = 13.10.0
 files = VERSION faker/__init__.py docs/conf.py
 commit = True
 tag = True
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ea72ec59..376054a4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,19 @@
 ## Changelog
 
+### [v13.10.0 - 2022-05-09](https://github.com/joke2k/faker/compare/v13.9.0...v13.10.0)
+
+* Improve `it_IT` ssn provider to match real building rules. Thanks @DamienPirsy.
+
+### [v13.9.0 - 2022-05-09](https://github.com/joke2k/faker/compare/v13.8.0...v13.9.0)
+
+* Add part-of-speech functionality for `en_US`. Thanks @e-panourgia.
+
+### [v13.8.0 - 2022-05-09](https://github.com/joke2k/faker/compare/v13.7.0...v13.8.0)
+
+* Add `fr-FR` datetime provider. Thanks @zerogonal.
+* Add `no-NO` datetime provider. Thanks @zerogonal.
+* Add `zh-CN` datetime provider. Thanks @zerogonal.
+
 ### [v13.7.0 - 2022-05-02](https://github.com/joke2k/faker/compare/v13.6.0...v13.7.0)
 
 * Add automotive provider for `fi_FI`,  `et_EE`, `lt_LT` and `vi_VN`. Thanks @zerogonal.
diff --git a/VERSION b/VERSION
index d6ef9982..c554e7e8 100644
--- a/VERSION
+++ b/VERSION
@@ -1,1 +1,1 @@
-13.7.0
+13.10.0
diff --git a/docs/conf.py b/docs/conf.py
index 8256ae92..67389479 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -51,9 +51,9 @@ copyright = "2014, Daniele Faraglia"
 # built documents.
 #
 # The short X.Y version.
-version = "13.7.0"
+version = "13.10.0"
 # The full version, including alpha/beta/rc tags.
-release = "13.7.0"
+release = "13.10.0"
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/faker/__init__.py b/faker/__init__.py
index 951f285f..51497e4f 100644
--- a/faker/__init__.py
+++ b/faker/__init__.py
@@ -2,6 +2,6 @@ from faker.factory import Factory
 from faker.generator import Generator
 from faker.proxy import Faker
 
-VERSION = "13.7.0"
+VERSION = "13.10.0"
 
 __all__ = ("Factory", "Generator", "Faker")
diff --git a/faker/providers/automotive/sq_AL/__init__.py b/faker/providers/automotive/sq_AL/__init__.py
new file mode 100644
index 00000000..d2c506fb
--- /dev/null
+++ b/faker/providers/automotive/sq_AL/__init__.py
@@ -0,0 +1,12 @@
+from .. import Provider as AutomotiveProvider
+
+
+class Provider(AutomotiveProvider):
+    """Implement automotive provider for ``sq_AL`` locale.
+
+    Source:
+
+    - https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Albania
+    """
+
+    license_formats = ("?? ###??",)
diff --git a/faker/providers/date_time/fr_FR/__init__.py b/faker/providers/date_time/fr_FR/__init__.py
index ca031e97..b7d25de3 100644
--- a/faker/providers/date_time/fr_FR/__init__.py
+++ b/faker/providers/date_time/fr_FR/__init__.py
@@ -2,33 +2,34 @@ from .. import Provider as DateTimeProvider
 
 
 class Provider(DateTimeProvider):
+    DAY_NAMES = {
+        "0": "dimanche",
+        "1": "lundi",
+        "2": "mardi",
+        "3": "mercredi",
+        "4": "jeudi",
+        "5": "vendredi",
+        "6": "samedi",
+    }
+    MONTH_NAMES = {
+        "01": "Janvier",
+        "02": "Février",
+        "03": "Mars",
+        "04": "Avril",
+        "05": "Mai",
+        "06": "Juin",
+        "07": "Juillet",
+        "08": "Août",
+        "09": "Septembre",
+        "10": "Octobre",
+        "11": "Novembre",
+        "12": "Décembre",
+    }
+
     def day_of_week(self) -> str:
         day = self.date("%w")
-        DAY_NAMES = {
-            "0": "Dimanche",
-            "1": "Lundi",
-            "2": "Mardi",
-            "3": "Mercredi",
-            "4": "Jeudi",
-            "5": "Vendredi",
-            "6": "Samedi",
-        }
-        return DAY_NAMES[day]
+        return self.DAY_NAMES[day]
 
     def month_name(self) -> str:
         month = self.month()
-        MONTH_NAMES = {
-            "01": "Janvier",
-            "02": "Février",
-            "03": "Mars",
-            "04": "Avril",
-            "05": "Mai",
-            "06": "Juin",
-            "07": "Juillet",
-            "08": "Août",
-            "09": "Septembre",
-            "10": "Octobre",
-            "11": "Novembre",
-            "12": "Décembre",
-        }
-        return MONTH_NAMES[month]
+        return self.MONTH_NAMES[month]
diff --git a/faker/providers/date_time/no_NO/__init__.py b/faker/providers/date_time/no_NO/__init__.py
new file mode 100644
index 00000000..ac367ee6
--- /dev/null
+++ b/faker/providers/date_time/no_NO/__init__.py
@@ -0,0 +1,35 @@
+from .. import Provider as DateTimeProvider
+
+
+class Provider(DateTimeProvider):
+    MONTH_NAMES = {
+        "01": "januar",
+        "02": "februar",
+        "03": "mars",
+        "04": "april",
+        "05": "mai",
+        "06": "juni",
+        "07": "juli",
+        "08": "august",
+        "09": "september",
+        "10": "oktober",
+        "11": "november",
+        "12": "desember",
+    }
+    DAY_NAMES = {
+        "0": "søndag",
+        "1": "mandag",
+        "2": "tirsdag",
+        "3": "onsdag",
+        "4": "torsdag",
+        "5": "fredag",
+        "6": "lørdag",
+    }
+
+    def day_of_week(self) -> str:
+        day = self.date("%w")
+        return self.DAY_NAMES[day]
+
+    def month_name(self) -> str:
+        month = self.month()
+        return self.MONTH_NAMES[month]
diff --git a/faker/providers/lorem/__init__.py b/faker/providers/lorem/__init__.py
index f9275a54..65217f4c 100644
--- a/faker/providers/lorem/__init__.py
+++ b/faker/providers/lorem/__init__.py
@@ -26,6 +26,7 @@ class Provider(BaseProvider):
     def words(
         self,
         nb: int = 3,
+        part_of_speech: str = None,
         ext_word_list: Optional[Sequence[str]] = None,
         unique: bool = False,
     ) -> List[str]:
@@ -40,6 +41,12 @@ class Provider(BaseProvider):
         without replacement. If ``unique`` is ``False``, |random_choices| is
         used instead, and the list returned may contain duplicates.
 
+        ``part_of_speech`` is a parameter that defines to what part of speech
+        the returned word belongs. If ``ext_word_list`` is not ``None``, then
+        ``part_of_speech`` is ignored. If the value of ``part_of_speech`` does
+        not correspond to an existent part of speech according to the set locale,
+        then an exception is raised.
+
         .. warning::
            Depending on the length of a locale provider's built-in word list or
            on the length of ``ext_word_list`` if provided, a large ``nb`` can
@@ -50,14 +57,23 @@ class Provider(BaseProvider):
         :sample: nb=5, ext_word_list=['abc', 'def', 'ghi', 'jkl']
         :sample: nb=4, ext_word_list=['abc', 'def', 'ghi', 'jkl'], unique=True
         """
-        word_list = ext_word_list if ext_word_list else self.word_list  # type: ignore[attr-defined]
+        if ext_word_list is not None:
+            word_list = ext_word_list
+        elif part_of_speech:
+            if part_of_speech not in self.parts_of_speech:  # type: ignore[attr-defined]
+                raise ValueError(f"{part_of_speech} is not recognized as a part of speech.")
+            else:
+                word_list = self.parts_of_speech[part_of_speech]  # type: ignore[attr-defined]
+        else:
+            word_list = self.word_list  # type: ignore[attr-defined]
+
         if unique:
             unique_samples = cast(List[str], self.random_sample(word_list, length=nb))
             return unique_samples
         samples = cast(List[str], self.random_choices(word_list, length=nb))
         return samples
 
-    def word(self, ext_word_list: Optional[Sequence[str]] = None) -> str:
+    def word(self, part_of_speech: str = None, ext_word_list: Optional[Sequence[str]] = None) -> str:
         """Generate a word.
 
         This method uses |words| under the hood with the ``nb`` argument set to
@@ -66,13 +82,10 @@ class Provider(BaseProvider):
         :sample:
         :sample: ext_word_list=['abc', 'def', 'ghi', 'jkl']
         """
-        return self.words(1, ext_word_list)[0]
+        return self.words(1, part_of_speech, ext_word_list)[0]
 
     def sentence(
-        self,
-        nb_words: int = 6,
-        variable_nb_words: bool = True,
-        ext_word_list: Optional[Sequence[str]] = None,
+        self, nb_words: int = 6, variable_nb_words: bool = True, ext_word_list: Optional[Sequence[str]] = None
     ) -> str:
         """Generate a sentence.
 
@@ -116,10 +129,7 @@ class Provider(BaseProvider):
         return [self.sentence(ext_word_list=ext_word_list) for _ in range(0, nb)]
 
     def paragraph(
-        self,
-        nb_sentences: int = 3,
-        variable_nb_sentences: bool = True,
-        ext_word_list: Optional[Sequence[str]] = None,
+        self, nb_sentences: int = 3, variable_nb_sentences: bool = True, ext_word_list: Optional[Sequence[str]] = None
     ) -> str:
         """Generate a paragraph.
 
@@ -145,12 +155,7 @@ class Provider(BaseProvider):
         if variable_nb_sentences:
             nb_sentences = self.randomize_nb_elements(nb_sentences, min=1)
 
-        para = self.word_connector.join(
-            self.sentences(
-                nb_sentences,
-                ext_word_list=ext_word_list,
-            )
-        )
+        para = self.word_connector.join(self.sentences(nb_sentences, ext_word_list=ext_word_list))
 
         return para
 
@@ -225,10 +230,7 @@ class Provider(BaseProvider):
         return "".join(text)
 
     def texts(
-        self,
-        nb_texts: int = 3,
-        max_nb_chars: int = 200,
-        ext_word_list: Optional[Sequence[str]] = None,
+        self, nb_texts: int = 3, max_nb_chars: int = 200, ext_word_list: Optional[Sequence[str]] = None
     ) -> List[str]:
         """Generate a list of text strings.
 
diff --git a/faker/providers/lorem/ar_AA/__init__.py b/faker/providers/lorem/ar_AA/__init__.py
index c8b60b12..f621d549 100644
--- a/faker/providers/lorem/ar_AA/__init__.py
+++ b/faker/providers/lorem/ar_AA/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -699,3 +701,5 @@ class Provider(LoremProvider):
         "٢٠٠٤",
         "٣٠",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/az_AZ/__init__.py b/faker/providers/lorem/az_AZ/__init__.py
index 690e9e64..c697d2c7 100644
--- a/faker/providers/lorem/az_AZ/__init__.py
+++ b/faker/providers/lorem/az_AZ/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -100,3 +102,5 @@ class Provider(LoremProvider):
         "cümlə",
         "böyük",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/bn_BD/__init__.py b/faker/providers/lorem/bn_BD/__init__.py
index f49df831..b84f60e1 100644
--- a/faker/providers/lorem/bn_BD/__init__.py
+++ b/faker/providers/lorem/bn_BD/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -231,3 +233,5 @@ class Provider(LoremProvider):
         "কোনও",
         "কিছু",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/cs_CZ/__init__.py b/faker/providers/lorem/cs_CZ/__init__.py
index 4356223a..ed61c000 100644
--- a/faker/providers/lorem/cs_CZ/__init__.py
+++ b/faker/providers/lorem/cs_CZ/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -1965,3 +1967,5 @@ class Provider(LoremProvider):
         "žák",
         "žít",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/da_DK/__init__.py b/faker/providers/lorem/da_DK/__init__.py
index a3c93ee8..132e62ae 100644
--- a/faker/providers/lorem/da_DK/__init__.py
+++ b/faker/providers/lorem/da_DK/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -1006,3 +1008,5 @@ class Provider(LoremProvider):
         "programmmere",
         "brygge",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/de_DE/__init__.py b/faker/providers/lorem/de_DE/__init__.py
index 95b22558..d30e9225 100644
--- a/faker/providers/lorem/de_DE/__init__.py
+++ b/faker/providers/lorem/de_DE/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -521,3 +523,5 @@ class Provider(LoremProvider):
         "über",
         "überall",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/el_GR/__init__.py b/faker/providers/lorem/el_GR/__init__.py
index 3a5bf778..403460af 100644
--- a/faker/providers/lorem/el_GR/__init__.py
+++ b/faker/providers/lorem/el_GR/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -389,3 +391,5 @@ class Provider(LoremProvider):
         "ύψος",
         "ώρα",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/en_PH/__init__.py b/faker/providers/lorem/en_PH/__init__.py
index f0fa7c42..ea64408e 100644
--- a/faker/providers/lorem/en_PH/__init__.py
+++ b/faker/providers/lorem/en_PH/__init__.py
@@ -24,7 +24,7 @@ class Provider(LoremProvider):
 
     def english_word(self) -> str:
         """Generate an English word."""
-        return self.word(self.english_word_list)
+        return self.word(ext_word_list=self.english_word_list)
 
     def english_words(self, nb: int = 3, unique: bool = False) -> List[str]:
         """Generate a list of English words.
@@ -32,7 +32,7 @@ class Provider(LoremProvider):
         :sample: nb=5
         :sample: nb=5, unique=True
         """
-        return self.words(nb, self.english_word_list, unique)
+        return self.words(nb=nb, ext_word_list=self.english_word_list, unique=unique)
 
     def english_sentence(self, nb_words: int = 6, variable_nb_words: bool = True) -> str:
         """Generate a sentence in English.
diff --git a/faker/providers/lorem/en_US/__init__.py b/faker/providers/lorem/en_US/__init__.py
index a0503609..aaa8455e 100644
--- a/faker/providers/lorem/en_US/__init__.py
+++ b/faker/providers/lorem/en_US/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -9,7 +11,11 @@ class Provider(LoremProvider):
 
     Sources:
 
+    - https://www.educall.com.tr/blog/post/500-most-common-english-verbs
     - http://www.ef.edu/english-resources/english-vocabulary/top-1000-words/
+    - https://www.talkenglish.com/vocabulary/top-1500-nouns.aspx
+    - https://www.talkenglish.com/vocabulary/top-250-adverbs.aspx
+    - https://www.talkenglish.com/vocabulary/top-500-adjectives.aspx
     """
 
     word_list = (
@@ -985,3 +991,2190 @@ class Provider(LoremProvider):
         "your",
         "yourself",
     )
+
+    parts_of_speech: Dict[str, tuple] = {
+        "verb": (
+            "be",
+            "have",
+            "do",
+            "say",
+            "get",
+            "make",
+            "go",
+            "see",
+            "know",
+            "take",
+            "think",
+            "come",
+            "give",
+            "look",
+            "use",
+            "find",
+            "want",
+            "tell",
+            "put",
+            "mean",
+            "become",
+            "leave",
+            "work",
+            "need",
+            "feel",
+            "seem",
+            "ask",
+            "show",
+            "try",
+            "call",
+            "keep",
+            "provide",
+            "hold",
+            "turn",
+            "follow",
+            "begin",
+            "bring",
+            "like",
+            "going",
+            "help",
+            "start",
+            "run",
+            "write",
+            "set",
+            "move",
+            "play",
+            "pay",
+            "hear",
+            "include",
+            "believe",
+            "allow",
+            "meet",
+            "lead",
+            "live",
+            "stand",
+            "happen",
+            "carry",
+            "talk",
+            "appear",
+            "produce",
+            "sit",
+            "offer",
+            "consider",
+            "expect",
+            "let",
+            "read",
+            "require",
+            "continue",
+            "lose",
+            "add",
+            "change",
+            "fall",
+            "remain",
+            "remember",
+            "buy",
+            "speak",
+            "stop",
+            "send",
+            "receive",
+            "decide",
+            "win",
+            "understand",
+            "describe",
+            "develop",
+            "agree",
+            "open",
+            "reach",
+            "build",
+            "involve",
+            "spend",
+            "return",
+            "draw",
+            "die",
+            "hope",
+            "create",
+            "walk",
+            "sell",
+            "wait",
+            "cause",
+            "pass",
+            "lie",
+            "accept",
+            "watch",
+            "raise",
+            "base",
+            "apply",
+            "break",
+            "explain",
+            "learn",
+            "increase",
+            "cover",
+            "grow",
+            "claim",
+            "report",
+            "support",
+            "cut",
+            "form",
+            "stay",
+            "contain",
+            "reduce",
+            "establish",
+            "join",
+            "wish",
+            "seek",
+            "choose",
+            "deal",
+            "face",
+            "fail",
+            "serve",
+            "end",
+            "kill",
+            "occur",
+            "drive",
+            "represent",
+            "rise",
+            "discuss",
+            "love",
+            "pick",
+            "place",
+            "argue",
+            "prove",
+            "wear",
+            "catch",
+            "enjoy",
+            "eat",
+            "introduce",
+            "enter",
+            "present",
+            "arrive",
+            "ensure",
+            "point",
+            "plan",
+            "pull",
+            "refer",
+            "act",
+            "relate",
+            "affect",
+            "close",
+            "identify",
+            "manage",
+            "thank",
+            "compare",
+            "announce",
+            "obtain",
+            "note",
+            "forget",
+            "indicate",
+            "wonder",
+            "maintain",
+            "publish",
+            "suffer",
+            "avoid",
+            "express",
+            "suppose",
+            "finish",
+            "determine",
+            "design",
+            "listen",
+            "save",
+            "tend",
+            "treat",
+            "control",
+            "share",
+            "remove",
+            "throw",
+            "visit",
+            "exist",
+            "force",
+            "reflect",
+            "admit",
+            "assume",
+            "smile",
+            "prepare",
+            "replace",
+            "fill",
+            "improve",
+            "mention",
+            "fight",
+            "intend",
+            "miss",
+            "discover",
+            "drop",
+            "hit",
+            "push",
+            "prevent",
+            "refuse",
+            "regard",
+            "lay",
+            "reveal",
+            "teach",
+            "answer",
+            "operate",
+            "state",
+            "depend",
+            "enable",
+            "record",
+            "check",
+            "complete",
+            "cost",
+            "sound",
+            "laugh",
+            "realise",
+            "extend",
+            "arise",
+            "notice",
+            "define",
+            "examine",
+            "fit",
+            "study",
+            "bear",
+            "hang",
+            "recognise",
+            "shake",
+            "sign",
+            "attend",
+            "fly",
+            "gain",
+            "result",
+            "travel",
+            "adopt",
+            "confirm",
+            "protect",
+            "demand",
+            "stare",
+            "imagine",
+            "attempt",
+            "beat",
+            "born",
+            "associate",
+            "care",
+            "marry",
+            "collect",
+            "voice",
+            "employ",
+            "issue",
+            "release",
+            "emerge",
+            "mind",
+            "aim",
+            "deny",
+            "mark",
+            "shoot",
+            "appoint",
+            "order",
+            "supply",
+            "drink",
+            "observe",
+            "reply",
+            "ignore",
+            "link",
+            "propose",
+            "ring",
+            "settle",
+            "strike",
+            "press",
+            "respond",
+            "arrange",
+            "survive",
+            "concentrate",
+            "lift",
+            "approach",
+            "cross",
+            "test",
+            "charge",
+            "experience",
+            "touch",
+            "acquire",
+            "commit",
+            "demonstrate",
+            "grant",
+            "prefer",
+            "repeat",
+            "sleep",
+            "threaten",
+            "feed",
+            "insist",
+            "launch",
+            "limit",
+            "promote",
+            "deliver",
+            "measure",
+            "own",
+            "retain",
+            "attract",
+            "belong",
+            "consist",
+            "contribute",
+            "hide",
+            "promise",
+            "reject",
+            "cry",
+            "impose",
+            "invite",
+            "sing",
+            "vary",
+            "warn",
+            "address",
+            "declare",
+            "destroy",
+            "worry",
+            "divide",
+            "head",
+            "name",
+            "stick",
+            "nod",
+            "recognize",
+            "train",
+            "attack",
+            "clear",
+            "combine",
+            "handle",
+            "influence",
+            "realize",
+            "recommend",
+            "shout",
+            "spread",
+            "undertake",
+            "account",
+            "select",
+            "climb",
+            "contact",
+            "recall",
+            "secure",
+            "step",
+            "transfer",
+            "welcome",
+            "conclude",
+            "disappear",
+            "display",
+            "dress",
+            "illustrate",
+            "imply",
+            "organise",
+            "direct",
+            "escape",
+            "generate",
+            "remind",
+            "advise",
+            "afford",
+            "earn",
+            "hand",
+            "inform",
+            "rely",
+            "succeed",
+            "approve",
+            "burn",
+            "fear",
+            "vote",
+            "conduct",
+            "cope",
+            "derive",
+            "elect",
+            "gather",
+            "jump",
+            "last",
+            "match",
+            "matter",
+            "persuade",
+            "ride",
+            "shut",
+            "blow",
+            "estimate",
+            "recover",
+            "score",
+            "slip",
+            "count",
+            "hate",
+            "attach",
+            "exercise",
+            "house",
+            "lean",
+            "roll",
+            "wash",
+            "accuse",
+            "bind",
+            "judge",
+            "rest",
+            "steal",
+            "comment",
+            "exclude",
+            "focus",
+            "hurt",
+            "stretch",
+            "withdraw",
+            "back",
+            "fix",
+            "justify",
+            "knock",
+            "pursue",
+            "switch",
+            "benefit",
+            "lack",
+            "list",
+            "occupy",
+            "permit",
+            "surround",
+            "abandon",
+            "blame",
+            "complain",
+            "connect",
+            "construct",
+            "dominate",
+            "engage",
+            "paint",
+            "quote",
+            "view",
+            "incorporate",
+            "interpret",
+            "proceed",
+            "search",
+            "separate",
+            "stress",
+            "alter",
+            "analyse",
+            "arrest",
+            "bother",
+            "defend",
+            "expand",
+            "implement",
+            "possess",
+            "review",
+            "suit",
+            "tie",
+            "assist",
+            "calculate",
+            "glance",
+            "mix",
+            "question",
+            "resolve",
+            "rule",
+            "suspect",
+            "wake",
+            "appeal",
+            "challenge",
+            "clean",
+            "damage",
+            "guess",
+            "reckon",
+            "restore",
+            "restrict",
+            "specify",
+            "constitute",
+            "convert",
+            "distinguish",
+            "submit",
+            "trust",
+            "urge",
+            "feature",
+            "land",
+            "locate",
+            "predict",
+            "preserve",
+            "solve",
+            "sort",
+            "struggle",
+            "cast",
+            "cook",
+            "dance",
+            "invest",
+            "lock",
+            "owe",
+            "pour",
+            "shift",
+            "kick",
+            "kiss",
+            "light",
+            "purchase",
+            "race",
+            "retire",
+        ),
+        "noun": (
+            "people",
+            "history",
+            "way",
+            "art",
+            "world",
+            "information",
+            "map",
+            "family",
+            "government",
+            "health",
+            "system",
+            "computer",
+            "meat",
+            "year",
+            "thanks",
+            "music",
+            "person",
+            "reading",
+            "method",
+            "data",
+            "food",
+            "understanding",
+            "theory",
+            "law",
+            "bird",
+            "literature",
+            "problem",
+            "software",
+            "control",
+            "knowledge",
+            "power",
+            "ability",
+            "economics",
+            "love",
+            "internet",
+            "television",
+            "science",
+            "library",
+            "nature",
+            "fact",
+            "product",
+            "idea",
+            "temperature",
+            "investment",
+            "area",
+            "society",
+            "activity",
+            "story",
+            "industry",
+            "media",
+            "thing",
+            "oven",
+            "community",
+            "definition",
+            "safety",
+            "quality",
+            "development",
+            "language",
+            "management",
+            "player",
+            "variety",
+            "video",
+            "week",
+            "security",
+            "country",
+            "exam",
+            "movie",
+            "organization",
+            "equipment",
+            "physics",
+            "analysis",
+            "policy",
+            "series",
+            "thought",
+            "basis",
+            "boyfriend",
+            "direction",
+            "strategy",
+            "technology",
+            "army",
+            "camera",
+            "freedom",
+            "paper",
+            "environment",
+            "child",
+            "instance",
+            "month",
+            "truth",
+            "marketing",
+            "university",
+            "writing",
+            "article",
+            "department",
+            "difference",
+            "goal",
+            "news",
+            "audience",
+            "fishing",
+            "growth",
+            "income",
+            "marriage",
+            "user",
+            "combination",
+            "failure",
+            "meaning",
+            "medicine",
+            "philosophy",
+            "teacher",
+            "communication",
+            "night",
+            "chemistry",
+            "disease",
+            "disk",
+            "energy",
+            "nation",
+            "road",
+            "role",
+            "soup",
+            "advertising",
+            "location",
+            "success",
+            "addition",
+            "apartment",
+            "education",
+            "math",
+            "moment",
+            "painting",
+            "politics",
+            "attention",
+            "decision",
+            "event",
+            "property",
+            "shopping",
+            "student",
+            "wood",
+            "competition",
+            "distribution",
+            "entertainment",
+            "office",
+            "population",
+            "president",
+            "unit",
+            "category",
+            "cigarette",
+            "context",
+            "introduction",
+            "opportunity",
+            "performance",
+            "driver",
+            "flight",
+            "length",
+            "magazine",
+            "newspaper",
+            "relationship",
+            "teaching",
+            "cell",
+            "dealer",
+            "finding",
+            "lake",
+            "member",
+            "message",
+            "phone",
+            "scene",
+            "appearance",
+            "association",
+            "concept",
+            "customer",
+            "death",
+            "discussion",
+            "housing",
+            "inflation",
+            "insurance",
+            "mood",
+            "woman",
+            "advice",
+            "blood",
+            "effort",
+            "expression",
+            "importance",
+            "opinion",
+            "payment",
+            "reality",
+            "responsibility",
+            "situation",
+            "skill",
+            "statement",
+            "wealth",
+            "application",
+            "city",
+            "county",
+            "depth",
+            "estate",
+            "foundation",
+            "grandmother",
+            "heart",
+            "perspective",
+            "photo",
+            "recipe",
+            "studio",
+            "topic",
+            "collection",
+            "depression",
+            "imagination",
+            "passion",
+            "percentage",
+            "resource",
+            "setting",
+            "ad",
+            "agency",
+            "college",
+            "connection",
+            "criticism",
+            "debt",
+            "description",
+            "memory",
+            "patience",
+            "secretary",
+            "solution",
+            "administration",
+            "aspect",
+            "attitude",
+            "director",
+            "personality",
+            "psychology",
+            "recommendation",
+            "response",
+            "selection",
+            "storage",
+            "version",
+            "alcohol",
+            "argument",
+            "complaint",
+            "contract",
+            "emphasis",
+            "highway",
+            "loss",
+            "membership",
+            "possession",
+            "preparation",
+            "steak",
+            "union",
+            "agreement",
+            "cancer",
+            "currency",
+            "employment",
+            "engineering",
+            "entry",
+            "interaction",
+            "mixture",
+            "preference",
+            "region",
+            "republic",
+            "tradition",
+            "virus",
+            "actor",
+            "classroom",
+            "delivery",
+            "device",
+            "difficulty",
+            "drama",
+            "election",
+            "engine",
+            "football",
+            "guidance",
+            "hotel",
+            "owner",
+            "priority",
+            "protection",
+            "suggestion",
+            "tension",
+            "variation",
+            "anxiety",
+            "atmosphere",
+            "awareness",
+            "bath",
+            "bread",
+            "candidate",
+            "climate",
+            "comparison",
+            "confusion",
+            "construction",
+            "elevator",
+            "emotion",
+            "employee",
+            "employer",
+            "guest",
+            "height",
+            "leadership",
+            "mall",
+            "manager",
+            "operation",
+            "recording",
+            "sample",
+            "transportation",
+            "charity",
+            "cousin",
+            "disaster",
+            "editor",
+            "efficiency",
+            "excitement",
+            "extent",
+            "feedback",
+            "guitar",
+            "homework",
+            "leader",
+            "mom",
+            "outcome",
+            "permission",
+            "presentation",
+            "promotion",
+            "reflection",
+            "refrigerator",
+            "resolution",
+            "revenue",
+            "session",
+            "singer",
+            "tennis",
+            "basket",
+            "bonus",
+            "cabinet",
+            "childhood",
+            "church",
+            "clothes",
+            "coffee",
+            "dinner",
+            "drawing",
+            "hair",
+            "hearing",
+            "initiative",
+            "judgment",
+            "lab",
+            "measurement",
+            "mode",
+            "mud",
+            "orange",
+            "poetry",
+            "police",
+            "possibility",
+            "procedure",
+            "queen",
+            "ratio",
+            "relation",
+            "restaurant",
+            "satisfaction",
+            "sector",
+            "signature",
+            "significance",
+            "song",
+            "tooth",
+            "town",
+            "vehicle",
+            "volume",
+            "wife",
+            "accident",
+            "airport",
+            "appointment",
+            "arrival",
+            "assumption",
+            "baseball",
+            "chapter",
+            "committee",
+            "conversation",
+            "database",
+            "enthusiasm",
+            "error",
+            "explanation",
+            "farmer",
+            "gate",
+            "girl",
+            "hall",
+            "historian",
+            "hospital",
+            "injury",
+            "instruction",
+            "maintenance",
+            "manufacturer",
+            "meal",
+            "perception",
+            "pie",
+            "poem",
+            "presence",
+            "proposal",
+            "reception",
+            "replacement",
+            "revolution",
+            "river",
+            "son",
+            "speech",
+            "tea",
+            "village",
+            "warning",
+            "winner",
+            "worker",
+            "writer",
+            "assistance",
+            "breath",
+            "buyer",
+            "chest",
+            "chocolate",
+            "conclusion",
+            "contribution",
+            "cookie",
+            "courage",
+            "desk",
+            "drawer",
+            "establishment",
+            "examination",
+            "garbage",
+            "grocery",
+            "honey",
+            "impression",
+            "improvement",
+            "independence",
+            "insect",
+            "inspection",
+            "inspector",
+            "king",
+            "ladder",
+            "menu",
+            "penalty",
+            "piano",
+            "potato",
+            "profession",
+            "professor",
+            "quantity",
+            "reaction",
+            "requirement",
+            "salad",
+            "sister",
+            "supermarket",
+            "tongue",
+            "weakness",
+            "wedding",
+            "affair",
+            "ambition",
+            "analyst",
+            "apple",
+            "assignment",
+            "assistant",
+            "bathroom",
+            "bedroom",
+            "beer",
+            "birthday",
+            "celebration",
+            "championship",
+            "cheek",
+            "client",
+            "consequence",
+            "departure",
+            "diamond",
+            "dirt",
+            "ear",
+            "fortune",
+            "friendship",
+            "funeral",
+            "gene",
+            "girlfriend",
+            "hat",
+            "indication",
+            "intention",
+            "lady",
+            "midnight",
+            "negotiation",
+            "obligation",
+            "passenger",
+            "pizza",
+            "platform",
+            "poet",
+            "pollution",
+            "recognition",
+            "reputation",
+            "shirt",
+            "sir",
+            "speaker",
+            "stranger",
+            "surgery",
+            "sympathy",
+            "tale",
+            "throat",
+            "trainer",
+            "uncle",
+            "youth",
+            "time",
+            "work",
+            "film",
+            "water",
+            "money",
+            "example",
+            "while",
+            "business",
+            "study",
+            "game",
+            "life",
+            "form",
+            "air",
+            "day",
+            "place",
+            "number",
+            "part",
+            "field",
+            "fish",
+            "back",
+            "process",
+            "heat",
+            "hand",
+            "experience",
+            "job",
+            "book",
+            "end",
+            "point",
+            "type",
+            "home",
+            "economy",
+            "value",
+            "body",
+            "market",
+            "guide",
+            "interest",
+            "state",
+            "radio",
+            "course",
+            "company",
+            "price",
+            "size",
+            "card",
+            "list",
+            "mind",
+            "trade",
+            "line",
+            "care",
+            "group",
+            "risk",
+            "word",
+            "fat",
+            "force",
+            "key",
+            "light",
+            "training",
+            "name",
+            "school",
+            "top",
+            "amount",
+            "level",
+            "order",
+            "practice",
+            "research",
+            "sense",
+            "service",
+            "piece",
+            "web",
+            "boss",
+            "sport",
+            "fun",
+            "house",
+            "page",
+            "term",
+            "test",
+            "answer",
+            "sound",
+            "focus",
+            "matter",
+            "kind",
+            "soil",
+            "board",
+            "oil",
+            "picture",
+            "access",
+            "garden",
+            "range",
+            "rate",
+            "reason",
+            "future",
+            "site",
+            "demand",
+            "exercise",
+            "image",
+            "case",
+            "cause",
+            "coast",
+            "action",
+            "age",
+            "bad",
+            "boat",
+            "record",
+            "result",
+            "section",
+            "building",
+            "mouse",
+            "cash",
+            "class",
+            "nothing",
+            "period",
+            "plan",
+            "store",
+            "tax",
+            "side",
+            "subject",
+            "space",
+            "rule",
+            "stock",
+            "weather",
+            "chance",
+            "figure",
+            "man",
+            "model",
+            "source",
+            "beginning",
+            "earth",
+            "program",
+            "chicken",
+            "design",
+            "feature",
+            "head",
+            "material",
+            "purpose",
+            "question",
+            "rock",
+            "salt",
+            "act",
+            "birth",
+            "car",
+            "dog",
+            "object",
+            "scale",
+            "sun",
+            "note",
+            "profit",
+            "rent",
+            "speed",
+            "style",
+            "war",
+            "bank",
+            "craft",
+            "half",
+            "inside",
+            "outside",
+            "standard",
+            "bus",
+            "exchange",
+            "eye",
+            "fire",
+            "position",
+            "pressure",
+            "stress",
+            "advantage",
+            "benefit",
+            "box",
+            "frame",
+            "issue",
+            "step",
+            "cycle",
+            "face",
+            "item",
+            "metal",
+            "paint",
+            "review",
+            "room",
+            "screen",
+            "structure",
+            "view",
+            "account",
+            "ball",
+            "discipline",
+            "medium",
+            "share",
+            "balance",
+            "bit",
+            "black",
+            "bottom",
+            "choice",
+            "gift",
+            "impact",
+            "machine",
+            "shape",
+            "tool",
+            "wind",
+            "address",
+            "average",
+            "career",
+            "culture",
+            "morning",
+            "pot",
+            "sign",
+            "table",
+            "task",
+            "condition",
+            "contact",
+            "credit",
+            "egg",
+            "hope",
+            "ice",
+            "network",
+            "north",
+            "square",
+            "attempt",
+            "date",
+            "effect",
+            "link",
+            "post",
+            "star",
+            "voice",
+            "capital",
+            "challenge",
+            "friend",
+            "self",
+            "shot",
+            "brush",
+            "couple",
+            "debate",
+            "exit",
+            "front",
+            "function",
+            "lack",
+            "living",
+            "plant",
+            "plastic",
+            "spot",
+            "summer",
+            "taste",
+            "theme",
+            "track",
+            "wing",
+            "brain",
+            "button",
+            "click",
+            "desire",
+            "foot",
+            "gas",
+            "influence",
+            "notice",
+            "rain",
+            "wall",
+            "base",
+            "damage",
+            "distance",
+            "feeling",
+            "pair",
+            "savings",
+            "staff",
+            "sugar",
+            "target",
+            "text",
+            "animal",
+            "author",
+            "budget",
+            "discount",
+            "file",
+            "ground",
+            "lesson",
+            "minute",
+            "officer",
+            "phase",
+            "reference",
+            "register",
+            "sky",
+            "stage",
+            "stick",
+            "title",
+            "trouble",
+            "bowl",
+            "bridge",
+            "campaign",
+            "character",
+            "club",
+            "edge",
+            "evidence",
+            "fan",
+            "letter",
+            "lock",
+            "maximum",
+            "novel",
+            "option",
+            "pack",
+            "park",
+            "plenty",
+            "quarter",
+            "skin",
+            "sort",
+            "weight",
+            "baby",
+            "background",
+            "carry",
+            "dish",
+            "factor",
+            "fruit",
+            "glass",
+            "joint",
+            "master",
+            "muscle",
+            "red",
+            "strength",
+            "traffic",
+            "trip",
+            "vegetable",
+            "appeal",
+            "chart",
+            "gear",
+            "ideal",
+            "kitchen",
+            "land",
+            "log",
+            "mother",
+            "net",
+            "party",
+            "principle",
+            "relative",
+            "sale",
+            "season",
+            "signal",
+            "spirit",
+            "street",
+            "tree",
+            "wave",
+            "belt",
+            "bench",
+            "commission",
+            "copy",
+            "drop",
+            "minimum",
+            "path",
+            "progress",
+            "project",
+            "sea",
+            "south",
+            "status",
+            "stuff",
+            "ticket",
+            "tour",
+            "angle",
+            "blue",
+            "breakfast",
+            "confidence",
+            "daughter",
+            "degree",
+            "doctor",
+            "dot",
+            "dream",
+            "duty",
+            "essay",
+            "father",
+            "fee",
+            "finance",
+            "hour",
+            "juice",
+            "limit",
+            "luck",
+            "milk",
+            "mouth",
+            "peace",
+            "pipe",
+            "seat",
+            "stable",
+            "storm",
+            "substance",
+            "team",
+            "trick",
+            "afternoon",
+            "bat",
+            "beach",
+            "blank",
+            "catch",
+            "chain",
+            "consideration",
+            "cream",
+            "crew",
+            "detail",
+            "gold",
+            "interview",
+            "kid",
+            "mark",
+            "match",
+            "mission",
+            "pain",
+            "pleasure",
+            "score",
+            "screw",
+            "sex",
+            "shop",
+            "shower",
+            "suit",
+            "tone",
+            "window",
+            "agent",
+            "band",
+            "block",
+            "bone",
+            "calendar",
+            "cap",
+            "coat",
+            "contest",
+            "corner",
+            "court",
+            "cup",
+            "district",
+            "door",
+            "east",
+            "finger",
+            "garage",
+            "guarantee",
+            "hole",
+            "hook",
+            "implement",
+            "layer",
+            "lecture",
+            "lie",
+            "manner",
+            "meeting",
+            "nose",
+            "parking",
+            "partner",
+            "profile",
+            "respect",
+            "rice",
+            "routine",
+            "schedule",
+            "swimming",
+            "telephone",
+            "tip",
+            "winter",
+            "airline",
+            "bag",
+            "battle",
+            "bed",
+            "bill",
+            "bother",
+            "cake",
+            "code",
+            "curve",
+            "designer",
+            "dimension",
+            "dress",
+            "ease",
+            "emergency",
+            "evening",
+            "extension",
+            "farm",
+            "fight",
+            "gap",
+            "grade",
+            "holiday",
+            "horror",
+            "horse",
+            "host",
+            "husband",
+            "loan",
+            "mistake",
+            "mountain",
+            "nail",
+            "noise",
+            "occasion",
+            "package",
+            "patient",
+            "pause",
+            "phrase",
+            "proof",
+            "race",
+            "relief",
+            "sand",
+            "sentence",
+            "shoulder",
+            "smoke",
+            "stomach",
+            "string",
+            "tourist",
+            "towel",
+            "vacation",
+            "west",
+            "wheel",
+            "wine",
+            "arm",
+            "aside",
+            "associate",
+            "bet",
+            "blow",
+            "border",
+            "branch",
+            "breast",
+            "brother",
+            "buddy",
+            "bunch",
+            "chip",
+            "coach",
+            "cross",
+            "document",
+            "draft",
+            "dust",
+            "expert",
+            "floor",
+            "god",
+            "golf",
+            "habit",
+            "iron",
+            "judge",
+            "knife",
+            "landscape",
+            "league",
+            "mail",
+            "mess",
+            "native",
+            "opening",
+            "parent",
+            "pattern",
+            "pin",
+            "pool",
+            "pound",
+            "request",
+            "salary",
+            "shame",
+            "shelter",
+            "shoe",
+            "silver",
+            "tackle",
+            "tank",
+            "trust",
+            "assist",
+            "bake",
+            "bar",
+            "bell",
+            "bike",
+            "blame",
+            "boy",
+            "brick",
+            "chair",
+            "closet",
+            "clue",
+            "collar",
+            "comment",
+            "conference",
+            "devil",
+            "diet",
+            "fear",
+            "fuel",
+            "glove",
+            "jacket",
+            "lunch",
+            "monitor",
+            "mortgage",
+            "nurse",
+            "pace",
+            "panic",
+            "peak",
+            "plane",
+            "reward",
+            "row",
+            "sandwich",
+            "shock",
+            "spite",
+            "spray",
+            "surprise",
+            "till",
+            "transition",
+            "weekend",
+            "welcome",
+            "yard",
+            "alarm",
+            "bend",
+            "bicycle",
+            "bite",
+            "blind",
+            "bottle",
+            "cable",
+            "candle",
+            "clerk",
+            "cloud",
+            "concert",
+            "counter",
+            "flower",
+            "grandfather",
+            "harm",
+            "knee",
+            "lawyer",
+            "leather",
+            "load",
+            "mirror",
+            "neck",
+            "pension",
+            "plate",
+            "purple",
+            "ruin",
+            "ship",
+            "skirt",
+            "slice",
+            "snow",
+            "specialist",
+            "stroke",
+            "switch",
+            "trash",
+            "tune",
+            "zone",
+            "anger",
+            "award",
+            "bid",
+            "bitter",
+            "boot",
+            "bug",
+            "camp",
+            "candy",
+            "carpet",
+            "cat",
+            "champion",
+            "channel",
+            "clock",
+            "comfort",
+            "cow",
+            "crack",
+            "engineer",
+            "entrance",
+            "fault",
+            "grass",
+            "guy",
+            "hell",
+            "highlight",
+            "incident",
+            "island",
+            "joke",
+            "jury",
+            "leg",
+            "lip",
+            "mate",
+            "motor",
+            "nerve",
+            "passage",
+            "pen",
+            "pride",
+            "priest",
+            "prize",
+            "promise",
+            "resident",
+            "resort",
+            "ring",
+            "roof",
+            "rope",
+            "sail",
+            "scheme",
+            "script",
+            "sock",
+            "station",
+            "toe",
+            "tower",
+            "truck",
+            "witness",
+        ),
+        "adverb": (
+            "not",
+            "also",
+            "very",
+            "often",
+            "however",
+            "too",
+            "usually",
+            "really",
+            "early",
+            "never",
+            "always",
+            "sometimes",
+            "together",
+            "likely",
+            "simply",
+            "generally",
+            "instead",
+            "actually",
+            "again",
+            "rather",
+            "almost",
+            "especially",
+            "ever",
+            "quickly",
+            "probably",
+            "already",
+            "below",
+            "directly",
+            "therefore",
+            "else",
+            "thus",
+            "easily",
+            "eventually",
+            "exactly",
+            "certainly",
+            "normally",
+            "currently",
+            "extremely",
+            "finally",
+            "constantly",
+            "properly",
+            "soon",
+            "specifically",
+            "ahead",
+            "daily",
+            "highly",
+            "immediately",
+            "relatively",
+            "slowly",
+            "fairly",
+            "primarily",
+            "completely",
+            "ultimately",
+            "widely",
+            "recently",
+            "seriously",
+            "frequently",
+            "fully",
+            "mostly",
+            "naturally",
+            "nearly",
+            "occasionally",
+            "carefully",
+            "clearly",
+            "essentially",
+            "possibly",
+            "slightly",
+            "somewhat",
+            "equally",
+            "greatly",
+            "necessarily",
+            "personally",
+            "rarely",
+            "regularly",
+            "similarly",
+            "basically",
+            "closely",
+            "effectively",
+            "initially",
+            "literally",
+            "mainly",
+            "merely",
+            "gently",
+            "hopefully",
+            "originally",
+            "roughly",
+            "significantly",
+            "totally",
+            "twice",
+            "elsewhere",
+            "everywhere",
+            "obviously",
+            "perfectly",
+            "physically",
+            "successfully",
+            "suddenly",
+            "truly",
+            "virtually",
+            "altogether",
+            "anyway",
+            "automatically",
+            "deeply",
+            "definitely",
+            "deliberately",
+            "hardly",
+            "readily",
+            "terribly",
+            "unfortunately",
+            "forth",
+            "briefly",
+            "moreover",
+            "strongly",
+            "honestly",
+            "previously",
+            "as",
+            "there",
+            "when",
+            "how",
+            "so",
+            "up",
+            "out",
+            "only",
+            "well",
+            "then",
+            "first",
+            "where",
+            "why",
+            "now",
+            "around",
+            "once",
+            "down",
+            "off",
+            "here",
+            "tonight",
+            "away",
+            "today",
+            "far",
+            "quite",
+            "later",
+            "above",
+            "yet",
+            "maybe",
+            "otherwise",
+            "near",
+            "forward",
+            "somewhere",
+            "anywhere",
+            "please",
+            "forever",
+            "somehow",
+            "absolutely",
+            "abroad",
+            "yeah",
+            "nowhere",
+            "tomorrow",
+            "yesterday",
+        ),
+        "adjective": (
+            "different",
+            "used",
+            "important",
+            "every",
+            "large",
+            "available",
+            "popular",
+            "able",
+            "basic",
+            "known",
+            "various",
+            "difficult",
+            "several",
+            "united",
+            "historical",
+            "hot",
+            "useful",
+            "mental",
+            "scared",
+            "additional",
+            "emotional",
+            "old",
+            "political",
+            "similar",
+            "healthy",
+            "financial",
+            "medical",
+            "traditional",
+            "federal",
+            "entire",
+            "strong",
+            "actual",
+            "significant",
+            "successful",
+            "electrical",
+            "expensive",
+            "pregnant",
+            "intelligent",
+            "interesting",
+            "poor",
+            "happy",
+            "responsible",
+            "cute",
+            "helpful",
+            "recent",
+            "willing",
+            "nice",
+            "wonderful",
+            "impossible",
+            "serious",
+            "huge",
+            "rare",
+            "technical",
+            "typical",
+            "competitive",
+            "critical",
+            "electronic",
+            "immediate",
+            "aware",
+            "educational",
+            "environmental",
+            "global",
+            "legal",
+            "relevant",
+            "accurate",
+            "capable",
+            "dangerous",
+            "dramatic",
+            "efficient",
+            "powerful",
+            "foreign",
+            "hungry",
+            "practical",
+            "psychological",
+            "severe",
+            "suitable",
+            "numerous",
+            "sufficient",
+            "unusual",
+            "consistent",
+            "cultural",
+            "existing",
+            "famous",
+            "pure",
+            "afraid",
+            "obvious",
+            "careful",
+            "latter",
+            "unhappy",
+            "acceptable",
+            "aggressive",
+            "boring",
+            "distinct",
+            "eastern",
+            "logical",
+            "reasonable",
+            "strict",
+            "administrative",
+            "automatic",
+            "civil",
+            "former",
+            "massive",
+            "southern",
+            "unfair",
+            "visible",
+            "alive",
+            "angry",
+            "desperate",
+            "exciting",
+            "friendly",
+            "lucky",
+            "realistic",
+            "sorry",
+            "ugly",
+            "unlikely",
+            "anxious",
+            "comprehensive",
+            "curious",
+            "impressive",
+            "informal",
+            "inner",
+            "pleasant",
+            "sexual",
+            "sudden",
+            "terrible",
+            "unable",
+            "weak",
+            "wooden",
+            "asleep",
+            "confident",
+            "conscious",
+            "decent",
+            "embarrassed",
+            "guilty",
+            "lonely",
+            "mad",
+            "nervous",
+            "odd",
+            "remarkable",
+            "substantial",
+            "suspicious",
+            "tall",
+            "tiny",
+            "more",
+            "some",
+            "all",
+            "many",
+            "most",
+            "other",
+            "such",
+            "even",
+            "new",
+            "just",
+            "good",
+            "any",
+            "each",
+            "much",
+            "own",
+            "great",
+            "another",
+            "same",
+            "few",
+            "free",
+            "right",
+            "still",
+            "best",
+            "public",
+            "human",
+            "both",
+            "local",
+            "sure",
+            "better",
+            "general",
+            "specific",
+            "enough",
+            "long",
+            "small",
+            "less",
+            "high",
+            "certain",
+            "little",
+            "common",
+            "next",
+            "simple",
+            "hard",
+            "past",
+            "big",
+            "possible",
+            "particular",
+            "real",
+            "major",
+            "personal",
+            "current",
+            "left",
+            "national",
+            "least",
+            "natural",
+            "physical",
+            "short",
+            "last",
+            "single",
+            "individual",
+            "main",
+            "potential",
+            "professional",
+            "international",
+            "lower",
+            "open",
+            "according",
+            "alternative",
+            "special",
+            "working",
+            "true",
+            "whole",
+            "clear",
+            "dry",
+            "easy",
+            "cold",
+            "commercial",
+            "full",
+            "low",
+            "primary",
+            "worth",
+            "necessary",
+            "positive",
+            "present",
+            "close",
+            "creative",
+            "green",
+            "late",
+            "fit",
+            "glad",
+            "proper",
+            "complex",
+            "content",
+            "due",
+            "effective",
+            "middle",
+            "regular",
+            "fast",
+            "independent",
+            "original",
+            "wide",
+            "beautiful",
+            "complete",
+            "active",
+            "negative",
+            "safe",
+            "visual",
+            "wrong",
+            "ago",
+            "quick",
+            "ready",
+            "straight",
+            "white",
+            "direct",
+            "excellent",
+            "extra",
+            "junior",
+            "pretty",
+            "unique",
+            "classic",
+            "final",
+            "overall",
+            "private",
+            "separate",
+            "western",
+            "alone",
+            "familiar",
+            "official",
+            "perfect",
+            "bright",
+            "broad",
+            "comfortable",
+            "flat",
+            "rich",
+            "warm",
+            "young",
+            "heavy",
+            "valuable",
+            "correct",
+            "leading",
+            "slow",
+            "clean",
+            "fresh",
+            "normal",
+            "secret",
+            "tough",
+            "brown",
+            "cheap",
+            "deep",
+            "objective",
+            "secure",
+            "thin",
+            "chemical",
+            "cool",
+            "extreme",
+            "exact",
+            "fair",
+            "fine",
+            "formal",
+            "opposite",
+            "remote",
+            "total",
+            "vast",
+            "lost",
+            "smooth",
+            "dark",
+            "double",
+            "equal",
+            "firm",
+            "frequent",
+            "internal",
+            "sensitive",
+            "constant",
+            "minor",
+            "previous",
+            "raw",
+            "soft",
+            "solid",
+            "weird",
+            "amazing",
+            "annual",
+            "busy",
+            "dead",
+            "false",
+            "round",
+            "sharp",
+            "thick",
+            "wise",
+            "equivalent",
+            "initial",
+            "narrow",
+            "nearby",
+            "proud",
+            "spiritual",
+            "wild",
+            "adult",
+            "apart",
+            "brief",
+            "crazy",
+            "prior",
+            "rough",
+            "sad",
+            "sick",
+            "strange",
+            "external",
+            "illegal",
+            "loud",
+            "mobile",
+            "nasty",
+            "ordinary",
+            "royal",
+            "senior",
+            "super",
+            "tight",
+            "upper",
+            "yellow",
+            "dependent",
+            "funny",
+            "gross",
+            "ill",
+            "spare",
+            "sweet",
+            "upstairs",
+            "usual",
+            "brave",
+            "calm",
+            "dirty",
+            "downtown",
+            "grand",
+            "honest",
+            "loose",
+            "male",
+            "quiet",
+            "brilliant",
+            "dear",
+            "drunk",
+            "empty",
+            "female",
+            "inevitable",
+            "neat",
+            "ok",
+            "representative",
+            "silly",
+            "slight",
+            "smart",
+            "stupid",
+            "temporary",
+            "weekly",
+        ),
+    }
diff --git a/faker/providers/lorem/fa_IR/__init__.py b/faker/providers/lorem/fa_IR/__init__.py
index f848d1d8..a2e21604 100644
--- a/faker/providers/lorem/fa_IR/__init__.py
+++ b/faker/providers/lorem/fa_IR/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -923,3 +925,5 @@ class Provider(LoremProvider):
         "ادعا",
         "قاره",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/fil_PH/__init__.py b/faker/providers/lorem/fil_PH/__init__.py
index af6dc62d..9cffd0f1 100644
--- a/faker/providers/lorem/fil_PH/__init__.py
+++ b/faker/providers/lorem/fil_PH/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -633,3 +635,5 @@ class Provider(LoremProvider):
         "yaman",
         "yelo",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/fr_FR/__init__.py b/faker/providers/lorem/fr_FR/__init__.py
index d8dfba54..979643e0 100644
--- a/faker/providers/lorem/fr_FR/__init__.py
+++ b/faker/providers/lorem/fr_FR/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -1476,3 +1478,5 @@ class Provider(LoremProvider):
         "y",
         "yeux",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/he_IL/__init__.py b/faker/providers/lorem/he_IL/__init__.py
index c4c1e0c7..41407d50 100644
--- a/faker/providers/lorem/he_IL/__init__.py
+++ b/faker/providers/lorem/he_IL/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -150,3 +152,5 @@ class Provider(LoremProvider):
         "תצטריק",
         "תרבנך",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/hy_AM/__init__.py b/faker/providers/lorem/hy_AM/__init__.py
index f70ef76b..fa9b33d3 100644
--- a/faker/providers/lorem/hy_AM/__init__.py
+++ b/faker/providers/lorem/hy_AM/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -224,3 +226,5 @@ class Provider(LoremProvider):
         "հեռու",
         "աջ",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/ja_JP/__init__.py b/faker/providers/lorem/ja_JP/__init__.py
index c3cc7e36..d9b1c45d 100644
--- a/faker/providers/lorem/ja_JP/__init__.py
+++ b/faker/providers/lorem/ja_JP/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -227,3 +229,5 @@ class Provider(LoremProvider):
         "じぶんの",
         "鉱山",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/la/__init__.py b/faker/providers/lorem/la/__init__.py
index 8257077a..faeab6bf 100644
--- a/faker/providers/lorem/la/__init__.py
+++ b/faker/providers/lorem/la/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -188,3 +190,5 @@ class Provider(LoremProvider):
         "voluptatibus",
         "voluptatum",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/pl_PL/__init__.py b/faker/providers/lorem/pl_PL/__init__.py
index d70218bb..ed7a993b 100644
--- a/faker/providers/lorem/pl_PL/__init__.py
+++ b/faker/providers/lorem/pl_PL/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -2009,3 +2011,5 @@ class Provider(LoremProvider):
         "ustawa",
         "rolnik",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/ru_RU/__init__.py b/faker/providers/lorem/ru_RU/__init__.py
index f41cf346..fbcdc77d 100644
--- a/faker/providers/lorem/ru_RU/__init__.py
+++ b/faker/providers/lorem/ru_RU/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -506,3 +508,5 @@ class Provider(LoremProvider):
         "увеличиваться",
         "равнодушный",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/th_TH/__init__.py b/faker/providers/lorem/th_TH/__init__.py
index 48977356..bc7d198f 100644
--- a/faker/providers/lorem/th_TH/__init__.py
+++ b/faker/providers/lorem/th_TH/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -420,3 +422,5 @@ class Provider(LoremProvider):
         "ไอศกรีม",
         "ไอโอเอส",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/zh_CN/__init__.py b/faker/providers/lorem/zh_CN/__init__.py
index fbb411c2..bd834897 100644
--- a/faker/providers/lorem/zh_CN/__init__.py
+++ b/faker/providers/lorem/zh_CN/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -353,3 +355,5 @@ class Provider(LoremProvider):
         "全部",
         "准备",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/lorem/zh_TW/__init__.py b/faker/providers/lorem/zh_TW/__init__.py
index 3aaa100a..f3bbfb85 100644
--- a/faker/providers/lorem/zh_TW/__init__.py
+++ b/faker/providers/lorem/zh_TW/__init__.py
@@ -1,3 +1,5 @@
+from typing import Dict
+
 from .. import Provider as LoremProvider
 
 
@@ -353,3 +355,5 @@ class Provider(LoremProvider):
         "全部",
         "准備",
     )
+
+    parts_of_speech: Dict[str, tuple] = {}
diff --git a/faker/providers/ssn/it_IT/__init__.py b/faker/providers/ssn/it_IT/__init__.py
index 40ccdbbb..1b41b54c 100644
--- a/faker/providers/ssn/it_IT/__init__.py
+++ b/faker/providers/ssn/it_IT/__init__.py
@@ -4,9 +4,14 @@ from string import ascii_uppercase, digits
 
 from .. import Provider as SsnProvider
 
+ALPHABET = ascii_uppercase
 ALPHANUMERICS = sorted(digits + ascii_uppercase)
 ALPHANUMERICS_DICT = {char: index for index, char in enumerate(ALPHANUMERICS)}
 MONTHS_LIST = ("A", "B", "C", "D", "E", "H", "L", "M", "P", "R", "S", "T")
+VOWELS = "AEIOU"
+CONSONANTS = [letter for letter in ALPHABET if letter not in VOWELS]
+
+
 MUNICIPALITIES_LIST = (
     "A001",
     "A004",
@@ -8007,13 +8012,14 @@ class Provider(SsnProvider):
     """
 
     def ssn(self) -> str:
-        name_and_surname = self.bothify("??????").upper()
-        sex = self.random_int(min=0, max=1)
+        sex: int = self.random_int(min=0, max=1)
+        surname: str = self._get_surname_letters()
+        name: str = self._get_name_letters(sex)
         year: str = "%02d" % self.random_int(min=0, max=99)
         month: str = self.random_element(MONTHS_LIST)
         day: str = "%02d" % (self.random_int(min=1, max=28) + (40 if sex == 1 else 0))
         municipality: str = self.random_element(MUNICIPALITIES_LIST)
-        code: str = name_and_surname + year + month + day + municipality
+        code: str = f"{surname}{name}{year}{month}{day}{municipality}"
         return code + checksum(code)
 
     vat_id_formats = ("IT###########",)
@@ -8024,3 +8030,87 @@ class Provider(SsnProvider):
         :return: A random Italian VAT ID
         """
         return self.bothify(self.random_element(self.vat_id_formats))
+
+    def _get_name_letters(self, sex: int) -> str:
+        """
+        Rules:
+            * take all consonants in their order
+              * if >= 4, take the 1st, 3rd and 4th
+              * if < 3 take the vowels also; vowels must go _after_ the consonants
+                and must be taken in the order they appear (LUCA -> LCU)
+              * if == 3 return all 3 consonants
+            * if name is < 3 chars, pad it on the right with "X" (LI -> LIX)
+        Args:
+            sex: int
+        Returns:
+            str
+        """
+
+        if sex == 1:
+            name = self.generator.first_name_male().upper()
+        else:
+            name = self.generator.first_name_female().upper()
+
+        if len(name) < 3:
+            return self._pad_shorter(name)
+
+        name_consonants = self._get_consonants(name)
+        cons_len = len(name_consonants)
+        if cons_len >= 4:
+            name_part = "".join([name_consonants[0], name_consonants[1], name_consonants[3]])
+        elif cons_len < 3:
+            name_part = "".join(name_consonants + self._get_vowels(name))[:3]
+        else:
+            name_part = "".join(name_consonants)
+        return name_part
+
+    def _get_surname_letters(self) -> str:
+        """
+            Rules:
+            * if consonants >=3 : take the first 3
+            * if less, pad them with vowels; vowels come after the consonants and in the order they appear (ROSA -> RSO)
+            * if surname is less than 3 chars, pad it on the right with 'X'  (FO -> FOX)
+        Returns:
+            str
+        """
+        surname = self.generator.last_name().upper()
+        if len(surname) < 3:
+            return self._pad_shorter(surname)
+
+        surname_consonants = self._get_consonants(surname)
+        cons_len = len(surname_consonants)
+
+        if cons_len < 3:
+            surname_part = "".join(surname_consonants + self._get_vowels(surname))[:3]
+        else:
+            surname_part = "".join(surname_consonants)[:3]
+        return surname_part
+
+    @staticmethod
+    def _get_vowels(sequence: str) -> list:
+        """
+        Returns list of vowels in provided string
+        """
+        vowels = []
+        for char in sequence:
+            if char in VOWELS:
+                vowels.append(char)
+        return vowels
+
+    @staticmethod
+    def _get_consonants(sequence: str) -> list:
+        """
+        Returns list of consonants in provided string
+        """
+        consonants = []
+        for char in sequence:
+            if char in CONSONANTS:
+                consonants.append(char)
+        return consonants
+
+    @staticmethod
+    def _pad_shorter(sequence: str) -> str:
+        """
+        Pads shorter string with the allowed char
+        """
+        return sequence.ljust(3, "X")


Test patch:
diff --git a/tests/providers/test_automotive.py b/tests/providers/test_automotive.py
index fc55ba2e..b9863935 100644
--- a/tests/providers/test_automotive.py
+++ b/tests/providers/test_automotive.py
@@ -298,3 +298,9 @@ class TestFiFi(_SimpleAutomotiveTestMixin):
     """Test fi_FI automotive provider methods"""
 
     license_plate_pattern: Pattern = re.compile(r"[A-Z]{3}-\d{3}")
+
+
+class TestSqAl(_SimpleAutomotiveTestMixin):
+    """Test sq_AL automotive providers methods"""
+
+    license_plate_pattern: Pattern = re.compile(r"[A-Z]{2} \d{3}[A-Z]{2}")
diff --git a/tests/providers/test_date_time.py b/tests/providers/test_date_time.py
index 21b6e5e1..0ed74cbb 100644
--- a/tests/providers/test_date_time.py
+++ b/tests/providers/test_date_time.py
@@ -25,9 +25,11 @@ from faker.providers.date_time.de_AT import Provider as DeAtProvider
 from faker.providers.date_time.de_DE import Provider as DeDeProvider
 from faker.providers.date_time.el_GR import Provider as ElGrProvider
 from faker.providers.date_time.es_ES import Provider as EsEsProvider
+from faker.providers.date_time.fr_FR import Provider as FrFrProvider
 from faker.providers.date_time.hy_AM import Provider as HyAmProvider
 from faker.providers.date_time.it_IT import Provider as ItItProvider
 from faker.providers.date_time.nl_NL import Provider as NlProvider
+from faker.providers.date_time.no_NO import Provider as NoNoProvider
 from faker.providers.date_time.pl_PL import Provider as PlProvider
 from faker.providers.date_time.pt_BR import Provider as PtBrProvider
 from faker.providers.date_time.pt_PT import Provider as PtPtProvider
@@ -1166,3 +1168,31 @@ class TestZhCn(unittest.TestCase):
     def test_month(self):
         day = self.fake.month_name()
         assert day in ZhCnProvider.MONTH_NAMES.values()
+
+
+class TestNoNo(unittest.TestCase):
+    def setUp(self):
+        self.fake = Faker("no-NO")
+        Faker.seed(0)
+
+    def test_day(self):
+        day = self.fake.day_of_week()
+        assert day in NoNoProvider.DAY_NAMES.values()
+
+    def test_month(self):
+        month = self.fake.month_name()
+        assert month in NoNoProvider.MONTH_NAMES.values()
+
+
+class TestFrFr(unittest.TestCase):
+    def setUp(self):
+        self.fake = Faker("fr-FR")
+        Faker.seed(0)
+
+    def test_day(self):
+        day = self.fake.day_of_week()
+        assert day in FrFrProvider.DAY_NAMES.values()
+
+    def test_month(self):
+        day = self.fake.month_name()
+        assert day in FrFrProvider.MONTH_NAMES.values()
diff --git a/tests/providers/test_lorem.py b/tests/providers/test_lorem.py
index 2e7e8ccd..0ea37933 100644
--- a/tests/providers/test_lorem.py
+++ b/tests/providers/test_lorem.py
@@ -7,22 +7,14 @@ from faker.providers.lorem.bn_BD import Provider as BnBdLoremProvider
 from faker.providers.lorem.cs_CZ import Provider as CsCzLoremProvider
 from faker.providers.lorem.de_AT import Provider as DeAtLoremProvider
 from faker.providers.lorem.de_DE import Provider as DeDeLoremProvider
+from faker.providers.lorem.en_US import Provider as EnUsLoremProvider
 from faker.providers.lorem.fa_IR import Provider as FaIrLoremProvider
 
 
 class TestLoremProvider:
     """Test lorem provider methods"""
 
-    custom_word_list = [
-        "danish",
-        "cheesecake",
-        "sugar",
-        "lollipop",
-        "wafer",
-        "gummies",
-        "jelly",
-        "pie",
-    ]
+    custom_word_list = ["danish", "cheesecake", "sugar", "lollipop", "wafer", "gummies", "jelly", "pie"]
 
     def test_word_with_defaults(self, faker, num_samples):
         for _ in range(num_samples):
@@ -147,12 +139,7 @@ class TestLoremProvider:
     @pytest.mark.parametrize(
         "num_chars",
         [10, 50, 150, 10000],
-        ids=[
-            "max_nb_chars < 25",
-            "25 <= max_nb_chars < 100",
-            "max_nb_chars >= 100",
-            "max_nb_chars >> 100",
-        ],
+        ids=["max_nb_chars < 25", "25 <= max_nb_chars < 100", "max_nb_chars >= 100", "max_nb_chars >> 100"],
     )
     def test_text_with_valid_character_count(self, faker, num_samples, num_chars):
         for _ in range(num_samples):
@@ -169,17 +156,38 @@ class TestLoremProvider:
         num_texts = 5
         num_chars = 25
         for _ in range(num_samples):
-            texts = faker.texts(
-                max_nb_chars=num_chars,
-                nb_texts=num_texts,
-                ext_word_list=self.custom_word_list,
-            )
+            texts = faker.texts(max_nb_chars=num_chars, nb_texts=num_texts, ext_word_list=self.custom_word_list)
             assert len(texts) == num_texts
             for text in texts:
                 assert len(text) <= num_chars
                 words = re.sub(r"[.\n]+", " ", text.lower()).split()
                 assert all(word in self.custom_word_list for word in words)
 
+    @pytest.mark.parametrize(
+        "nb,part_of_speech", [(10, "verb"), (18, "adverb"), (11, "noun")], ids=["verb", "adverb", "noun"]
+    )
+    def test_words_part_of_speech(self, faker, nb, part_of_speech):
+        words = faker.words(nb=nb, part_of_speech=part_of_speech)
+        assert (word in EnUsLoremProvider.parts_of_speech[part_of_speech] for word in words)
+
+    @pytest.mark.parametrize("nb,part_of_speech", [(5, "abcdefg")], ids=["invalid part of speech"])
+    def test_words_invalid_part_of_speech(self, faker, nb, part_of_speech):
+        with pytest.raises(ValueError) as exc_info:
+            faker.words(nb=nb, part_of_speech=part_of_speech)
+
+        assert exc_info.type is ValueError
+        assert exc_info.value.args[0] == f"{part_of_speech} is not recognized as a part of speech."
+
+    @pytest.mark.parametrize(
+        "nb,part_of_speech",
+        [(3, "adverb"), (5, "verb"), (4, "abcdefgh")],
+        ids=["ignore adverb", "ignore verb", "ignore invalid part of speech"],
+    )
+    def test_words_part_of_speech_ignored(self, faker, nb, part_of_speech):
+        words = faker.words(nb=nb, part_of_speech=part_of_speech, ext_word_list=self.custom_word_list)
+        assert len(words) == nb
+        assert all(word in self.custom_word_list for word in words)
+
 
 class TestCsCz:
     """Test cs_CZ lorem provider"""