COOPY » Guide  version 0.6.5
/home/paulfitz/cvs/coopy_scm/coopy/src/libcoopy_core/DataColumn.cpp
Go to the documentation of this file.
00001 #include <string.h>
00002 
00003 #include <coopy/DataColumn.h>
00004 
00005 using namespace std;
00006 using namespace coopy::store;
00007 using namespace coopy::cmp;
00008 
00009 #define FMAX(x,y) (((x)>(y))?(x):(y))
00010 
00011 void Nature::evaluate(const char *txt, bool forward) {
00012   string s = txt;
00013   size_t i;
00014 
00015   if (s=="NULL") {
00016     nully.vote(1,1);
00017     s = "";
00018   } else {
00019     nully.vote(-1,0.1);
00020   }
00021 
00022   // How URL-like are we?
00023 
00024   int webby = 0;
00025 
00026   i=s.find("http://");
00027   if (i!=string::npos) {
00028     if (i<=1) {
00029       webby += 100;
00030     } else {
00031       webby += 1;
00032     }
00033   }
00034   i=s.find("://");
00035   if (i!=string::npos) {
00036     if (i<=10) {
00037       webby += 5;
00038     } else {
00039       webby += 1;
00040     }
00041   }
00042   i=s.find("www.");
00043   if (i==string::npos) {
00044     i=s.find(".com");
00045   }
00046   if (i==string::npos) {
00047     i=s.find(".net");
00048   }
00049   if (i==string::npos) {
00050     i=s.find(".org");
00051   }
00052   if (i==string::npos) {
00053     i=s.find(".coop");
00054   }
00055   if (i!=string::npos) {
00056     webby += 1;
00057   }
00058   if (webby>=1) {
00059     web.vote(1,webby/10.0);
00060   } else {
00061     web.vote(-1,0.1);
00062   }
00063 
00064   // How email-like are we?
00065   int maily = 0;
00066   i=s.find("@");
00067   if (i!=string::npos) {
00068     i=s.find(".");
00069     if (i!=string::npos) {
00070       maily = 1;
00071     }
00072   }
00073   if (maily>=1) {
00074     email.vote(1,1);
00075   } else {
00076     email.vote(-1,0.1);
00077   }
00078 
00079   // How number-like are we?
00080   int numbery = 0;
00081   int nonnumbery = 0;
00082   int integral = 0;
00083   int nonintegral = 0;
00084   int caps = 0;
00085   int noncaps = 0;
00086   int spaces = 0;
00087   int total = 0;
00088   for (size_t j=0; j<s.length(); j++) {
00089     char ch = s[j];
00090     if (ch>='0'&&ch<='9') {
00091       numbery++;
00092       if (j==1&&s[0]=='0') {
00093         nonintegral++;
00094       }
00095       integral++;
00096     } else {
00097       nonintegral++;
00098       if (ch!='.'&&ch!='-'&&ch!='e'&&ch!='E') {
00099         numbery--;
00100         nonnumbery++;
00101       }
00102     }
00103     if (ch>='A'&&ch<='Z') {
00104       caps++;
00105     } else if (ch>='a'&&ch<='z') {
00106       noncaps++;
00107     }
00108     if (ch==' ') {
00109       spaces++;
00110     }
00111     total++;
00112   }
00113   if (numbery>0) {
00114     if (nonnumbery==0) {
00115       number.vote(1,1);
00116     } else {
00117       number.vote(1,numbery/4.0);
00118     }
00119   } else {
00120     number.vote(-1,0.1);
00121   }
00122   if (integral&&!nonintegral) {
00123     type_integer.vote(1,1,forward);
00124   } else {
00125     type_integer.vote(-1,1,forward);
00126   }
00127   if (caps&&!noncaps) {
00128     if (caps>total/2) {
00129       cappy.vote(1,1);
00130     } else {
00131       cappy.vote(-1,1);
00132     }
00133   } else {
00134     cappy.vote(-1,1);
00135   }
00136   if (noncaps>=1 && noncaps>total*0.75 && !caps && !spaces) {
00137     lowy.vote(1,1);
00138   } else {
00139     lowy.vote(-1,1);
00140   }
00141 
00142   text.vote(1,0.1);
00143 }
00144 
00145 void Nature::show() {
00146   printf("web %g email %g text %g number %g nully %g cappy %g lowy %g\n",
00147          web.result(),
00148          email.result(),
00149          text.result(),
00150          number.result(),
00151          nully.result(),
00152          cappy.result(),
00153          lowy.result());
00154 }
00155 
00156 float Nature::compare(const std::string& txt, bool forward, int) {
00157   Nature n;
00158   n.evaluate(txt.c_str(),forward);
00159   float dot = n.web.result()*web.result() +
00160     n.email.result()*email.result() +
00161     n.text.result()*text.result() +
00162     n.number.result()*number.result() +
00163     n.nully.result()*nully.result() +
00164     n.cappy.result()*cappy.result() +
00165     n.lowy.result()*lowy.result();
00166   return dot;
00167 }
00168 
00169 
00170 float Nature::confidence() {
00171   float c = FMAX(FMAX(FMAX(web.confidence,email.confidence),
00172                       FMAX(text.confidence,number.confidence)),
00173                  nully.confidence);
00174   return c;
00175 }
00176 
00177 
00178 void DataColumn::evaluate() {
00179   nmean.clear();
00180   for (int i=0; i<height(); i++) {
00181     nmean.evaluate(sheet->cellString(index,i).c_str());
00182   }
00183 }
00184 
00185 void DataColumn::unevaluate(int top) {
00186   for (int i=0; i<=top; i++) {
00187     nmean.evaluate(sheet->cellString(index,i).c_str(),false);
00188   }
00189 }
00190 
00191 
00192 
00193 void DataColumnPair::compare(DataColumn& a, DataColumn& b) {
00194 }
00195 
00196 
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines