Skip to content

Commit

Permalink
Mezcla
Browse files Browse the repository at this point in the history
  • Loading branch information
vtamara committed Aug 18, 2020
2 parents b036e11 + 2778ccb commit 068b9fe
Show file tree
Hide file tree
Showing 55 changed files with 12,422 additions and 6,707 deletions.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
*.o

# ignorar todos los archivos *.indice
**.indice
**.relacion

*~
Make.inc

Expand Down
81 changes: 46 additions & 35 deletions NodoTrieS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ set<Pos>
}


/** Retorna nueva raíz.
/** Retorna nueva raíz tras insertar pal (posiblemente ya normalizada en UTF-8).
* Pensando en siguiente arbol
* BUEN -> PODEROSO
* |
Expand Down Expand Up @@ -149,7 +149,7 @@ NodoTrieS::inserta(string pal, Pos p)
delete npos;
}

/** Retorna nueva raíz.
/** Retorna nueva raíz tras insertar pal (posiblemente ya normalizada en UTF-8).
* Pensando en siguiente arbol
* BUEN -> PODEROSO
* |
Expand All @@ -172,6 +172,7 @@ NodoTrieS::inserta(string pal, Pos p)
void
NodoTrieS::inserta(string pal, set<Pos> *npos)
{
// clog << "insertando la palabra: " << pal << std::endl;
//cerr << "OJO " << "inserta("<< pal << ", "<< p << ")" << endl;
if (pal == cad) {
//cerr << " OJO pal == cad"<<endl;
Expand Down Expand Up @@ -508,30 +509,35 @@ NodoTrieS::renumeraDocs(vector<int64_t> renum)


/** Construye un trieS a partir de un texto plano */
void leeTexto(const char *na, uint32_t ndoc, NodoTrieS &t, bool normalizaPal)
void leeTexto(const char *na, uint32_t ndoc, NodoTrieS &t, bool normalizaPal,
bool latin1)
{
ASSERT(na!=NULL && na[0] != '\0' && strlen(na)<FILENAME_MAX);
ASSERT(ndoc >= 0);

string pal;
//clog<<"Leyendo de "<<na<<endl;
// clog<<"Leyendo de "<<na<<endl;
//
// Error si no existe
ifstream fs(na);
if (!fs.is_open()) {
return;
}

uint32_t p;
do {
p = fs.tellg();
//clog << "OJO p=" << p << endl;
// clog << "OJO p=" << p << endl;
fs >> pal;
if (pal.size() >= MAXCAD) {
pal = pal.substr(0, MAXCAD);
}
if (!fs.eof()) {
//clog<<"Leida "<<pal<<endl;
// clog<<"Leida "<<pal<<endl;
if (p >= 0) {
// tellg comienza en 0 toca + 1
t.insertaNormalizando(pal, ndoc, p + 1,
normalizaPal);
t.insertaNormalizando(pal, ndoc, p + 1,
normalizaPal, latin1);
}
}
} while (!fs.eof());
Expand All @@ -546,33 +552,34 @@ void leeTexto(const char *na, uint32_t ndoc, NodoTrieS &t, bool normalizaPal)
bool es_signo_punt(unsigned char c)
{
if (c < '0' || (c > '9' && c < 'A') || (c > 'Z' && c < 'a')) {
//clog << c << "si es signo de puntuación" << endl;
// clog << c << "si es signo de puntuación" << endl;
return true;
}

return false;
}

/**
/**
* Inserta una palabra normalizandola antes si normaliza es true
* @param pal Palabra por insertar
* @param pal Palabra por insertar
* @param numdoc Numero de documento en el que insertará
* @param pini Posición inicial donde insertará
* @param normaliza Indica si debe o no normalizar
* @param latin1 Indica si pal está en codificación LATIN1
*/
void
NodoTrieS::insertaNormalizando(string pal, uint32_t numdoc, uint32_t p, bool
normalizaPal)
normalizaPal, bool latin1)
{
string r;
if (normalizaPal) {
r = normaliza(pal);
r = normaliza(pal, latin1);
} else {
r = pal;
}
if (r.size()>0) {
inserta(r, Pos(numdoc, p));
//clog<<" Insertada"<<endl;
// clog<<" Insertada"<<endl;
}
}

Expand All @@ -584,62 +591,66 @@ NodoTrieS::insertaNormalizando(string pal, uint32_t numdoc, uint32_t p, bool
* @param etiqueta Por agregar a cada palabra
* @param numdoc Número de documento del cual provienen
* @param pini Posición inicial en documento de la cadena c
* @param latin1 Lo que se agregará está en codificacíon LATIN1
*/
void
NodoTrieS::insertaConEtiqueta(string c, string etiqueta,
uint32_t numdoc, uint32_t pini)
uint32_t numdoc, uint32_t pini, bool latin1)

{
ASSERT(c != "");
ASSERT(etiqueta != "");
string::iterator i;
int i;
string o = "";
int p, inio;
for (p = pini, inio = 0, i = c.begin(); i != c.end(); p++ , i++) {
//clog << "insertaConEtiqueta: " << *i << endl;
if (*i == '.') {
//clog << "OJO Punto: " << *i << endl;
for (p = pini, inio = 0, i = 0; i < c.length(); p++ , i++) {
// clog << "insertaConEtiqueta: " << c[i] << endl;
if (c[i] == '.') {
// clog << "OJO Punto: " << c[i] << endl;
if (o.length() > 0) {
string ot =
normaliza(etiqueta) + string(":") + o;
string ot = normaliza(etiqueta, latin1) + string(":") + o;
if (ot.length() >= MAXCAD) {
ot = ot.substr(0, MAXCAD);
//clog << "OJO Cortamos 1" << endl;
// clog << "OJO Cortamos 1" << endl;
}
////clog << o << endl;
// clog << o << endl;
inserta(ot, Pos(numdoc, p));
}
o += ".";
//inio = p + 1;
//o = "";
} else if (isspace(*i) || es_signo_punt(*i)) {
//clog << "Espacio o punct: " << *i << ", o.length()=" << o.length() << endl;
} else if (isspace(c[i]) || es_signo_punt(c[i])) {
// clog << "Espacio o punct: " << *i << ", o.length()=" << o.length() << endl;
if (o.length() > 0) {
o = normaliza(etiqueta) + string(":") + o;
//clog << "tras unidr o.length()=" << o.length() << " y MAXCAD=" << MAXCAD << endl;
o = normaliza(etiqueta, latin1) + string(":") + o;
// clog << "tras unidr o.length()=" << o.length() << " y MAXCAD=" << MAXCAD << endl;

if (o.length() >= MAXCAD) {
o = o.substr(0, MAXCAD);
//clog << "OJO Cortamos" << endl;
// clog << "OJO Cortamos" << endl;
}
////clog << o << endl;
// clog << o << endl;
inserta(o, Pos(numdoc, p));
}
inio = p + 1;
o = "";
} else if (o.length() < (MAXCAD - etiqueta.length() -1)) {
//clog << o << endl;
o += normalizaCaracter(*i);
//clog << o << endl;
// clog << o << endl;
std::string temps;
temps = c.substr(i);
int inc = 0;
o += normalizaCaracter(temps, inc);
i += (inc - 1);
// clog << o << endl;
}
}
if (o.length() > 0) {
// Insertar palabra anterior si hay
o = normaliza(etiqueta) + string(":") + o;
o = normaliza(etiqueta, latin1) + string(":") + o;
if (o.length() >= MAXCAD) {
o = o.substr(0, MAXCAD);
}
//clog << o << endl;
// clog << o << endl;
inserta(o, Pos(numdoc, p));
}
}
11 changes: 8 additions & 3 deletions NodoTrieS.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,11 @@ class NodoTrieS
* @param numdoc Numero de documento en el que insertará
* @param pini Posición inicial donde insertará
* @param normaliza Indica si debe o no normalizar
* @param latin Indica si pal está en codificación LATIN1
*/
void insertaNormalizando(string pal, uint32_t numdoc,
uint32_t p, bool normalizaPal);
uint32_t p, bool normalizaPal,
bool latin1 = false);

/** Inserta más ocurrencias de la palabra pal, reportandolas en
* posiciones npos.
Expand Down Expand Up @@ -176,10 +178,12 @@ class NodoTrieS
* @param etiqueta Por agregar a cada palabra
* @param numdoc Número de documento del cual provienen
* @param pini Posición inicial en documento de la cadena c
* @param latin1 Lo que se agregara está en LATIN1
*/
void insertaConEtiqueta(string c, string etiqueta,
uint32_t numdoc,
uint32_t pini);
uint32_t pini,
bool latin1 = false);

};

Expand All @@ -189,9 +193,10 @@ class NodoTrieS
* @param ndoc Número de documento
* @param t Donde se leera trieS
* @param normalizaPal Si debe o no normalizar cada palabra leida
* @param latin1 Si el texto está en codificación LATIN1 dlc es UTF-8
**/
void leeTexto(const char *na, uint32_t ndoc, NodoTrieS &t,
bool normalizaPal = true);
bool normalizaPal = true, bool latin1 = false);


#endif
19 changes: 14 additions & 5 deletions NodoTrieSCasoPrueba.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,19 +187,28 @@ void NodoTrieSCasoPrueba::prueba_renumeraDocs()
void NodoTrieSCasoPrueba::prueba_leeTexto()
{
NodoTrieS t;
leeTexto("verdad.txt", 1, t, false);
//clog << "t=" << t.preorden() << endl;
CPPUNIT_ASSERT(t.preorden() == "LAIBERAR\xC1NOSSIVERDAD");
leeTexto("regr/verdad-latin1.txt", 1, t, false, true);
CPPUNIT_ASSERT(t.preorden() == "LAIBERAR\xC1,NOSSIVERDAD");

NodoTrieS u;
leeTexto("verdadlarga.txt", 1, u, false);
leeTexto("regr/verdadlarga-latin1.txt", 1, u, false, true);
//clog << "u=" << u.preorden() << endl;
CPPUNIT_ASSERT(u.preorden() == "LAVERDADSINOSLIBERAR\xC1SIABCDEFGHI");

NodoTrieS v;
leeTexto("verdad.txt", 1, v, true);
leeTexto("regr/verdad-latin1.txt", 1, v, true, true);
//clog << "v=" << v.preorden() << endl;
CPPUNIT_ASSERT(v.preorden() == "LIBERARANOSSIVERDAD");

NodoTrieS w;
leeTexto("regr/verdad-utf8.txt", 1, w, false, false);
CPPUNIT_ASSERT(w.preorden() == "LAIBERARÁ,NOSSIVERDAD");

NodoTrieS x;
leeTexto("regr/verdad-utf8.txt", 1, x, true, false);
clog << endl << "x=" << x.preorden() << endl;
CPPUNIT_ASSERT(x.preorden() == "LIBERARANOSSIVERDAD");

}

void NodoTrieSCasoPrueba::setUp()
Expand Down
87 changes: 82 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,29 +1,106 @@
Mt77 es un motor de búsqueda rápido, preciso, apto para indexación
distribuida y de dominio público

1. Características:
# 1. Características:
- Más veloz en búsquedas que Lucene y que Amberfish, aunque los
índices son más grandes y requieren más tiempo de construcción
- Especialmente diseñado para textos en Español
- Puede leer textos planos, archivos XML, HTML, PDF y ODF
- Puede leer textos planos en codificación UTF-8, archivos XML, HTML, PDF,
ODF y textos planos en codificación LATIN1 con la opción `-l` del
indexador y del buscador
- Permite buscar una o varias palabras, así como una o más cadenas
- Permite indexar y buscar metainformación (título, tipo de archivo,
sitio de origen, etiquetas XML)
- Escrito en C++ siguiendo estándares, con pruebas de unidad
(con make limpia; make prueba; make unidad) y de regresión (con make limpia; make prueba; make regr)
(con `make limpia; make prueba; make unidad`) y de regresión
(con `make limpia; make prueba; make regr`)

2. Herramientas que produce

# 2. Ejemplo de compilación y uso

Primero compile con:
```
./conf.sh
make
```

Que entre otras generará las herramientas `indexador` y `buscador` para
crear un índice y para buscar sobre un índice.

Con las fuentes se incluyen textos de prueba en el directorio `regr` como
por ejemplo el evangelio de Mateo como texto plano en codificacíon UTF-8
`regr/mateo-utf8.txt`.

Para crear un índice `m.indice` (con relación de documentos indexados
`m.relacion`) con las palabras de `regr/mateo-utf8.txt` referenciado el
texto con el URL <https://traduccion.pasosdeJesus.org>:
```
rm -f m.indice m.relacion t.indice;
./indexador m.indice t.indice 'https://traduccion.pasosdeJesus.org' regr/mateo-utf8.txt
```

Para búscar la palabra VERDAD en el índice creado:
```
./buscador m.indice VERDAD
```

Que retornará un JSON indicando que encontró 14 ocurrencias de la palabra:
```
{
"consulta": "VERDAD",
"documentos": 1,
"inicio": 1,
"fin": 1,
"resultados": [
{ "url": "https://traduccion.pasosdeJesus.orgregr/mateo-utf8.txt",
"frec": "14",
"fecha": "2020-08-17"
}
]
}
```

Para agrega al mismo índice índice `m.indice` (con relación `m.relacion`) las
palabras de `regr/marcos-utf8.txt`:
```
./indexador m.indice t.indice 'https://traduccion.pasosdeJesus.org' regr/marcos-utf8.txt
```

Y al repetir la misma búsqueda ya se obtendrán 1 resultado en Marcos y
los 14 de Mateo:
```
$ ./buscador m.indice VERDAD
{
"consulta": "VERDAD",
"documentos": 2,
"inicio": 1,
"fin": 2,
"resultados": [
{ "url": "https://traduccion.pasosdeJesus.orgregr/marcos-utf8.txt",
"frec": "1",
"fecha": "2020-08-18"
},
{ "url": "https://traduccion.pasosdeJesus.orgregr/mateo-utf8.txt",
"frec": "14",
"fecha": "2020-08-17"
}
]
}
```

# 3. Herramientas que produce al compilar

Consta de las siguientes herramientas:

- __buscador__ para buscar palabras o metainformación en un índice
- __depueraindice__ para examinar un índice interactivamente
- __indexador__ para crear un índice a partir de uno o más textos
- __operaindice__ para mezclar índices en disco o RAM y hacer otras operaciones
- __txtdeodt__ extraer texto de un documento odt (Open Document Format)
- __unzipuno__ extraer un sólo archivo de un conteneder ZIP
- __tomsha256__ Calcula hash sha256 empleando rutina de libtomcrypt-1.16

3. Herramientas para el desarrollo y estándares
# 4. Herramientas para el desarrollo y estándares

- `make doctec` Genera documentación de fuentes
- `make unidad` Ejecuta pruebas de unidad. Pero sólo debe hacerse después de
Expand Down
Loading

0 comments on commit 068b9fe

Please sign in to comment.