努力,成長,提高

          在追求中進(jìn)步
          數(shù)據(jù)加載中……
          用JAVA實現(xiàn)AI
          從小就有一個夢想,將來開發(fā)機(jī)器人,說白了,就是人工智能。現(xiàn)在看來,可喜的是,做的是軟件這行,還有點可行性,可惜的是,做的工作與人工智能不搭嘎,工作又太累,天天加班不說,大老遠(yuǎn)跑回家,就沒那么多時間去思考,學(xué)習(xí)人工智能了。徘徊猶豫了幾個月,一直沒有決心去寫代碼,這不,終于決定繼續(xù)小時候的夢想,開始了用java實現(xiàn)人工智能的第一步了,那就是用java來分析語義,讓我們從頭開始。
          我的第一個Milestone很簡單,用戶輸入一些語句作為java的知識源,然后程序自動分析推導(dǎo)出其他的事實。Come up some examples:
          ~X(Man(X)>Die(X))
          Man(Socrates)
          這是兩個事實,程序應(yīng)該要給出Die(Socrates),那第一階段就算完成。
          ~代表任意,這主要是任意的符號不好打,就用波浪線代替了。->用>來代替。存在用@, 否用!, 交用&,或用|,等價就用=
          要完成第一階段得分兩步,第一部是分析語句,第二部分是根據(jù)規(guī)則來進(jìn)行推導(dǎo)。這第一部分已經(jīng)完成了。實現(xiàn)的思路:本來是要參考編譯器的,后來想想借鑒一下即可,采用了遞歸的方法。還需要測試,如果有bug,還請批評指正。
          如果您也對于人工智能有興趣,或者想合作開發(fā)一些賺錢的項目,java或者iphone的都可以,歡迎和我聯(lián)系,我的QQ627423443

          第一部分代碼如下:
          /**
           * 
           
          */

          package src.analyser;

          import java.util.ArrayList;
          import java.util.List;

          import utils.StringUtils;

          /**
           * 
          @author ken
           * 
           
          */

          public class BasicAnalyser {

              
          private List<String> predicationList = new ArrayList<String>();

              
          public boolean isSentence(String exp) {
                  exp 
          = exp.trim();

                  
          if (StringUtils.isEmpty(exp)) {
                      
          return false;
                  }

                  exp 
          = StringUtils.trimBracket(exp);
                  
          if (isAtomicSentence(exp)) {
                      
          return true;
                  }


                  
          if (exp.charAt(0== '!'{
                      
          return isSentence(exp.substring(1));
                  }
           else if (exp.charAt(0== '~' || exp.charAt(0== '@'{
                      
          // means any or exist, must followed by VAR
                      String tmp = "";
                      
          int i = 0;
                      
          for (i = 1; i < exp.length(); i++{
                          
          if ((exp.charAt(i) >= 'A' && exp.charAt(i) <= 'Z'|| exp.charAt(i) == '_'{
                              tmp 
          = tmp + exp.charAt(i);
                          }
           else {
                              
          break;
                          }

                      }

                      
          if (i >= exp.length()) {
                          
          // means ~X
                          return false;
                      }
           else {
                          
          return isSentence(exp.substring(i));
                      }

                  }
           else {
                      
          // means S1 op S2
                      StringBuffer lastSentence = new StringBuffer();
                      
          int leftBracketNum = 0;
                      
          int rightBracketNum = 0;
                      
          for (int i = 0; i < exp.length(); i++{
                          
          if (isOperator(exp.charAt(i))) {
                              
          if (leftBracketNum == rightBracketNum) {
                                  
          if (i >= exp.length()) {
                                      
          return false;
                                  }
           else {
                                      
          if (isSentence(lastSentence.toString()) && isSentence(exp.substring(i + 1))) {
                                          
          return true;
                                      }
           else {
                                          
          return false;
                                      }

                                  }

                              }


                          }
           else {
                              
          if (exp.charAt(i) == '('{
                                  leftBracketNum
          ++;
                              }
           else if (exp.charAt(i) == ')'{
                                  rightBracketNum
          ++;
                              }

                              lastSentence 
          = lastSentence.append(exp.charAt(i));
                          }

                      }


                  }

                  
          return false;

              }


              
          private boolean isOperator(char x) {
                  
          return x == '|' || x == '&' || x == '>' || x == '=';
              }


              
          public boolean isVar(String expression) {

                  expression.trim();
                  expression 
          = StringUtils.trimBracket(expression);
                  
          if (StringUtils.isEmpty(expression)) {
                      
          return false;
                  }

                  
          if (expression.charAt(0>= 'A' && expression.charAt(0<= 'Z'{
                      
          for (int i = 1; i < expression.length(); i++{
                          
          if ((expression.charAt(i) >= 'a' && expression.charAt(0<= 'z'|| (expression.charAt(i) >= 'A' && expression.charAt(i) <= 'Z')
                                  
          || expression.charAt(i) == '_'{
                              
          // do nothing
                          }
           else {
                              
          return false;
                          }

                      }

                      
          return true;
                  }

                  
          return false;
              }


              
          public boolean isConstant(String expression) {
                  expression.trim();
                  expression 
          = StringUtils.trimBracket(expression);
                  
          if (StringUtils.isEmpty(expression)) {
                      
          return false;
                  }

                  
          if (expression.charAt(0>= 'a' && expression.charAt(0<= 'z'{
                      
          for (int i = 1; i < expression.length(); i++{
                          
          if ((expression.charAt(i) >= 'a' && expression.charAt(0<= 'z'|| (expression.charAt(i) >= 'A' && expression.charAt(i) <= 'Z')
                                  
          || expression.charAt(i) == '_'{
                              
          // do nothing
                          }
           else {
                              
          return false;
                          }

                      }

                      
          return true;
                  }

                  
          return false;
              }


              
          public boolean isLikeFormFunc(String expression, boolean upperCase) {
                  
          if (StringUtils.isEmpty(expression)) {
                      
          return false;
                  }

                  
          char startLetterFrom = upperCase ? 'A' : 'a';
                  
          char startLetterTo = upperCase ? 'Z' : 'z';
                  expression.trim();
                  expression 
          = StringUtils.trimBracket(expression);
                  expression 
          = expression.replaceAll(" """);
                  
          if (expression.charAt(0>= startLetterFrom && expression.charAt(0<= startLetterTo) {
                      
          int leftBracket = 0;
                      
          int rightBracket = 0;
                      StringBuffer lastString 
          = new StringBuffer();
                      
          for (int i = 0; i < expression.length(); i++{
                          
          if (leftBracket == 0{
                              
          if (!((expression.charAt(i) >= 'A' && expression.charAt(i) <= 'Z')
                                      
          || (expression.charAt(i) >= 'a' && expression.charAt(i) <= 'z'|| expression.charAt(i) == '_' || expression.charAt(i) == '(')) {
                                  
          return false;// illegal
                              }

                          }

                          
          if (expression.charAt(i) == '('{
                              leftBracket
          ++;
                              
          if (leftBracket > 1{
                                  lastString.append(expression.charAt(i));
                              }

                          }
           else if (expression.charAt(i) == ')'{
                              
          if (i == expression.length() - 1{
                                  
          // last one
                                  if (!isVar(lastString.toString()) && !isConstant(lastString.toString()) && !isFunction(lastString.toString())) {
                                      
          return false;
                                  }
           else {
                                      
          return true;
                                  }

                              }

                              rightBracket
          ++;
                              lastString.append(expression.charAt(i));
                          }
           else if (expression.charAt(i) == ','{
                              
          if (leftBracket - rightBracket == 1{
                                  
          if (!isVar(lastString.toString()) && !isConstant(lastString.toString()) && !isFunction(lastString.toString())) {
                                      
          return false;
                                  }

                                  lastString 
          = new StringBuffer();
                              }
           else {
                                  lastString.append(expression.charAt(i));
                              }

                          }
           else {
                              
          if (leftBracket != 0{
                                  lastString.append(expression.charAt(i));
                              }

                          }

                      }

                  }

                  
          return false;
              }


              
          public boolean isAtomicSentence(String expression) {
                  
          // Friends(father_of(david),mother_of(peter))
                  boolean isJustification = isLikeFormFunc(expression, true);
                  
          if (isJustification) {
                      predicationList.add(expression);
                  }

                  
          return isJustification;
              }


              
          public boolean isFunction(String expression) {
                  
          return isLikeFormFunc(expression, false);
              }


              
          public static void main(String[] args) {
                  BasicAnalyser x 
          = new BasicAnalyser();
                  String m 
          = "Test(test(t),a,b)&Fuck(st,m)>Monday(today)";
                  System.out.println(x.isSentence(m));
                  
          for (int i = 0; i < x.getPredicationList().size(); i++{
                      System.out.println(x.getPredicationList().get(i));
                      
                  }

              }


              
          public List<String> getPredicationList() {
                  
          return predicationList;
              }


              
          public void setPredicationList(List<String> predicationList) {
                  
          this.predicationList = predicationList;
              }

          }

          posted on 2010-06-06 23:59 孔陽 閱讀(7875) 評論(5)  編輯  收藏

          評論

          # re: 用JAVA實現(xiàn)AI 2010-06-07 11:41 loadingsmc

          很有同感,聯(lián)系聯(lián)系.我的聯(lián)系QQ50744447/MSN:simaqinshan@hotmial.com
            回復(fù)  更多評論    

          # re: 用JAVA實現(xiàn)AI 2010-06-07 12:42 doublekill

          支持
            回復(fù)  更多評論    

          # re: 用JAVA實現(xiàn)AI[未登錄] 2010-06-07 17:35 過客

          語法分析機(jī)器人,毫無意義,如果沒有意識,只是機(jī)器人
            回復(fù)  更多評論    

          # re: 用JAVA實現(xiàn)AI 2010-06-10 21:26 激進(jìn)派

          哥們兒,這也是我的夢想,而且,我也曾想過語義分析著一個模塊,一樣因為工作的原因,沒有機(jī)會寫代碼,但是,我看了你的代碼,恕我不能茍同你的思路,沒有經(jīng)過ai核心而分解的語言,又何談?wù)Z義?我以前想過這個東西至少要經(jīng)過好幾個模塊的共同協(xié)作才能分析出來。最簡單的也要調(diào)用詞組庫,甚至要與場景相關(guān),構(gòu)建場景等等,有興趣咱可Q聯(lián) 9624022
            回復(fù)  更多評論    

          # re: 用JAVA實現(xiàn)AI 2010-06-12 13:41 wang zhongyu

          可以用jboss的rule engine等開源產(chǎn)品?前段時間看過一點點,覺得可行。那里面有fact,knowlege和result的概念,另外knowlegdge里可以將規(guī)則按照優(yōu)先級排序。代碼也是java的。祝樓主早日夢想成真~
            回復(fù)  更多評論    

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 宁武县| 吴堡县| 民丰县| 平邑县| 巴彦淖尔市| 定陶县| 南木林县| 荣成市| 兴城市| 泗洪县| 衡阳市| 石景山区| 南靖县| 株洲县| 怀远县| 洮南市| 车险| 师宗县| 祁东县| 乐安县| 灵丘县| 沙坪坝区| 乌海市| 扶绥县| 江城| 鲁山县| 博乐市| 东台市| 安岳县| 福安市| 河池市| 西城区| 卢湾区| 卫辉市| 赣州市| 璧山县| 内乡县| 老河口市| 平度市| 溧阳市| 宣城市|