Exceldokument för språkgenerering

Genesis

Ni dés ni maître
Joined
17 Aug 2000
Messages
15,523
Location
Göteborg
Hej! Länge sedan jag var här; så fint ni har gjort det!

Så jag satt och jobbade på ett spelkoncept jag sysslar med, och kände mig plötsligt nödgad att hitta på en massa platsnamn. Jag är inte riktigt van vid det, då jag brukar skippa spelvärlden i mina spel, men med detta koncept behövde jag faktiskt ett skelett till en fiktiv plats. Därefter eskalerade det: Jag behövde hitta på platsnamn, och sedan även personnamn, och jag ville ha lite logik i platsnamnen, och sedan behövde jag även hela fraser, och det slog mig att jag behöver vara systematisk. Så eftersom jag nyligen lärt mig att programmera i VBA så gjorde jag ett Excel-dokument som kunde hjälpa mig. Och det här gick också överstyr. Så nu har jag till slut något som jag tänker kan vara användbart även för andra, speciellt sådana som är mindre spelvärldshatare än mig. Om jag ska förklara allt i en enda post kommer den aldrig att bli färdigskriven, så jag börjar med en översikt, sedan skriver jag kanske lite mer om vissa detaljer, och om någon är intresserad nog att ställa frågor så kan jag besvara dem.

Innan vi börjar vill jag påpeka en sak: Jag är inte en programmerare! Jag har aldrig jobbat med programmering och VBA är det första språk jag lärt mig till en nivå som kan klassas som "användbar". Dessutom har jag inte jobbat så hårt på att få detta polerat och fint. Det innebär att det inte finns så många felmeddelanden, så gör du något oväntat så kommer antagligen koden att paja och du får ett debug-meddelande. Om någon bryr sig om att öppna koden och titta så kommer en riktig programmerare antagligen att finna den hemskt ineffektiv, inelegant och dåligt kommenterad. (Om någon vill förbättra den, så kör hårt! Jag avsäger mig alla rättigheter till det här dokumentet. Modda på!)

Så: en översikt. Dokumentet är tänkt att användas såhär:
  1. Först sätter man lite fonetiska regler om vilka typer av ljud som kan förekomma var i en viss stavelse. De olika ljuden kan ges olika vikt och du kan sätta olika typer av kombinationer beroende på om stavelsen är först, i mitten, i slutet eller ensam.
  2. Sedan går man till "Lexikon" och genererar några ord, för att se hur de kan se ut.
  3. Sedan skriver man lite ljudförändringsregler som appliceras i olika stadier av ett ords historia. Vissa regler appliceras direkt på stammen, andra när man sätter samman ett ord med andra ord eller med affix. Andra regler används för att generera romanisering och ortografi. För att skriva bra regler behöver man kunna lite regelbundna yttryck, kallat "regex". Närmare bestämt den version av regex som används i VBA. Detta gör att du kan skriva regler i stil med "När en otonad konsonant följs av en tonad konsonant förändras den första till sin tonade motsvarighet".
  4. Nu är det dags att skriva lite fraser! Här behöver man fundera lite över språkets grammatik. Du behöver skriva frasen i en sorts "kod" som sedan översätts till språket. Ord som redan finns i ditt lexikon översätts direkt, och för de ord som inte finns så genereras nya ord och läggs till i ditt lexikon. Du behöver alltså inte fylla i en massa ord i förväg, utan när du använder ord som inte finns så genereras de automatiskt. För att expandera ditt lexikon, skriv fler fraser!
  5. Utifrån fraserna genereras en romaniserad version av din fras, samt en "ortografi". Tanken med ortografin är att du kan använda den tillsammans med ett fräckt typsnitt du hittat på internet för att generera texten i ett fiktivt (eller verkligt men icke-latiskt) alfabet (eller abjad, eller …).
Det är tanken med hur detta fungerar. Det finns en del detaljer att prata om, men jag postar detta så länge.
 

