Git Product home page Git Product logo

mrmaxguns / wonderwordsmodule Goto Github PK

View Code? Open in Web Editor NEW
53.0 3.0 9.0 9.77 MB

Generate random words and sentences with ease in Python. Be on the lookout for bugfixes and speed improvements in 2.3

Home Page: https://wonderwords.readthedocs.io

License: MIT License

Python 100.00%
python cli random-generation random-word-generator random-words random-sentences python3 python36 python37 python38 contributions-welcome python39

wonderwordsmodule's Introduction

Wonderwords

Generate random words and sentences with ease in python

PyPI - Downloads

Libraries.io SourceRank

PyPI - License

GitHub Repository | PyPI | Documentation


Wonderwords is a Python package useful for generating random words and structured random sentences. It also comes with a colorful command line interface for quickly generating random words. The latest version is available on GitHub while the stable version is available on PyPI.

Table of Contents

Features

Here's what Wonderwords is capable of:

  • Random word generation in English
  • Specify word length, what it starts and ends with, category, and even custom regular expressions
  • Use custom word lists and define custom categories of words
  • Generate structured random sentences
  • Basic profanity filtering
  • Beautiful command line interface
  • Easy-to-use interface and comprehensive documentation
  • Open source!

Installation

To install the latest version of Wonderwords, use your favorite package manager for the Python Package Index to install the wonderwords package. For example with pip:

pip install wonderwords

To upgrade Wonderwords with pip use:

pip install --upgrade wonderwords

To verify that the installation worked, import Wonderwords in python:

import wonderwords

If you get a ModuleNotFound error, make sure that you have installed Wonderwords from the step above. For further issues, open a new issue from the GitHub page.

Usage

This section will briefly describe Wonderwords usage. Since Wonderwords has a command line interface and python module, you will find two subsections.

The Wonderwords Python API

The base random word generation class is the RandomWord class. You can generate words with the word method:

from wonderwords import RandomWord

r = RandomWord()

# generate a random word
r.word()

# random word that starts with a and ends with en
r.word(starts_with="a", ends_with="en")

# generate a random noun or adjective, by default all parts of speech are included
r.word(include_parts_of_speech=["nouns", "adjectives"])

# generate a random word between the length of 3 and 8 characters
r.word(word_min_length=3, word_max_length=8)

# generate a random word with a custom Python regular expression
r.word(regex=".*a")

# some of the words in the default word lists have spaces, such as 'contact lens'
# this option disables them
r.word(exclude_with_spaces=True)

# you can combine multiple filtering options
r.word(starts_with="ru", word_max_length=10, include_parts_of_speech=["verbs"])

You can also get a list of all words matching some criteria using the filter method:

# get a list of ALL words that start with "am"
r.filter(starts_with="am")

# you can use all the options found in the word method:
r.filter(ends_with="k", include_parts_of_speech=["verbs"], word_min_length=4)

You can also generate a random list of words with the random_words method. This is much like the filter method, except you specify the amount of words to return, and the words are randomly chosen. If there aren't enough words to satisfy the amount, a NoWordsToChooseFrom exception is raised:

# get a list of 3 random nouns
r.random_words(3, include_parts_of_speech=["nouns"])

# you can use all the options found in the word method
r.random_words(5, starts_with="o", word_min_length=10)

# if the amount of words you want to get is larger than the amount of words
# there are, a NoWordsToChooseFrom exception is raised:
r.random_words(100, starts_with="n", word_min_length=16)
# there are less than 100 words that are at least 16 letters long and start with
# n, so an exception is raised

# you can silence the NoWordsToChooseFrom exception and return all words even
# if there are less, by setting return_less_if_necessary to True
r.random_words(100, starts_with="n", word_min_length=16, return_less_if_necessary=True)

Generating random sentences is easy using the RandomSentence class:

from wonderwords import RandomSentence

s = RandomSentence()

# Get a random bare-bone sentence
s.bare_bone_sentence()

# Get a random bare-bone sentence with a direct object
s.simple_sentence()

# Get a random bare-bone sentence with an adjective
s.bare_bone_with_adjective()

# Get a random sentence with a subject, predicate, direct object and adjective
s.sentence()

Words are organized in categories, such as "nouns", "verbs", and "adjectives". What if you had your own categories of words? You can specify your custom categories when instantiating the RandomWord class:

from wonderwords import RandomWord

cars = ["Chevrolet", "Subaru", "Tesla"]
airplanes = ["Boeing", "Airbus", "Cessna"]
w = RandomWord(cars=cars, airplanes=airplanes)

