Not really a Rails post but...

This isn't really a Rails post but this group has given such great responses to a range of questions over the years I though I'd ask anyway.

I've been tasked with writting a Rails app that takes a block of text, anywhere from about 50 characters up to 300 characters - about a sentance or two, and compares it to other similar sized blocks of text and compares how similar they are, content wise and contextually. It doesn't have to be perfect but it has to be reasonably close. I was thinking that it would be good to be able to get a numerical score depending on how close they were (90 is really close, 20 is not very close at all) but I'm certainly open to ideas.

Anyway, the problem is I have no idea how to do this or even where to look to get started. I really doubt that there is already a Ruby library to do this (although that would rock) , or a Rails plug-in (although that would rock really hard) so I'm more looking for ideas on what I should be reading to get a sense on how to start on this. Anything would help, theoretical ideas, technical papers, Wikipedia articles, anything.

Anyway, any suggestions are greatly appreciated. Dale

This might be useful:

  http://engtagger.rubyforge.org/

PeteSalty wrote:

This isn't really a Rails post but this group has given such great responses to a range of questions over the years I though I'd ask anyway.

That's not a good reason to ask off-topic questions. :slight_smile: [...]

Anyway, the problem is I have no idea how to do this or even where to look to get started.

A quick Google search would have readily turned up the phrase "Levenshtein distance".

Good luck. Next time, though, keep your queries on topic and do a little more research of your own before posting!

Best,

Hi Dale, It is a good ruby question (and rails is a ruby framework--so I think it is fair game). I don't know that the Levenshtien suggestion will be that helpful. (You can try it with require 'text', since it is part of the built in text module) The algorithm it uses is based on the number of changes that need to be made in one string to get a second (deletions, substitions, and additions). It is nice for comparing words for possible misspellings etc. But in your case, if you want to compare content, you need an approach that focuses on word frequency and context. Here Levenshtien is not the right tool (at least, doesn't seem so to me).

Endtagger looks interesting module--could be useful.

Here is a third proposal--What about breaking the text into chunks-- one-word fragments, two-word fragments, three-word fragments and then doing a subtraction of one array of fragments from the other (fragments generated from 2nd sentence)? A perfect match would leave an empty array, while less perfect matches would leave more fragments. It might take some tinkering to get the algorithm tuned right, but how much tinkering depends on how much information you need to get from the poorer matches. The single word fragments compare for content, the double and triple word fragments would compare context. Good luck, Tim

timr wrote:

Hi Dale, It is a good ruby question (and rails is a ruby framework--so I think it is fair game).

[...]

I daresay most people on this list would disagree. There are other lists and newsgroups for general Ruby questions. This is specifically a Rails list, not a general Ruby one. The fact that Rails is written in Ruby is irrelevant to the issue.

Best,

Thanks to everyone for the suggestions, especially Tim for taking the time to write up what I think is a really good idea. I'm going to take a crack at this and if it works out and I can get the algorithm tuned we'll release it as a gem (or possibly a plugin).

Once again, thanks for all the suggestions, it's what makes this list great.

Dale

I just wanted to chime in and say that I've gained utility from dale's post and welcome posts such as this as I find them the most interesting and thought provoking kind of posts. Before reading this thread i would have had no idea what a Levenshtein distance is, but now i can file that away for future reference if i ever come across such a problem.

and so I really don't know, Marnen, how you can "daresay most people on this list would disagree." Do you know a majority of the people on this list? I'm not saying I do...in fact, I'm saying i don't, and don't suppose to speak for them. On your part, it seems like a rather bold, unsupportable statement to speak for a majority of the opinions of what I understand to be a large amount of fairly opinionated people, as both you and I seem to be.

Just to be clear, Marnen, I'm not disagreeing with your desire to keep the list on topic, and think you are completely valid in having your own opinion that the question does not belong on the list, but I think that attempting to speak for a majority of the list is...i'm not sure...philosophically incorrect? I would have preferred if you had spoken for yourself the way timr did when he said: "It is a good ruby question (and rails is a ruby framework--so I think it is fair game)."

Dale, as for your problem, i'm not sure i understand what you necessarily mean by context, but i get the idea that you are being asked to compare the meaning of the two sentences...or no? If that is the case, then loose ideas i'm having are: 1) take a sentence from each and use a dictionary reference to count the nouns, verbs, and adjectives. 2) take a word from one sentence and use a thesauraus to see if it matches up with a word from the other sentence

cheers, -Gabe