Attachments

Genesis

Ni dés ni maître
Joined
17 Aug 2000
Messages
15,523
Location
Göteborg
När det gäller ordgenereringen:
  1. Varje ord du skriver in kommer att kollas mot ditt lexikon. Om ordet redan finns så kommer det att användas direkt. Om det inte finns så kommer ett nytt ord att genereras och läggas till i lexikonet.

  2. Du kan generera ett sammansatt ord såhär: "husbil<hus-bil>". Detta kommer att söka upp eller generera ett ord för "hus" och ett för "bil". Sedan sätts de ihop och detta lagras som ordet "husbil". Så nästa gång du skriver det behöver du bara skriva "husbil", för det är redan tillagt i ditt lexikon. De regler som listas i listan "Sammansättning" appliceras innan ordet sätts samman, och orden skiljs av två bindestreck. Så om du har en regel att "--h" ska ersättas av "--b" så kommer "alu" plus "hipu" att sättas samman till "alubipu", till exempel.
  3. Du kan göra sammansättningar som inte lagras i lexikonet genom att skriva dem rakt av, så "hus-PLU" (för "plural") kommer att generera ett ord för "hus" och ett för "PLU" och sätta ihop dem, men kommer inte att spara "hus-PLU" i ditt lexikon.
 Detta är tänkt att användas för grammatik, så plural, kasus, verbdeklinationer och annat gojs, men kan såklart också användas när ett ord är improviserat. Ordet "båtmotor" kanske inte behöver finnas i ditt lexikon om "båt" och "motor" redan finns.
  4. Du kan föra in låneord i språket såhär: snäll{ʒãti}. Ordet "snäll" läggs in i ditt lexikon och "ʒãti" används istället för att generera ett slumpmässigt ord. Du kan skriva regler även här, vilket kan vara användbart för ljud som inte finns i ditt språk. Så om ditt språk inte har ett "ʒ"-ljud kan du skriva en regel som ersätter det med ett "ʃ", till exempel.
  5. Du kan markera ord som prefix, suffix eller infix, genom att avsluta ordet med @p, @s respektive @i. Detta har tre konsekvenser: För det första påverkar det vilken kolumn som används för att generera stavelser. Så ett prefix kommer inte att använda sig av kolumnen för ordfinala stavelser. För det andra kommer det att använda längdinställningarna för affix istället för ord, då affix generellt är kortare. För det tredje kommer affixet att markeras med en affixmarkör; som standard "~". Detta för att dels identifiera dem i dina sammansättningsregler, och dels för att förhindra att de påverkas av regler som påverkar ordgränser. Så ett prefix "pa" ska inte påverkas av en regel "a$", som identifierar ordfinalt "a", eftersom a-et i "pa" inte är ordfinalt. (EDIT: Sist i din lista över sammansättningsregler bör du plocka bort denna markör, så att den inte följer med i ordet. Ersätt helt enkelt "~" med "".) Du kan också använda @u, vilket ger dig ett vanligt ord, men ett som använder affixinställningarna för längd. Detta kan vara praktiskt för ord som bör vara korta.
  6. Ovanstående regler appliceras rekursivt, så du kan skriva "husbåt<hus<bostad-plats>-båt{batå}>-PLU@s", vilket kommer att generera ord för bostad, plats, hus, båt, husbåt, samt ett affix för "PLU", och sedan skriva in plural för husbåt i din fras.
 
Last edited:

Genesis

Ni dés ni maître
Joined
17 Aug 2000
Messages
15,523
Location
Göteborg
Åh, när det gäller reglerna:

Det finns ett antal olika regellistor. Ordningen de appliceras i står längst upp i "Morflistor"-fliken. Men i princip fungerar det såhär:
  1. Ett proto-ord genereras.
  2. "Första evolution" appliceras.
  3. Låneord kommer in i språket, och "Låneord"-tabellen appliceras på dem specifikt (inte på ord som inte är låneord).
  4. "Andra evolution" appliceras.
  5. Sammansatta ord skapas. "Sammansättning"-tabellen appliceras på dem specifikt.
  6. "Ortografi" appliceras och skapar ordets stavning.
  7. "Tredje evolution" appliceras. Tanken med detta är att uttalet kan förändras efter att ortografin är etablerad, vilket är vad som gjort att engelska har så utomordentligt fånig ortografi. Notera dock att på grund av hur detta fungerar, så kommer kolumnen "ord" alltid att motsvara ortografin och inte reflerktera senare ljudförändringar. De ses endast i romaniseringen.
  8. "Romanisering" etableras och skapar ordets romanisering, som du kan använda som uttalsguide.
Jag rekommenderar att du använder principen "ett tecken per ljud" medan du behandlar ordet, och bara för in saker som "sh" i romaniseringen. Detta kommer att göra det mycket lättare att applicera dina regler. IPA (borde heta "IFA" på svenska, det Internationella Fonetiska Alfabetet) har fullt av praktiska symboler du kan utnyttja.

Betänk också att reglerna appliceras i den ordning de är listade. Så om du vill romanisera "tʃ" som "ch" och "ʃ" som "sh", se till att göra det i den ordningen, för annars kommer du att få "tsh". Gör längre ersättningar före kortare.

Det finns "Kortkommandon" och "Ordböcker". Ett kortkommando används för att slippa skriva en lång harang i många regler. Så istället för att skriva "[aeuoi]" så kan du lägga in det som ett kortkommando, och då kan du enkelt skriva till exempel "V" (för "vokaler") istället. Ordböcker är en sträng som, om du väljer att använda den i en regel, placeras sist i strängen du kollar, och tas sedan bort igen när regeln applicerats. Poängen med detta är att kunna göra listor med ersättningar utan att behöva göra en massa olika regler för dem. Detta görs genom ett litet regex-trick. Såhär kan det se ut:

Jag vill ersätta otonade konsonanter med deras tonade varianter när de uppträder efter en hård vokal. Jag skriver en ordbok som listar ersättningarna: "p>b t>d k>g f>v" och så vidare. Och så har jag ett kortkommando "A" för hårda vokaler och ett "P" för otonade konsnanter. Min regel ser ut såhär: "(A)(P)(?=.*\2>(.))", som ska ersättas av "$1$3". På regex-språk betyder det "Hitta en hård vokal, följd av en otonad konsonant, följd av en grupp som inte räknas in i träffen (och därmed inte blir ersatt), men som består av ett valfritt antal valfria tecken, följda av samma otonade konsonant som förut, följd av ">", följt av ett till tecken". Ersätt sedan detta med den första gruppen (hårda vokalen), följd av den tredje gruppen (tecknet efter ">"). Det här är lite komplicerat, så för att kunna skriva den här typen av regler behöver man kunna regex. Man kan göra samma sak utan regex, men då får man skriva en regel för varje kombination av hård vokal och otonad konsonant, vilket blir lite tradigt.
 
Last edited:

Genesis

Ni dés ni maître
Joined
17 Aug 2000
Messages
15,523
Location
Göteborg
Medan jag skrev här kom jag på att jag behövde en till regel, så jag uppdaterade filen i första inlägget. Nya regeln är: Om du skriver "x" kommer det att ersättas med ett slumpat ord, men inget kommer in i lexikonet. Anledningen till att detta behövs är för att du kan vilja ha viss regelbundenhet i dina ord, som kan skapas via affix. Säg att du har ett genussystem som i spanskan (bättre exempel än svenskan i detta fall). Du har maskulina ord som slutar på -o ich feminina som slutar på -a. Du kan nu generera dessa genom att skriva bil<x-FEM@s>. Ett ord slumpas fram, men lagras inte, sätts sedan ihop med ett suffix för femininum och bildar ordet för "bil", och detta ord läggs in i ditt lexikon. Det vore onödigt att behöva lägga in dubbla ord i detta fall, ett utan ändelse och ett med.