# Will return a random car or airplane
w.word()

# Will return a random car
w.word(include_categories=["cars"])

# You can also mix and match custom categories with defaults
from wonderwords import Defaults
proper_nouns = ["Austin", "Seattle", "New York"]
w2 = RandomWord(proper_nouns=proper_nouns, common_nouns=Defaults.NOUNS)

# Will return either Seattle or seat
w.word(regex="[Ss]eat.*")

Finally, starting with version 2.3, Wonderwords has explicit support for filtering out profanities from lists of words. At the moment, this is rudimentary:

from wonderwords import is_profanity, filter_profanity

# Test against words that could possibly be offensive. Good of user-facing apps.
is_profanity("apple") # False

# Can be done with a list
words = [ ... ]
# The function returns a generator, so we convert it to a list
words_clean = list(filter_profanity(words))

More advanced usage (and a tutorial!) is found in the documentation, such as adding custom categories of words. The full documentation with all information can be found at: https://wonderwords.readthedocs.io

The Wonderwords CLI

NOTE: Before using the command-line interface (CLI), ensure that you installed all required dependencies for the CLI using pip install wonderwords[cli]. Wonderwords normally requires no dependencies, but uses Rich for colorized output in the command line.

Wonderwords provides a command line interface, too, which can be used with the wonderwords command. Usage:

usage: wonderwords [-h] [-w] [-f] [-l LIST] [-s {bb,ss,bba,s}] [-v] [-S STARTS_WITH] [-e ENDS_WITH]
                   [-p {noun,verb,adjective,nouns,verbs,adjectives} [{noun,verb,adjective,nouns,verbs,adjectives} ...]]
                   [-m WORD_MIN_LENGTH] [-M WORD_MAX_LENGTH] [-r REGEX] [-x] [-d DELIMITER] [-E]

Generate random words and sentences from the command line. Here is a full list of available commands. To learn more
about each command, go to the documentation at https://wonderwords.readthedocs.io

options:
  -h, --help            show this help message and exit
  -w, --word, --random-word
                        generate a random word
  -f, --filter          get a list of all known words matching the criteria specified
  -l LIST, --list LIST  return a list of a certain length of random words
  -s {bb,ss,bba,s}, --sentence {bb,ss,bba,s}
                        return a sentence based on the structure chosen
  -v, --version         print the version number and exit
  -S STARTS_WITH, --starts-with STARTS_WITH
                        strings the random word(s) should start with
  -e ENDS_WITH, --ends-with ENDS_WITH
                        strings the random word(s) should end with
  -p {noun,verb,adjective,nouns,verbs,adjectives} [{noun,verb,adjective,nouns,verbs,adjectives} ...], --parts-of-speech {noun,verb,adjective,nouns,verbs,adjectives} [{noun,verb,adjective,nouns,verbs,adjectives} ...]
                        only include certain parts of speech (by default all parts of speech are included)
  -m WORD_MIN_LENGTH, --word-min-length WORD_MIN_LENGTH
                        minimum length of the word(s)
  -M WORD_MAX_LENGTH, --word-max-length WORD_MAX_LENGTH
                        maximum length of the word(s)
  -r REGEX, --regex REGEX, --re REGEX, --regular-expression REGEX
                        a python-style regular expression for the word(s) to match
  -x, --exclude-with-spaces
                        exclude open compounds, such as 'contact lens'
  -d DELIMITER, --delimiter DELIMITER
                        specify the delimiter to put between a list of words, default is ', '
  -E, --suppress-error-on-less
                        suppress errors when less words are returned in a list then wanted

The basic commands are:

  • -w: generate a random word
  • -f: which works much like the filter function to return all words matching a certain criteria
  • -l LIST: get a list of LIST random words
  • -s {bb,ss,bba,s}: generate a random sentence:
    • bb: bare bone sentence
    • ss: simple sentence (bare bone sentence with direct object)
    • bba: bare bone sentence with adjective
    • s: generate a simple sentence with an adjective

Versioning

During its early stages, Wonderwords didn't have a set versioning system and therefore, versions before v2.0.0-alpha are in disarray. Starting with version 2 alpha, Wonderwords uses sematic versioning.

License

Wonderwords is open source and is distributed under the MIT license. See LICENSE for more details.

Contributing

All contributions are welcome, and we hope Wonderwords will continue growing. Start out by reading CONTRIBUTING.md for contributing guidelines and how to get started.

Credits

