Автоматично генериране на лоши шеги.

(Ако сте тук само за генерираните вицове, превъртете надолу до дъното!)

Помислих си: кое е супер лесно за изграждане, но въпреки това би получило одобрителен смях, ако някой го намери на страницата ми в github? Очевидно генератор на шеги на татко.

Първото нещо, което направих, беше да си помисля: как точно работят шегите за татко? Нека измислим няколко произволни бащини шеги (те са доста добри, нали?):

What do you call a greedy animal living in the sea?
A selfish.
Which australian animal is known for it’s southern hospitality?
A koalabama
What do you call a freezing, chicken-like creature?
A cold turkey.

Добре, нека се опитаме да създадем три вида шеги, които следват този модел.

Част 1: Наборът от данни

Първо се опитах да създам набор от думи и техните дефиниции. Първият ми инстинкт беше да взема речник, но резултатите от речника са твърде технически и, честно казано, объркващи. Вижте този пример за риба:

риба
всяко от различни студенокръвни, водни гръбначни, имащи хриле, обикновено перки и обикновено удължено тяло, покрито с люспи.
(свободно) всяко от различни други водни животни .
месото от риба, използвано за храна.
(Неформално) човек.
дълга ивица дърво, желязо и др. ., използвани за укрепване на мачта, става и др.

Добре, какво ще кажете за wikipedia?

Рибитеса водни черепни животни с хриле, които нямат крайници с пръсти

Добре, тогава моята „егоистична“ шега ще стане нещо като:

What is greedy and are gill-bearing aquatic craniate animals that lack limbs with digits?
A sel-fish

Това все още е твърде технически за мен. И така, къде мога да намеря описания на думи, които дори дете би разбрало? Е, с помощта на „детски речник“, разбира се!

Риба: животно, което живее във вода и има перки за плуване и хриле за дишане

Това е просто перфектно! Това ще превърне шегата ми в:

What is greedy and an animal that lives in water and has fins for swimming and gills for breathing?
A sel-fish

Добре, това е достатъчно. Създадох набор от думи, като изхвърлих около 2000 думи от този детски речник, за да генерирам нещо подобно:

length:noun:the distance from one end of a thing to the other.
good:adjective:having qualities that are desired.
dog:noun:a furry animal with four legs, a pointed nose, and a tail.
prisoner:noun:a person who is held in a jail or prison while on trial or after being sentenced for a crime.

Част 2: Хващане на самоловец

Добре, сега, когато имаме набор от данни, първият тип шега беше доста проста: разглеждайки всички възможни двойки наши думи, намираме думи, които завършват или започват с другата дума.

for word1,desc1 in words:
  for word2,desc2 in words:
    if word2.startswith(word2):
      print(f"What do you call a kind of {word1} that is {desc2}?")
      print(f"a {word1+word2}")

Което генерира нещо подобно:

What do you call a kind of leg that is a group of people within a government that has the power to make or change laws?
A legislature

Това наистина не работеше за мен и също внезапно осъзнах, че виц 1 и виц 2 всъщност следват един и същ модел: припокриване между думите (независимо дали цели или частични). Затова вместо това написах нещо, което комбинира и двете.

Част 3: Отиване до Коалабама

Добре, както за „коалабама“, така и за „егоистичен“, ключът е, че имат припокриващи се части от думите. Единствената разлика е, че за егоист думата „риба“ е цяла част от думата „егоист“, докато „коала“ и „алабама“ имат знаци, които не са в другата дума.

Независимо от това, пренаписах малко логиката до нещо подобно:

for word1,desc1 in words:
  for word2,desc2 in words:
    if overlap(word1, word2):
      print(f"What do you call a kind of {word1} that is {desc2}?")
      print(f"a {combine(word1, word2)}")

Което доведе до това:

What do you call a kind of energy that is a tiny section of a chromosome?
A genenergy
What do you call a kind of tail that is a small item; a particular?
A detail
What do you call a kind of anniversary that is a polite and honorable man?
A gentlemanniversary
What do you call a kind of era that is a play in which all or most of the words are sung and the music is played by an orchestra?
An opera

Добре, това работи! шегите са доста куци, но това трябва да са шегите на татко.

Част 4: Превръщане в студена пуйка

Това са две от първите ни шеги, които разгледахме, нека да се заемем с третата. Забавното при „студената пуйка“ е, че освен „студена“ и „пуйка“, тя е и нещо съвсем друго. Така че това, което търсим, е набор от думи, които заедно имат друго, трето значение.

Предвид нашия ограничен набор от данни, нека да видим какви думи можем да комбинираме, за да намерим трета дума, която също е в данните:

cat fish catfish
door way doorway
life time lifetime
share holder shareholder
frame work framework
cup board cupboard
fire wood firewood
mess age message
pass age passage
work shop workshop
percent age percentage
bed room bedroom
car pet carpet
rail way railway
cover age coverage
class room classroom
land lord landlord
sea lion sea lion
sea son season
blue whale blue whale
birth day birthday
rain forest rain forest
bath room bathroom
week end weekend

Добре, няма толкова много комбинации, но можем да създаваме шеги с тях и да увеличим размера на набора от данни по-късно. Това е псевдокодът, който използвах, за да създам следващите вицове:

for word1,desc1 in words:
  for word2,desc2 in words:
    for mix in [word1+word2, word1+"-"+word2, word1+" "+word2]:
      if mix in words:
        print(f"What do you call {combined_desc(desc1, desc2)}?")
        print(f"a {mix}")

Което доведе до:

What do you call a small, furry mammal with whiskers, short ears, and a long tail that lives in water and has fins for swimming and gills for breathing?
A catfish
What do you call an opening through which one enters or leaves a room or building and a road or path leading from one place to another?
A doorway
What do you call the state of being that can never be turned back?
A lifetime

Сомовата ми е смешна, но другите не. Все пак работи доста добре.

Част 5: Принудителен смях

Добре, така че като съберем всичко заедно, нека генерираме куп бащини шеги:

What do you call a kind of infant that is a soft, light gray metal that is one of the chemical elements?
A tinfant (tin+infant)
What do you call a kind of attendance that is a white or yellow oily substance found in some parts of animals or plants?
A fattendance (fat+attendance)
What do you call the color of a clear sky which lives in the water?
A blue whale (blue+whale)
What do you call a kind of airplane that is to put in good condition again after damage has been done; fix?
A repairplane (repair+airplane)
What do you call a kind of mountain that is measure; quantity?
An amountain (amount+mountain)
What do you call the solid part of the earth's surface and a person who rules?
A landlord (land+lord)
What do you call a kind of plaintiff that is an act of complaining?
A complaintiff (complaint+plaintiff)
What do you call an automobile and a tame animal people keep in their homes as a companion or for pleasure?
A carpet (car+pet)
What do you call a kind of intervention that is the season of the year between autumn and spring?
A wintervention (winter+intervention)
What do you call a kind of cancer that is great value; importance?
A significancer (significance+cancer)
What do you call a kind of spectrum that is the state or condition of being thought of with honor or admiration; such admiration itself?
A respectrum (respect+spectrum)

Искам да кажа, че не са толкова добри като моите собствени шеги, но са доста близки ;)
Следващите стъпки могат да включват:
— използване начастта на речта на дума, като съществително или глагол.
— разширяване на набора от даннис повече думи.
— създаване на прост уебсайт, който показва случайни бащини шеги.
— прилагане на НЛПза обръщане на изречения като „Как наричате автомобил и опитомено животно, което хората държат в домовете си като спътник или за удоволствие?“ в „Как се нарича автомобил, който хората държат в домовете си като спътник или за удоволствие?“

Можете да намерите кода (и всички 1710 генерирани шеги) тук: https://github.com/paulluuk/DadJokes