EDIT: Jag kom just på att man kan vilja tagga "x" med @u för en kortare bas. Just nu går inte det. Jag ska nog uppdatera det senare. Kommer antagligen att bli ett annat tecken, typ bara "u" istället.

EDIT2: Jag uppdaterade igen. Nu finns det två varianter, "x" och "y", där "y" använder längdinställningarna för affix. Och vill du kunna använda dem till annat kan du byta i inställningarna.
 
Last edited:

Genesis

Ni dés ni maître
Joined
17 Aug 2000
Messages
15,523
Location
Göteborg
Några funderingar på hur man kan använda dokumentet för vissa typer av grammatik.

Ordklasser utan regelbundna ändelser
Om man vill ha ett genussystem som svenskans, när du inte har tydliga ändelser på ordklasserna (eller spanskans, för den delen, där det finns undantag), hur gör man då? Du skulle till exempel kunna använda specifika ändelser i alla fall, och sedan ta bort dem i romaniseringen och ortografin, eller i sammansättningsreglerna när de kombineras med andra suffix. Så alla feminina substantiv slutar på "X" och manskulina på "Y". Sedan får du ta hänsyn till dem när du gör dina regler.

Toner, betoning, och liknande
Du kan absolut få med info om till exempel toner. Du kan till exempel indikera dem med en siffra. Betonade stavelser kan indikeras med en fnutt', och så vidare. Det går att göra, men ljudförändringsreglerna kanske blir lite mer komplicerade.

Infix
Jag har en markör för infix, men hur får jag in det i ordet? Jag kan ju inte gärna skriva "dr-PLU@i-og". Det kommer ju inte att funka. Jag skulle kunna dela upp alla ord i två delar när jag skapar dem, typ drog<drog1-drog2>, och sedan sätta infix emellan dem när de behövs. Eller, och den här lösningen skulle jag nog använda, så kan jag sätta infixet på slutet och sedan göra en sammansättningsregel för att få in det. För enkelhetens skull, säg att jag vill ha in det innan den sista bokstaven. Jag skulle kunna skriva en regel "(.)--~(.*?)~" och ersätta med "$2$1". För mer komplicerade infixsystem kanske jag behöver föra in en markör mellan stavelser för att kunna identifiera stavelsegränser, eller räkna vokaler, eller ovan nämnda markör för betonad stavelse, så att det fungerar som engelskans "fucking"-infix. Man kan ju inte säga "ab-fucking-solutely"; det måste komma före den betonade stavelsen.

Polysyntetiska språk
Dokumentet är uppenbarligen enklast att använda med isolerande språk, näst enklast med agglutinerande språk, och svårast med polysyntetiska språk. Men det senare kan antagligen enklast göras genom att du helt enkelt gör många komplicerade suffix istället för få enkla. Så istället för att rada upp "Göra-1PERS@s-FEM@s-DÅT@s", så får du göra ett komplext suffix "Göra-1PERSFEMDÅT@s". Detta kan dock ge ett lite kaotiskt intryck, då ändelser kommer att ha väldigt lite med varandra att göra (fast du kan säklart alltid redigera dem lite efteråt och generera om dina fraser). Ett annat sätt är att hantera det med regler. Sätt en regel att när detta suffix följs av detta, så kombineras de till detta. Många regler att skriva, men här kan du istället utnyttja regelbundenhet för att skapa mindre jobb för dig själv. Även om suffixen går ihop så kanske de gör det på ett regelbundet sätt (fusionellt agglutinerande).

Annat
Ja, du fattar principen. Det mesta går att lösa genom att uppfinna olika typer av markörer och skriva regler för hur de interagerar för varandra.
 

Genesis