Wonderwords has been made possible thanks to the following works:

wonderwordsmodule's People

Contributors

anitahammer avatar emoreth avatar kiraacorsac avatar mrmaxguns avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

wonderwordsmodule's Issues

Does not work with pyinstaller

I have a project in which I'm using wonderwords. I decided to use pyinstaller to create an executable. Only it complains about not being able to find a temporary text file it can't find. On windows 10. I'm probably going to implement my own bad version of this package for my specific user case but I thought I'd let you know.

FileNotFoundError

After importing the package and using random_word() python gives the following error:

>>> from wonderwords import random_word
>>> my_words = random_word.random_word()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.7/site-packages/wonderwords/random_word.py", line 9, in __init__
    word_file = open('words.txt', "r")
FileNotFoundError: [Errno 2] No such file or directory: 'words.txt'

I have checked to see if the file is in the same directory as the python file, and it is. This shouldn't happen as when a user installs the package, they will get this error.
Both files are located in:

/usr/local/lib/python3.7/site-packages/wonderwords

Cursewords flag

I'm generating adjective-noun pairs as job names for my projects.

Is your feature request related to a problem? Please describe.
I would like not to serve my users random words like 'ugly fuck' or 'nasty shit'.

Describe the solution you'd like
I would like to pass a flag to the generator, specifying whether I want curse words sprinkled into my random words. This flag would default to False (no curse words).

Describe alternatives you've considered
I considered just leaving it as-is and laughing when somebody complains about their random words being something like 'massive cock'.

sentence() missing 1 required positional argument: 'self'

Describe the bug
According to the documentation on readthedocs there are three classess in the wonderwords.RandomSentence class:

  • bare_bone_sentence
  • simple_sentence
  • sentence

To execute any of them you are simply supposed to call them with empty () like so
s.sentence()
That however produces an error
Traceback (most recent call last):
File "", line 1, in
TypeError: sentence() missing 1 required positional argument: 'self'

To Reproduce
Steps to reproduce the behavior:

  1. enter python interactive shell
  2. import wonderwords
  3. s=wonderwords.RandomSentence
  4. s.sentence()
  5. See error

Expected behavior
Printout of a random sentence.

Desktop (please complete the following information):

  • OS: Windows 11
  • cmd.exe
  • Python 3.7.2

Package does not install required dependencies

Installing wonderwords does not install it's actual dependencies. The contents of requirements.txt should be added to setup.py as package dependencies.

To Reproduce
Steps to reproduce the behavior:

  1. pip install wonderwords
  2. wonderwords -s
  3. ModuleNotFoundError: No module named 'rich'

Expected behavior
package runs

Desktop (please complete the following information):

  • OS: ubuntu 22.04

Python package gives ModuleNotFoundError after installed

When trying to install the package from TestPyPi, python gives a ModuleNotFoundError when importing the package.

>>> import wonderwords
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    import wonderwords
ModuleNotFoundError: No module named 'wonderwords'

"Pray" is not a noun.

Describe the bug
The word pray was generated in the noun category. It is not a noun.

To Reproduce
I don't know; I didn't save the random state of the program.
This line produced it: noun = wonderwords.RandomWord().word(include_parts_of_speech=["nouns"])

Expected behavior
The word pray should not be generated, because it is not a noun.

Other notes
It also generated falling-out which is not really a noun. It's not even a word.

Console commands not working at all

Describe the bug
Console commands not working corrections

To Reproduce
Install using pip
Run in python command line
Gets error

Expected behavior
wonderwords -v expected to display "Running wonderwords version 2.0.0a1"

Screenshots
image
image

Desktop (please complete the following information):

  • OS: Windows
  • Browser: Firefox
  • Version: 122.0

Additional context
Also doesn't run in code using RandomSentence(), sentence() or any other

Conda Forge Publishing

Hello
I quite like this package and would love to use it in a project of my own. The problem is that your package is only available via PyPI, but I provide a conda recipe in my project.
Would you therefore mind to publish it on conda-forge as well?
This should be quite easy with Grayskull.

How much vocabulary range it has?

Hey there,
I am lucky I got here, exactly what I was in need of.

Just need to ask, which dictionary are you using to get the random word?
Also is there any method to incorporate words from fantasy novels and other genres?

If yes, will methods like starts_with and ends_with work for newly added words?

Thanks in advance!!

Add seed control.

Is your feature request related to a problem? Please describe.
It's not possible for me to produce consistent output because there's no option to include a seed.
My use-case is hashing serializable objects, and using their hash as a random seed to give them a human-readable alias which is generated using wonderwords.

