コード例 #1
0
ファイル: morph.cs プロジェクト: cuiwanyun/KBQA
 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;
 }
コード例 #2
0
ファイル: morph.cs プロジェクト: cuiwanyun/KBQA
        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;
        }
コード例 #3
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);
                }
            }
        }
コード例 #4
0
ファイル: morph.cs プロジェクト: cuiwanyun/KBQA
        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;
                }
            }
        }
コード例 #5
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);
        }