Ni dés ni maître
Joined
17 Aug 2000
Messages
15,523
Location
Göteborg
Åh, det finns lite inställningar, också.

  • Homonymindex mäter sannolikheten att släppa igenom ett genererat ord som är identiskt med ett existerande. 0 släpper inte igenom några homonymer alls, och 1 släpper igenom alla. Hur många som faktiskt genereras beror på hur komplexa dina ljudgenereringstabeller är. Om de är relativt simpla, och dessutom olika viktade, så kommer du att få många homonymer och behöver ett lågt index. En annan inställning kanske har mycket högre komplexitet och du får väldigt få homonymer även med index 1. Om du använder detta för att skapa pussel åt dina spelare så kommer homonymer antagligen att driva dem till vansinne.
  • Längdinställningarna är fyra till antalet, gånger två för ord och affix. Formeln för att generera en ordlängd är rätt simpel. (min+R*(max-min))*var + bas*(1-var), där R är ett slumpat tal mellan 0 och 1. Tanken är att du sätter ett min och ett max, sedan ett "vanligt" antal stavelser, och variationen påverkar helt enkelt hur stor "dragningskraft" basvärdet har. Variation 0 ger alltid basvärdet, medan variation 1 ger ett helt slumpat värde mellan min och max.
  • Sedan kommer markörerna för affix och för oregistrerade ord, som jag redan förklarat ovan.
 
Last edited:

Genesis

Ni dés ni maître
Joined
17 Aug 2000
Messages
15,523
Location
Göteborg
Saker jag tänker mig att jag kanske inför om jag inte tröttnar:
  • Bättre knappar för att hantera listorna.
  • Ett verktyg för att importera en textfil, dela upp den vid punkt, och sedan lägga till meningarna i fraslistan, så att jag därefter kan jobba på att översätta dem. Även (eller kanske framför allt) ett som syr ihop romaniseringen eller ortografin till en kontinuerlig text.
  • Det vore coolt att kunna binda ihop flera språk. Så om jag har flera sådana dokument så kan jag automatiskt plocka in låneord från andra språk. Typ snuva{'ploppspråket'} triggar Excel att öppna upp ploppspråkets dokument, söka i dess lexikon efter ordet "snuva", generera ett nytt ord om det inte finns något, och sedan importera detta ord som ett låneord.
    • I mina vildaste fantasier skulle man kunna importera ortografin också, men det skulle kräva en hel del jobb att få till, då ortografi just nu inte genereras baserat på lexikon, utan skapas på nytt i varje fras.
    • Däremot skulle man kunna tänka sig ett "vidareutvecklat språk" där nästan alla ord är låneord från den äldre varianten. På detta sätt kan man skapa flera besläktade språk som hämtar sin basvokabulär från samma källa. I inställningarna skulle man kunna trigga att ord importeras om de inte specifikt taggas som något annat.
  • Jag skulle även gilla att kunna tagga låneord med ålder och ursprung. Ursprung bara för att det ska loggas i kommentarsfältet (just nu loggas bara att det är ett låneord), och ålder för att välja vilka ljudförändringar som ska appliceras. Gamla låneord förändras tillsammans med språket och blir till slut svåra att skilja från ursprungliga ord, medan yngre låneord tydligare sticker ut från sina fränder.
  • Bättre felhantering. Varningar vid felaktig formulering av "koden" (typ "husbil-<hus-bil>"), sådana saker.
 

2097

deleta mitt konto tack
Joined
20 Sep 2014
Messages
3,643
När jag läser det här tycker jag det verkar fantastiskt, Genesis ♥♥♥
Väldigt ambitiöst.
VBA kan jag inte öppna. Försökte med gnumeric men det lyckades inte. VBA var det näst första programmeringsspråket jag nånsin lärde mig när jag var jätteliten och det svjv enda som min mamma lärde sig innan hon lärde oss barn det. Först BAT-filer, sen visade hon oss QBasic som hon iofs inte kunde själv men hon visade var hjälp docsen fanns, och sen VBA som var hennes eget bread & butter. Fast det var många år sen jag kunde köra nåt av dom gamla programmen som jag och syrran gjorde då när vi var små eftersom jag blev hjärntvättad av en arg Debian som tonåring och är fortfarande kvar i den världen.