Describe the solution you'd like
I'd like an option to set the seed/random state in wonderwords.

Describe alternatives you've considered
It appears that using Python's random.seed(...) affects the random state of wonderwords. However it isn't enough. It does work during a Python session (i.e. it produces consistent results), but not across different sessions.

For example, consider this function:

import random
import wonderwords

def random_noun(seed : int):
    rstate = random.getstate()
    random.seed(seed)
    noun      = wonderwords.RandomWord().word(include_parts_of_speech=["nouns"])
    random.setstate(rstate)
    return noun

This allows me to produce consistent output when using random_noun(seed) during a program. It's a 'pure function', in the sense that it gives the same output for the same input, with no (known) side effects. However, if I quit Python and run a program again, the results of random_noun(seed) are changed. This means I cannot reproduce behaviour across different runs of the program.

ModuleNotFoundError: No module named 'wonderwords'

Describe the bug
A clear and concise description of what the bug is.

To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Additional context
Add any other context about the problem here.

`open_text` deprecation warning

Describe the bug
A clear and concise description of what the bug is.

Hit this while running pytest with this module:

../../.venv/lib/python3.11/site-packages/wonderwords/random_word.py:66
../../.venv/lib/python3.11/site-packages/wonderwords/random_word.py:66
../../.venv/lib/python3.11/site-packages/wonderwords/random_word.py:66
../../.venv/lib/python3.11/site-packages/wonderwords/random_word.py:66
  /home/jimc/proj/.venv/lib/python3.11/site-packages/wonderwords/random_word.py:66: DeprecationWarning: open_text is deprecated. Use files() instead. Refer to https://importlib-resources.readthedocs.io/en/latest/using.html#migrating-from-legacy for migration advice.
    words = pkg_resources.open_text(assets, word_file).readlines()

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html

To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Create a simple pytest example such as this:

import pytest
from wonderwords import RandomWord

@pytest.fixture(scope="module")
def random_word_pair():
    """Return a noun/adjective pair of random words"""
    w = RandomWord()
    noun = w.word(include_categories=["noun"])
    adjective = w.word(include_categories=["adjective"])
    return noun, adjective

then run it:

❯ pytest simpletest.py
=============================================================================================== test session starts ===============================================================================================
platform linux -- Python 3.11.6, pytest-7.4.3, pluggy-1.3.0
rootdir: /home/jimc/testing
collected 0 items                                                                                                                                                                                                 

================================================================================================ warnings summary =================================================================================================
.venv/lib/python3.11/site-packages/wonderwords/random_word.py:66
.venv/lib/python3.11/site-packages/wonderwords/random_word.py:66
.venv/lib/python3.11/site-packages/wonderwords/random_word.py:66
.venv/lib/python3.11/site-packages/wonderwords/random_word.py:66
  /home/jimc/testing/.venv/lib/python3.11/site-packages/wonderwords/random_word.py:66: DeprecationWarning: open_text is deprecated. Use files() instead. Refer to https://importlib-resources.readthedocs.io/en/latest/using.html#migrating-from-legacy for migration advice.
    words = pkg_resources.open_text(assets, word_file).readlines()

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
=============================================================================================== 4 warnings in 0.00s ===============================================================================================

Expected behavior
A clear and concise description of what you expected to happen.

No deprecation warnings pertaining to open_text while running pytest.

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Additional context
Add any other context about the problem here.

Slow when specify word length.

Describe the bug

RandomWord is slow.

To Reproduce

run this:

from timeit import timeit
from wonderwords import RandomWord

r = RandomWord()

timeit(lambda: r.word(
    include_parts_of_speech=[
        'nouns',
    ],
    word_min_length=3,
    word_max_length=8), number=100)

Output:

4.55993747399998

Expected behavior

A thousand calls should finish in 1 second.

Additional context

I think the code here is not very efficient.

It copies all words from the category, then removing them if they don't match the length criteria.
also, removing an item from an array takes O(n) time where n is the length of the array, making the whole operation O(n^2) where n is the numbers of words in the category.

IMO, using words = set() instead of words = [] could make it O(n) time, but it's still not fast enough.

When just requesting one word, we shouldn't even read all words in the category. It's better to pre-sort words in all categories by length, then use bisect to find start_index and end_index that match the length criteria, and just generate a random integer to access read the specific word. This way the overall time complexity is O(log N).

The above approach didn't optimize start_with and end_with, which requires introducing Trie.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.