Exemplo n.º 1
0
        string morphword(string word)
        {
            string end    = "";
            string tmpbuf = "";

            if (word == null)
            {
                return(null);
            }
            Exceptions e   = new Exceptions(word, pos);
            string     tmp = e.next();

            if (tmp != null)
            {
                return(tmp);
            }
            if (pos.name == "adverb")
            {
                return(null);
            }
            if (pos.name == "noun")
            {
                if (word.EndsWith("ful"))
                {
                    tmpbuf = word.Substring(0, word.Length - 3);
                    end    = "ful";
                }
                else if (word.EndsWith("ss") || word.Length <= 2)
                {
                    return(null);
                }
            }
            if (tmpbuf.Length == 0)
            {
                tmpbuf = word;
            }
            int offset = offsets[pos.ident];
            int cnt    = cnts[pos.ident];

            for (int i = 0; i < cnt; i++)
            {
                if (tmpbuf.EndsWith(sufx[i + offset]))
                {
                    // TDMS 11 Oct 2005 - bug fix - "word" substituted with "tmpbuf" as per
                    // wordnet code morph.c
                    //string retval = word.Substring(0,word.Length-sufx[i+offset].Length)+addr[i+offset];
                    string retval = tmpbuf.Substring(0, tmpbuf.Length - sufx[i + offset].Length) + addr[i + offset];
                    if (WNDB.is_defined(retval, pos).NonEmpty)
                    {
                        return(retval + end);
                    }
                }
            }
            return(null);
        }
Exemplo n.º 2
0
        public string next()
        {
            string word, tmp;
            int    prep, cnt, st_idx = 0, end_idx = 0, end_idx1, end_idx2;
            string append = "";

            /* first time through for this string */
            if (firsttime)
            {
                firsttime = false;
                cnt       = str.Split('_').Length;
                svprep    = 0;

                /* first try exception list */
                e = new Exceptions(str, pos);
                if ((tmp = e.next()) != null && tmp != str)
                {
                    svcnt = 1;                   /* force next time to pass NULL */
                    return(tmp);
                }
                /* then try simply morph on original string */
                if (pos.name != "verb" && ((tmp = morphword(str)) != null) && str != tmp)
                {
                    return(tmp);
                }
                if (pos.name == "verb" && cnt > 1 && (prep = hasprep(str, cnt)) != 0)
                {
                    svprep = prep;
                    return(morphprep(str));
                }
                else
                {
                    svcnt = cnt = str.Split('_').Length;
                    while (--cnt > 0)
                    {
                        end_idx1 = str.Substring(st_idx).IndexOf('_') + st_idx;
                        end_idx2 = str.Substring(st_idx).IndexOf('-') + st_idx;
                        if (end_idx1 >= st_idx && end_idx2 >= st_idx)
                        {
                            if (end_idx1 < end_idx2)
                            {
                                end_idx = end_idx1;
                                append  = "_";
                            }
                            else
                            {
                                end_idx = end_idx2;
                                append  = "-";
                            }
                        }
                        else if (end_idx1 >= st_idx)
                        {
                            end_idx = end_idx1;
                            append  = "_";
                        }
                        else
                        {
                            end_idx = end_idx2;
                            append  = "-";
                        }
                        if (end_idx < 0)
                        {
                            return(null);
                        }
                        word = str.Substring(st_idx, end_idx - st_idx);
                        if ((tmp = morphword(word)) != null)
                        {
                            searchstr += tmp;
                        }
                        else
                        {
                            searchstr += word;
                        }
                        searchstr += append;
                        st_idx     = end_idx + 1;
                    }
                    word = str.Substring(st_idx);
                    if ((tmp = morphword(word)) != null)
                    {
                        searchstr += tmp;
                    }
                    else
                    {
                        searchstr += word;
                    }
                    if (searchstr != str && WNDB.is_defined(searchstr, pos).NonEmpty)
                    {
                        return(searchstr);
                    }
                    else
                    {
                        return(null);
                    }
                }
            }
            else              // not firsttime
            {
                if (svprep > 0)
                {
                    svprep = 0;
                    return(null);
                }
                else if (svcnt == 1)
                {
                    return(e.next());
                }
                else
                {
                    svcnt = 1;
                    e     = new Exceptions(str, pos);
                    if ((tmp = e.next()) != null && tmp != str)
                    {
                        return(tmp);
                    }
                    return(null);
                }
            }
        }
Exemplo n.º 3
0
        string morphprep(string s)
        {
            string excWord, lastwd = null;
            int    i, offset, cnt, rest, last;
            string word, end, retval;

            /* Assume that the verb is the first word in the phrase.  Strip it
             * off, check for validity, then try various morphs with the
             * rest of the phrase tacked on, trying to find a match. */

            rest = s.IndexOf('_');
            last = s.LastIndexOf('_');
            end  = "";
            if (rest != last)
            {             // more than 2 words
                lastwd = morphword(s.Substring(last + 1));
                if (lastwd != null)
                {
                    end = s.Substring(rest, last - rest + 1) + lastwd;
                }
            }
            word = s.Substring(0, rest);
            for (i = 0; i < word.Length; i++)
            {
                if (!char.IsLetterOrDigit(word[i]))
                {
                    return(null);
                }
            }
            offset = offsets[PartOfSpeech.of("verb").ident];
            cnt    = cnts[PartOfSpeech.of("verb").ident];
            /* First try to find the verb in the exception list */
            Exceptions e = new Exceptions(word, PartOfSpeech.of("verb"));

            while ((excWord = e.next()) != null && excWord != word)
            {
                retval = excWord + s.Substring(rest);
                if (WNDB.is_defined(retval, PartOfSpeech.of("verb")).NonEmpty)
                {
                    return(retval);
                }
                else if (lastwd != null)
                {
                    retval = excWord + end;
                    if (WNDB.is_defined(retval, PartOfSpeech.of("verb")).NonEmpty)
                    {
                        return(retval);
                    }
                }
            }
            for (i = 0; i < cnt; i++)
            {
                if ((excWord = wordbase(word, i + offset)) != null && excWord != word)        // ending is different
                {
                    retval = excWord + s.Substring(rest);
                    if (WNDB.is_defined(retval, PartOfSpeech.of("verb")).NonEmpty)
                    {
                        return(retval);
                    }
                    else if (lastwd != null)
                    {
                        retval = excWord + end;
                        if (WNDB.is_defined(retval, PartOfSpeech.of("verb")).NonEmpty)
                        {
                            return(retval);
                        }
                    }
                }
            }
            retval = word + s.Substring(rest);
            if (s != retval)
            {
                return(retval);
            }
            if (lastwd != null)
            {
                retval = word + end;
                if (s != retval)
                {
                    return(retval);
                }
            }
            return(null);
        }