Det här dokumentet är lingvistikgrunderna nedkokat till ett fantastiskt dokument vars like ingen skådat på den här sidan jbofihe. Finns gott om random name generators och liknande och det här är så långt bortom dom att det är inte bara 10 ggr utan även 100 ggr ballare. Är jätteimponerad samtidigt som det är heartbreaking att det ligger i just Excel och VBA ist för nästan vadsomhelst annat. Lisp, Ruby, Perl, Node, till och med Python…
Du är bäst!♥ Vill använda det! Men kan inte.
 

Genesis

Ni dés ni maître
Joined
17 Aug 2000
Messages
15,523
Location
Göteborg
Asch, så retligt! Jag inser såklart att VBA inte är något "riktigt" programmeringsspråk, men för en ickeprogrammerare som mig så är det väldigt lättillgängligt. Jag behöver inte skriva ett helt program för databashantering, grafiska interface och annat, jag behöver ingen kompilator, inget krångel. Bara skriva koden och köra. Började lära mig Java ett tag, men det var en jättehög tröskel och jag tröttnade. Jag skulle använda det för att kontrollera mitt CAD-program på jobbet och automatisera lite grejor. Men när jag gav upp (lyckades aldrig ens få det att kontakta programmet) såg jag att det även fanns ett VB-API, och jag kunde styra direkt från Excel. Så då blev det språket jag lärde mig. Förlåt att jag inte är en bättre kodare!
 

2097

deleta mitt konto tack
Joined
20 Sep 2014
Messages
3,643
VBA och kalkylarksspråk är bra och det verkar passa just den här problemdomänen ganska bra så jag menar inte att elitistsnobba mot det in sich, men eftersom det är ett ofritt format ist för en läsbar källis i plaintext (eller ja jo jag vet ju att det går att få en XML osv) blir det lite svårt att göra nåt med det💔

Om nån lyckas få igång Genesis' språk-ark mha Libre eller Gnumeric eller liknande så får dom gärna höra av sig till mig♥
 

Genesis

Ni dés ni maître
Joined
17 Aug 2000
Messages
15,523
Location
Göteborg
Ja, det är synd; jag hade verkligen hoppats att få dina kommentarer på det. En emulator och en testversion av Excel skulle säkert funka, men jag fattar att det är mycket meck för ett enda dokument. Internet säger att OpenOffice kan köra VBA? Jag är inte heller superförtjust i att använda en Microsoft-lösning (jag skrev det på jobbdatorn; min privata är en Mac!). Verkar som att det finns en del andra öppnare språk. Hur svårt är det att konvertera ett VBA-skript till något lite öppnare?
 

2097

deleta mitt konto tack
Joined
20 Sep 2014
Messages
3,643
Mmm… provade att öppna i libre men får BASIC runtime error. '423' ListObjects.

Det är just att VBA är ett av dom svåraste systemet att konvertera från som gör det så vanskligt att investera in saker i 😭

Jag har ju kommenterat & blivit imponerad av det utifrån din beskrivning i själva tråden här. Är helt golvad över hur fett det är.
 

Genesis

Ni dés ni maître
Joined
17 Aug 2000
Messages
15,523
Location
Göteborg
Ja, ListObjects är ju själva tabellerna, så om Libre inte kan köra kod med dem är det nog rätt kört. Det används ju hela tiden i dokumentet.

Det är lugnt, jag är tacksam för dina värmande ord!
 

2097

deleta mitt konto tack
Joined
20 Sep 2014
Messages
3,643
Började pilla i källisen till din xlsm (är ju i sig en zipfil) men ramlar på att vbaProject.bin är binär. Öppnade den med hexl-mode men kunde bara plocka ut enstaka ord.
 
Top