I don't know of any modules, but fuzzy logic includes a concept called 'hedging' that may work for you.
Technically, a hedge modifies a fuzzy value. As a rough example, if 'old' means 'more than 50', the hedge 'very' would make 'very old' mean 'more than 80'. Individually, hedges provide a convenient way to model human terms like 'roughly', 'mostly', 'vaguely' and so on.
Hedges tend to have the same effect on any modificand. The hedge 'very' does the same thing to 'very old' that it does to 'very tall', 'very close', 'very green', etc. That uniformity produces an interesting side-effect when you compare hedges to each other.
The relative effect of two hedges tends to remain uniform regardless of modificand. 'Very' is always bigger than 'mostly', regardless of what you modify. That means you can build a set of hedges that form a reliable ordinal scale (one that defines an order, i.e.: this one comes before that one) for any set of terms.
In other words, hedges let you mark off two endpoints of a line -- 'absolutely X' and 'absolutely not X' -- then define a reliable sequence of positions along that line. And once you have a reliable sequence, you can sort things.
Now for the sake of vocabulary, let's call that line an axis. If we use more than one value for X, we create a space with multiple axes. We could make a three-dimensional space with axes for 'big', 'green', and 'loud', for instance. Then we can define objects with 3-dimensional points that represent their position in that space. A regular frog would sit at the low end of all three axes, while a 50' heavy-metal Irish frog would go to the high end of all three. The ocean would score high for 'big' and medium for 'green' and 'loud'.
To select objects that are similar, we simply chop out a region whose center falls at a given point. If you want to be simple, you can make the region an N-dimensional cube.. anything within two ticks of point 'the sea' on any axis, for instance. If you want to be fancy, you can make it an N-dimensional sphere.
Finally, you can hedge the modificand 'closeness' to determine the size of the region. 'very close' would generate a small region, while 'sorta close' would generate a larger one.
Algorithmically, this reduces your problem to range evaluation, which is a known subject. Some databases (postgresql) even have geometric operators that will decide whether a given point falls inside a given region. The big job will be to choose a set of qualities to use as axes, then to assign a position in that space for every project in your table.
Hope that at least gives you some ideas to kick around.