Problem:
Wygeneruj zdanie, które można odczytać i zrozumieć. Musi zawierać podmiot, czasownik i obiekt, a czasy i liczby mnogie muszą się zgadzać. Program musi także być w stanie wygenerować kilka różnych zdań, aby się zakwalifikować.
Zasady:
- Twarde kodowanie zdań jest niedozwolone i nie odczytuje ich bezpośrednio z pliku (patrzę na ciebie, niedbale)
- Możesz mieć dowolną liczbę list słów
- Prześlij przykładowe zdanie lub 2 wygenerowane przez Twój program
- Każdy język jest akceptowany
- To konkurs popularności , więc wygrywa najbardziej pozytywna odpowiedź
popularity-contest
Doktor
źródło
źródło
[Adjective] [pl. noun] [verb] [adjective] [pl. noun]
i wyciąga z prawdziwego słownika (może używając jednego z dostępnych interfejsów API Dictionary), aby wypełnić puste pola? Sam bym to napisał, gdybym miał kilka minut do stracenia! :( W końcu ...Lazy Developers Write Lousy Programs.
Odpowiedzi:
Grzmotnąć
Wymagania: źródło jądra linuksa zainstalowane w / usr / src
Wyciąga losowe komentarze ze źródła jądra. To, czy zdania są rzeczywiście zrozumiałe, jest przedmiotem dyskusji.
Przykłady rzeczywistej produkcji:
end of packet for rx
I don't know what to do
256 byte packet data buffer.
The rest of this junk is to help gdb figure out what goes where
Convert page list back to physical addresses, what a mess.
???
Only Sun can take such nice parts and fuck up the programming interface
źródło
fortune
bazę danych.Slave Overflow
. ładna nazwa strony internetowej SEMatlab
przykład wyników:
[To jedno z pisanek Matlaba]
EDYCJA: możesz zobaczyć kod tej funkcji tutaj: dlaczego.m
źródło
PHP
Dając wystarczająco dużo czasu, powstanie cała literatura, przeszłość, teraźniejszość i przyszłość. Reguły nie wspominały, że nie można tworzyć innych tekstów.
Ciąg
'TOS...'
zapewnia logarytmiczną skalę skali liter, aby ściślej pasować do angielskiego. Służy to do generowania większego ciągu o przybliżonych względnych częstotliwościach liter.Prowadząc go, odkryłem takie literackie klejnoty, jak:
GO NOW
- Ty jako podmiot sugeruje się.IM AOK
- Nic mi nie jestIM FDR
- I'm F (ranklin) D (eleano) R (oosevelt)Ponadto liczne zachęty do zwięzłego wyrażania niezadowolenia z obecnej sytuacji. [Niektóre litery zostały zredagowane.]
F**K
S**T
Również następujące przy użyciu precyzyjnego skalowania:
IS IT ON
I AM STU
I SEE HTML
źródło
F**K
iS**T
pod warunkiem, że nie ma*
w'ABCDEFGHIJKMLNOPQRSTUVWXYZ '
?'TOS...'
ciąg reprezentuje częstotliwość każdej litery w skali logarytmicznej. WięcA
ma częstotliwośćT
,B
ma częstotliwośćO
.J
ma najniższą częstotliwość,A
która przekłada się na 0, z czego log odwrotny wynosi 1. Ostatni znak to spacja, która ma częstotliwośćZ
lub zaokrąglenie (exp (25 / 3.976)) = 538, więc spacje występują 538 razy częściej niżJ
. Pomyślałem, że to poprawi problem pisania małpy na maszynie do pisania .do
Przykładowe dane wyjściowe:
Istnieje również wiele prawidłowych wyników zdań, które nie zawierają tematu, czasownika i obiektu:
źródło
--i
oceniany na fałsz, gdyi
(zmienna typuchar
o wartości początkowej 0) ponownie osiągnie wartość 0. Jeślichar
jest bez znaku (np. ARM),i
natychmiast zawinie się do największej wartości (zwykle 255) i odlicza do 0. Jeślichar
jest podpisany (większość systemów Intel), zachowanie jest ściśle niezdefiniowane, ale zwykle po osiągnięciu wartości minimalnej ( zwykle -128) zawinie się do maksimum (zwykle 127) i odlicza do zera, więc program zwykle wydrukuje w sumie 256 linii.Jawa
Wyciąga wprowadzenie z przypadkowego artykułu w Wikipedii:
Czasami masz pecha; Próbuję to zminimalizować, ustawiając minimalną długość zdania i odfiltrowując zdania kończące się na „:” (wszystkie strony ujednoznaczniające zaczynają się w ten sposób) lub zawierają „?” (wydaje się, że istnieje wiele artykułów o nierozwiązanych nieznanych informacjach oznaczonych znakami zapytania). Granice zdań to kropka, po której następuje biała spacja, po której następuje cyfra lub duża litera.
Filtruję również tekst w nawiasach (wynik jest nadal prawidłowym zdaniem), aby spróbować usunąć niektóre kropki, które nie są granicami zdań. Filtruję kwadratowe nawiasy klamrowe, aby usunąć źródłowe numery cytowań. Przykłady:
Jeśli zauważysz jakieś problemy gramatyczne, to twoja wina, że nie jesteś pracowitym edytorem Wikipedii! ;-)
źródło
Soooo ... Ponieważ jest to konkurs popularności , dobrze się bawiłem
eval
z funkcjami. Zasadniczo generuję liczbę losową, a następnie wykonuję losową funkcję na podstawie tej liczby (na twojej twarzyswitch
,!) Za pośrednictwemeval
.PHP, ~ 9k poprawnych wyników
Niektóre wyjścia ...
źródło
PHP_EOL
jest zawsze równy\n
lub\r\n
, w zależności od systemu operacyjnego, ale nigdy<br>
lub podobny.Projekt PHP + Gutenberg
Napisałem skrypt PHP, który zamienia zwykły dokument tekstowy w zestaw słów bigrams , które następnie wykorzystuje do generowania losowych zdań. Oto niektóre z lepszych przykładów, jakie wygenerował z całej wersji tekstowej przemówienia Patricka Henry'ego „Give Me Liberty Or Give Me Death” , w tym drobny druk Project Gutenberg:
Możesz to wypróbować tutaj. Odśwież stronę, aby uzyskać nową partię zdań.
Jeśli chcesz sam uruchomić kod źródłowy, nie zapomnij załadować
$src_text
wybranego tekstu zwykłego.źródło
But for me, death!
: DI chciałbym, aby wszystkie licencje / umowy zakończyły się tak mocno.Pyton
Ten wpis wybiera słowa z całego słownika systemowego. Wykorzystuje to, że większość rzeczowników można przekształcić w czasowniki i odwrotnie. Wykorzystuje kilka heurystyk do klasyfikowania słów i unikania oczywistych niemożliwości.
Wytwarza kilka prawie rozsądnych stwierdzeń:
Wiele szalonych:
I wiele rzeczy, które brzmią jak Monty Python tworzący sprośne insynuacje:
Wersja 3 została zmodyfikowana, aby przyjmować dowolny plik tekstowy jako dane wejściowe:
Kod (wersja 3) :
źródło
cat FILE | COMMAND
? UUOC ;)This smoke toasted some nonresidents.
. WOAH.Grzmotnąć
Zainspirowany odpowiedzią Matlaba. Zakłada, że masz
aptitude
zainstalowany.Możliwe wyniki (zrzut ekranu z tego artykułu z Wikipedii)
źródło
. /----\ -------/ \ / \ / | -----------------/ --------\ ----------------------------------------------
to było prawidłowe zdanie.you win
może być zdaniem (sugerowany jest obiekt „argument”). I nawet jeśli tak nie jest, pytanie nie zabrania przypadków, w których dane wyjściowe są nieprawidłowe.Pyton:
Próbki:
Niestety, ma nieco słabą obsługę interpunkcji i wielkich liter, ale znowu te nie zostały wymienione jako wymagania.
Również tutaj jest odniesienie.
źródło
' '.join(l)
. Pozbędzie się to końcowej przestrzeni. Następnie możesz po prostu dodać kropkę.print " ".join(takewhile(lambda _: randint(0, 5), repeat("buffalo"))).capitalize() + "."
Rdza + Toki Pona
Dowolny język jest akceptowany, więc napisałem program w Rust, który generuje zdania w Toki Pona .
Toki Pona to próba stworzenia minimalnego języka naturalnego i ma bardzo prostą i regularną gramatykę. To bardzo przydatna właściwość do tego konkursu!
Nie mówię po Toki Pona, ale znalazłem składnię Toki Pona jako zestawu reguł BNF na Wikipedii. Stworzyłem jedną strukturę lub wyliczenie dla każdej reguły BNF i opatrzyłem je adnotacjami
deriving(Rand)
, co daje mi sposób na wygenerowanie losowejPhrase
struktury za darmo! Następnie zaimplementowałemToStr
dla każdej z tych struktur, aby przekonwertować je na ciąg.Celowo zostawiłem nazwy struktur w języku francuskim, ponieważ zasady BNF, które znalazłem, są w języku francuskim, a także dlatego, że przywraca wielojęzyczny charakter mojego przesłania!
Przykładowe wyniki
Niektóre wyniki i ich tłumaczenia, które zrobiłem w oparciu o reguły BNF i słownik Toki Pona . Jestem pewien, że te tłumaczenia są w większości błędne, ale Toki Pona faktycznie pozostawia wiele miejsca na interpretację zdania.
Podczas mojej podróży ktoś został zanieczyszczony
Tyłek jest brudny i jest zabawnym złym człowiekiem
Przeniosłeś owoc i środek do żółtego wszechświata
Zagadnienia
źródło
Pyton
źródło
import antigravity
prowadzi to do wynikuI LEARNED IT LAST NIGHT! EVERYTHING IS SO SIMPLE!
? : DProlog
Użyj cofania prologa i gramatyki generatywnej zbliżonej do gramatyki angielskiej, aby wygenerować wszystkie możliwe zdania.
Ta wersja ma dość ograniczone słownictwo i strukturę zdań, ale powinna być dość łatwa do rozszerzenia.
Kod:
Uruchom to zapytanie:
wygenerować wszystkie możliwe zdania w tym języku.
Niektóre przykładowe wyniki:
(EDYCJA: Zezwól na podrzędne klauzule obiektowe).
źródło
Pyton
Jak wiesz, możesz zrobić wszystko w Pythonie za pomocą kilku
import
s. To proste zadanie można wykonać za pomocą 2-wierszowego skryptu python.Liczba zdań wygenerowanych przez ten skrypt jest ogromna:
10^12
różne zdania. Jeśli odczytanie sentece zajmie Ci około 0,5 sekundy, to przeczytanie ich wszystkich zajmie ponad 15000 lat!Kilka przykładowych zdań:
I like the number 0.444371877853
I like the number 0.358614422548
Jednak wszystkie wygenerowane zdania zawierają temat, czasownik i obiekt.
AKTUALIZACJA:
Otrzymałem krytykę niektórych wyrafinowanych słów, które to złożone narzędzie może wywołać. Oto nieco dłuższa wersja, która powinna być zgodna z większością list słów.
Oto kilka przykładowych zdań:
I like the number zero point six three five nine zero eight one five eight four two four.
I like the number zero point four nine zero eight four four three two zero six two seven.
źródło
Zabawa ze słownikiem wewnętrznym Mathematica:
Masz szczęście, powiedzmy, w 70% przypadków. Generuje takie rzeczy jak:
ale czasami:
No cóż, jego angielski jest lepszy niż mój.
źródło
VBA / Excel
[edytuj 2]
Nauczyłem go, jak koniugować czasowniki, poniższe przykłady są proste w czasie przeszłym:
Poniżej znajduje się odpowiedni kod, z wyłączeniem szeregu nudnych pomocniczych funkcji parsowania i zapętlania. Głównymi brakującymi częściami są różne listy słów (według części mowy), które wykonują pluralizację, czasy, koniugacje itp.
Wszystkie pierwiastki słów są wybierane losowo, ale zmuszam je do ułożenia według określonego zdania:
... tego właśnie użyłem, aby wygenerować wynik powyżej. Wynika to z ogólnej formy: „Szybki czerwony lis przeskoczył nad leniwym brązowym psem”.
[rozpocznij oryginalny post]
Wciąż trwają prace, trzeba dodać logikę dla czasów i pluralizacji rzeczowników / czasowników, a mianowicie:
... który jest parsowalny, ale nie ma większego sensu.
Dobrze. Naprawdę nie zdanie, ale lepsze niż niektóre komunikaty o błędach JavaScript.
Rutyna insynuacji jest prawie na najwyższym poziomie ...
Kod do śledzenia anon. Czy ten konkurs ma termin?
[edytuj 1]
Kod, który wygenerował powyższe.
źródło
Perl 5
OK, wnętrzności programu są takie:
Jest to w zasadzie silnik „madlib”. Aby faktycznie wygenerować ciekawe zdania, musisz wypełnić
%pad
niektóre dane. Oto przykład%pad
...Oto kilka przykładów mądrości, którą z tego odkryłem
%pad
. Zdania te nie były edytowane pod względem długości, interpunkcji, gramatyki itp., Chociaż wybiłem kilka nieciekawych zdań i przestawiłem kolejność, w jakiej pojawiają się zdania - nie są już w kolejności, w jakiej zostały wygenerowane, ale zamiast tego próbuję użyj ich, aby opowiedzieć historię: historię, która, mam nadzieję, będzie dla ciebie zarówno wzruszająca, jak i prowokująca do myślenia.źródło
Pani Word
Nie jestem pewien, czy jest to akceptowalne, ale ponieważ HTML jest, myślę, że powinno to być również dopuszczalne.
Przykładowe zdania:
możesz także podać dowolną liczbę zdań i akapitów.
źródło
Prace w toku przy użyciu JSoup i simpleNLG
Zagadnienia:
Przykładowe wyniki:
źródło
PHP
Spowoduje to pobranie 30 najbardziej popularnych wyszukiwań w Google, wyszukiwanie „I Feel Lucky”, a następnie wyświetlenie losowego zdania z tej strony zawierającego co najmniej 3 słowa.
Przykłady:
„Była uważana za faworytkę medalu podczas imprezy”.
„Kate ukończyła szkołę średnią rok wcześniej”.
„15 kwietnia 2014 r. W celu promowania zgodności z polityką dotyczącą biografii żywych ludzi”.
„W imieniu Bryana my, jego rodzina, chcielibyśmy podziękować wszystkim za wylanie miłości, modlitw i wsparcia”.
„Ten artykuł dotyczy amerykańskiego koszykarza”.
„Niestety, Twoja przeglądarka ma wyłączoną obsługę JavaScript lub nie ma żadnego obsługiwanego odtwarzacza.”
źródło
Python 2.7
wynik:
źródło
/q/21571
Zamiast/questions/21571/generate-an-understandable-sentence
).Skrypty powłoki
Ten skrypt zawsze wyświetla tytuł pierwszego pytania, które jest aktualnie na górze tej witryny. Zakładam, że tytuł pytania będzie zawsze czytelny dla człowieka. I zmieni się dynamicznie. Tak więc, gdy pojawi się nowe pytanie i skrypt zostanie wykonany, poda najnowszy tytuł pytania.
Wyjście z próby 1
Wyjście z próby 2
EDYTOWAĆ
Nie używa żadnych plików. Bez plików mogę użyć poniższego skryptu.
Wynik
źródło
JavaScript (ES6)
Uruchomienie go w konsoli powoduje
źródło
t='';for(f of [_=>foo,_=>null.a,_=>0..toString(0)])try{f()}catch(e){t+=e.message+'\n'}t
Kolejny skrypt w języku Python
Odpowiedź user3058846 nie jest zły, ale to co wyświetla zdań, za każdym razem. Tutaj proponuję skrypt, który generuje losowe zdanie z Zen Pythona :
W jednej linii dla fanów golfa :
(Boooh, brudny.)
Przykłady:
Kolejny fajny sposób w Pythonie
Dzięki @TheDoctor wlej ten pomysł :-) Wycisz dane wyjściowe importu, a następnie graj z pseudoszyfrowanym dyktem w module.
źródło
shell=True
. Chociaż w tym przypadku nie jest to niebezpieczne, ponieważ nie bierzesz udziału użytkownika, wybrałbymsubprocess.Popen(('python', '-c', 'import this'))
.import this
, w module znajduje się zmiennathis
zawierająca cały tekst, ale zaszyfrowana. Istnieje również słownik do jego odszyfrowania.Python 3
Gwarantujemy generowanie gramatyki! (Zazwyczaj.)
Aby było idealnie gramatyczne, usuń podkreślenie z
wordregex
. Zapobiegnie to wprowadzaniu wielu słów, które prowadzą do złych zdań, takich jak „Spakujemy cię”.Przykładowy przebieg:
Ulubione dotychczasowe wyniki:
Sprawdź: http://en.wiktionary.org/wiki/you#Verb .
źródło
Pyton
Wynik:
Użyłem tutaj listy słów Znajdź słowa zawierające każdą samogłoskę
Można dodać więcej reguł. Na przykład, jeśli słowo kończące się na „ness” i słowo istnieje również w zestawie bez przyrostka, to jest to rzeczownik.
Kod źródłowy:
źródło
Grzmotnąć
Próbuje uruchomić program, który istnieje, ale nie jest zainstalowany (w Linux Mint 13).
źródło
Python 3
Kolejne ujęcie w Zen of Python , zainspirowane odpowiedzią Maxime'a .
źródło
źródło