Can I use Mathematica to generate candle scents?
Here is a poor mans version with no ML.
words = candlenames // Map[StringSplit /* TextWords] // Flatten // DeleteStopwords;
SeedRandom[111];
Table[RandomSample[words, 2], 10] // Map[StringRiffle[#, " "] &]
(*
{"Cinnamon Caramel", "Boston Cherry", "Oatmeal Cupcake", "Citrus Hot", "Black Vanilla",
"Honeysuckle Ocean", "Country Musk", "Cupcake Brown", "Sleep Rain", "Cherries Musk"}
*)
You might be wanting something more skilled using GTP-2 and etc. However I found with fairly little work I could get some fun results.
First I simply took your list and used the GPT-2 net to create the 768 vector values for each candle name...
candlenames = data from link
model = NetModel["GPT-2 Transformer Trained on WebText Data"]
coor = Table[model[candlenames[[i]]], {i, 1, Length[candlenames]}];
I then took the coor
data and took the median of each vector value and gave each name a point value.
preditiondata = Table[candlenames[[i]] -> First[Mean[coor[[i]]]], {i, 1, Length[candlenames]}];
p = Predict[preditiondata, Method -> "NeuralNetwork"]
After this I naively generated a list of 50, 000 adjective and noun combinations
names = {RandomWord["Adjective", 50000] RandomWord["Noun", 50000]};
Which is hilarious enough as it is....
RandomChoice[list, 10]
$$\{\text{lush} \text{ tractor},\text{erasable} \text{ toiler},\text{ frosted} \text{haulage},\text{contraceptive} \text{ temporal},\text{dowse} \text{ sociable},\text{adjunct} \text{ largo},\text{garbed} \text{ investiture},\text{deprecating} \text{ info},\text{advance} \text{ overhang},\text{oration} \text{ undiscovered}\}$$
Lush Tractor and Contraceptive Temporal probably being my favourite candle scents....
Anyways, I then used the predictor to give what i hoped to be good names based off of high values from the list of candle names given...which depending on the person was a wild success or huge statistical failure.
results = Table[{list[[i]], p[ToString[list[[i]]]]}, {i, 1, Length[list]}];
names = Position[results, n_ /; n > 1.8]
Sort[Table[results[[First[names[[i]]]]], {i, 1, Length[names]}], #1[[2]] > #2[[2]] &] // MatrixForm
I picked as an arbitrary value above 2 as it seemed to give me results that seemed plausible.
$ \left( \begin{array}{cc} \text{breeze} \text{ exclamatory} & 2.9989 \\ \text{breeze} \text{ smoldering} & 2.9989 \\ \text{avenged} \text{ breeze} & 2.63791 \\ \text{avocado} \text{ weathered} & 2.3345 \\ \text{enchanted} \text{ oxbow} & 2.2121 \\ \text{enchanted} \text{ propagator} & 2.2121 \\ \text{enchanted} \text{ proceeds} & 2.2121 \\ \text{enchanted} \text{ endocrine} & 2.2121 \\ \text{enchanted} \text{ submergence} & 2.2121 \\ \text{enchanted} \text{ torturer} & 2.2121 \\ \text{harvest} \text{ inconsiderable} & 2.20732 \\ \text{harvest} \text{ simplified} & 2.20732 \\ \text{autumn} \text{ unparalleled} & 2.18493 \\ \text{fruit} \text{ venomous} & 2.15026 \\ \end{array} \right) $
In this random list it appears "autumn","enchanted" and "breeze" are popular candle scent titles...I expect because they show up often in the list. By using RandomWord[]
more clever and using Predict
in combination with the GPT-2 vector values, one could probably get a much better results...However names are quite subjective and I enjoyed the results I got. Maybe this will inspire someone more clever than I.
** Update **
To attempt to get some better names, took all the string names and split them into individual words gave them a weighting through word frequency and ran them through the predictor again with the full names
words = Table[StringSplit[candlenames[[i]]], {i, 1, Length[candlenames]}] // Flatten;
swords = DeleteDuplicates[words];
totalwords = StringJoin[Riffle[words, " "]];
weightedvalues = Table[swords[[i]] -> 1000 WordFrequency[totalwords, ToString[swords[[i]]]], {i, 1, Length[swords]}]
data = Join[Table[weightedvalues[[i]], {i, 1, Length[weightedvalues]}], Table[candlenames[[i]] -> First[Mean[coor[[i]]]], {i, 1, Length[candlenames]}]];
p = Predict[data, Method -> "NeuralNetwork"]
Now generate the words:
SeedRandom[113]
list = RandomWord["Adjective", limit] RandomWord["Noun", limit];
listnn = RandomWord["Noun", limit, IncludeInflections -> True] RandomWord[limit, IncludeInflections -> True];
l1 = RandomWord["Noun", limit];
l2 = RandomChoice[{2, 0.01} -> {" ", " & "}, limit];
l3 = RandomWord["Noun", limit];
stringlist1 = Table[ToString[list[[i]]], {i, 1, Length[list]}];
stringlist2 = Table[ToString[listnn[[i]]], {i, 1, Length[listnn]}];
namelist = Join[Table[StringJoin[l1[[i]], l2[[i]], l3[[i]]], {i, 1, Length[l1]}], stringlist1, stringlist2];
Pass the data through the predictor,
results = Table[{namelist[[i]], p[namelist[[i]]]}, {i, 1, Length[namelist]}];
names = Position[results, n_ /; n > 0.757];
Sort[Table[results[[First[names[[i]]]]], {i, 1, Length[names]}], #1[[2]] > #2[[2]] &] // MatrixForm
This has given me many different results, but the new weighting makes a heavy difference it seems. I have gotten some interesting results. The weighting would have to be adjusted some more
Some of my favourites:
Niobium spice, Absurd Grapefruit, Fruit Obtrusive, Telemarketing Lumberjack, Fated Mango, Valley & Rhapsody, Claptrap Brew
However, it's taken 60, 000 random generated results to get these and most seem to be better for IPA beers.
Regardless a bit of fun.