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.


In reply to Re: Comparitive Scoring System by mstone
in thread Comparitive Scoring System by gwhite

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.