I too am in a similar situation, and am on Win32, so my options are limited, but one module I ran across that seems to merit some looking into is
Lingua::En::Infinitive. What it does, is attempt to take off the conjugated ending, and returns 2 results, which you could then compare against your master list. So, in the case of 'swimming', it should return as one of the choices, 'swim'. So, I guess my best suggestion would be to look into that module, and then combine pattern matching, and possibly Metaphone or DoubleMetaphone, mentioned earlier. I don't think there's any one overall module, but a combination approach I think will be helpful.