We started our brainstorming trying to identify the ingredients that are required for a good story, and we agreed the most important one is the "plot twist", i.e. the moment where something unexpected happens, creating dramaticc tension and interrupting the flow of an otherwise very obvious (and boring) series of events.
Thus, we decided to generate stories using action pairs from Scéalextric, where the two actions are connected with a "but". A quick test confirmed that a story with the following structure can already be considered reasonable and meaningful:
However, we were still missing something that would make our stories unique and more interesting. We decided that playing with stereotypes could be an interesting choice for that: they are often widely recognizable and they can be fun when inverted or when they are not taken seriously.
To do so, the first thing that is required is a resource linking a category (e.g. "actors", "Canadians", "women") to a negative trait (e.g. being vulgar, narcissistic, posh, absent-minded). We tried to do this annotation partly automatical, by checking which traits are shared by most members of each category in the NOC list (for example, which are the most common properties of actors), but the results were rather disappointing. We thus decided to manually annotate the data we needed, i.e.:
- the grouping criterion (e.g. members of the NOC list where "Address 3" is "USA", or "Category" is "Policeman")
- stereotypical traits for the group thus identified (e.g. "ignorant" or "corrupt")
This data can be found in Dr.No's_Stereotypes.xlsx, in the Google Drive folder linked at the end of this post.
One important choice still had to be made: would our story confirm or disrupt the stereotype? In this second case, the story would be more "acceptable" from a moral point of view, and it could add another level of "unexpectedness" (e.g. imagine the story starting with "Most people think all Italians are cheaters", thus leading you in a direction, but then, suddenly, the Italian protagonist is betrayed by his partner for no particular reason: who could see this coming?). However, it seemed to us that linking stereotypical traits (e.g. "being a cheater", "being lazy", ...) to actions that disconfirm them is actually harder and more time-consuming than doing the opposite (e.g. linking "being a cheater" with "betraying"). So we settled for this approach and created another manually annotated resource, Dr.No's_Stereotypical_trait-Action.xlsx.
Here we connected a trait ("corrupt") to one or more actions in Scéalextric that are typically done by someone with this trait ("being corrupted by someone"). We also annotated whether the person with the trait should be the subject or the object of an action (as in "someone corrupts somebody", where the trait should be associated to the second actor).
So, the algorithm now becomes:
- Pick a random action pair where "but" connects the two actions
- Pick a random stereotypical trait that is connected with the action in the second part of the action pair. If none exist, pick another action pair.
- Pick a random member from the NOC list that belongs to a category with the stereotypical trait. If none exist, pick another action pair.
- Pick another random member from the NOC list as the other actor.
- Generate the following story:
We have also decided to introduce a fictional narrator that is telling the story, and showing the moral (i.e. it applies the trait of the specific actor to the whole category). This way we can also introduce a third character in the generated story, adding a bit more variety.
This is supported by two other resources, Dr.No's_Openings.xlsx and Dr.No's_Conclusions.xlsx, where the narrator is introduced and the moral is drawn respectively. We were going to select a random narrator from a list of well known people that are known for not being the smartest on the planet, and that could possibly believe in stereotypes (e.g. Donald Trump, Kim Kardashian, Lindsay Lohan), but the code was not yet updated to do this, and sets "Dr. No" as the narrator for every story.
Last but not least, we tried to experiment with slightly longer stories using action triples: the algorithm is exactly the same, with the exception that -instead of selecting a random action pair connected by "but"- we select an action triple where "but" connects the last two actions.
The code, the resources and a README decsribing them can be found at http://bit.do/Dr_No
--Dr. No Team
(Robert Costa, Lorenzo Gatti, Lieven Menschaert, Charles Pierse and Stefan Riegl)