What I want to do is in any way produce a picture that looks like this

Given a set of words, how can I partition a disk into bricks for these words, such that it looks good?
Here is my sucky construction:
h = 1.3;
w = 8;
R = 22.2;
f[m_] = Abs[Sqrt[R^2 - (R - h*m)^2]];
Table[
Table[
{-f[m], 0} + {n*w, R - h*m} + {w, h} Random[]/10,
{n, 0, Ceiling[2 f[m]/w]}
], {m, 0, Ceiling[2 R/h]}];
coordinates = Flatten[%, 1];
with a list
colorlist = {"DarkRainbow", "Rainbow", "Pastel", "Aquamarine",
"BrassTones", "BrownCyanTones", "CherryTones", "CoffeeTones",
"FuchsiaTones", "GrayTones", "GrayYellowTones", "GreenPinkTones",
"PigeonTones", "RedBlueTones", "RustTones", "SiennaTones",
"ValentineTones", "AlpineColors", "ArmyColors", "AtlanticColors",
"AuroraColors", "AvocadoColors", "BeachColors", "CandyColors",
"CMYKColors", "DeepSeaColors", "FallColors", "FruitPunchColors",
"IslandColors", "LakeColors", "MintColors", "NeonColors",
"PearlColors", "PlumColors", "RoseColors", "SolarColors",
"SouthwestColors", "StarryNightColors", "SunsetColors",
"ThermometerColors", "WatermelonColors", "RedGreenSplit",
"DarkTerrain", "GreenBrownTerrain", "LightTerrain", "SandyTerrain",
"BlueGreenYellow", "LightTemperatureMap", "TemperatureMap",
"BrightBands", "DarkBands"};
colorlist2 = {colorlist, colorlist, colorlist, colorlist} // Flatten;
such that I can plot it
Length[coordinates] "Points"
Length[colorlist2] "Items"
Graphics[Point[coordinates]]
Graphics[
Table[
{Text[Style[colorlist2[[i]], Small], coordinates[[i]]]},
{i, 1, Min[Length@colorlist2, Length@coordinates]}]
]


Explainations:
f[m_] parameterizes the left edge of a cricle, then I generate the coordinates by counting from top to bottom and from left to right until I reach 2R or the bound given by f[m_], respectively.
The vectors "{w, h} Random[]/10" are my attempt to make the thing a little more smooth looking. I like it a little shaky.
The list of colors is of course just a random example.
and I'm sure it could look better in general.
There are several problems with my approach.
Some of them are optics, for example:
The structure is to rigit and depending on the values R, h and w, some patterns emergy, like the bows you see in the pic.
This might be a little difficult to resolve completely, but since some words are longer than others, the words tend to lie above each other.
Other problems:
I essentially have to match the two lists every time I change the list of words. I mean it's not the end of the world, but it's not too nice.
In the end the words are themed and they will make up clusters, don't know if I can be helped with speeding the sorting up though.
...
Also, I'd appreciate a hint how I can read in the strings for the script from a text file, where each line contains one of the words.


Import["file.txt", "Lines"]– Szabolcs Mar 9 '12 at 19:44