Como harian su propio Bot?

Iniciado por $Edu$, 27 Enero 2013, 01:06 AM

0 Miembros y 1 Visitante están viendo este tema.

$Edu$

Estoy esperando hace tiempo que sea gratis esa asistente Denise xD

daryo

#11
bue mira aunque no tengo ni idea del tema se me ocurren varias cosas:

1.el bot tiene una base de datos con varias palabras catalogadas segun el tipo de palabra que sea verbo sujeto adjetivo etc

2. el bot captura en su base de datos palabras que digan otros usuarios y con analisis sintactico de determinadas frases pueda aprender que tipo de palabra es

3. el bot tiene respuestas predefinidas en caso de no saber que decir ; hay muchas frases estandar cuando queremos desviar la conversacion o algo por estilo XD

4. no estaria mal que el bot tuviera ciertas expresiones predeterminadas en su base de datos .

5. que identificara cierto numero de preguntas comunes .

6. que haga preguntas.

5. la personalidad quedaria definida en  varias cosas entre ellas: un diferente vocabulario(en caso que sea mas agresivo o mas servicial el vocabulario es diferente) y en como responderia las diferentes preguntas para que en caso de preguntar la edad diga que tenga la de su personalidad o en caso de ser mujer u hombre .

7. cierto tipo de patrones para que sigua un tema en especifico ( repetir ciertas palabras entre otros mas complejos)

en fin suerte en el  gigantesco proyecto XD
buenas

$Edu$

Jajaja gracias! yo simplemente sueño, no hare nada, no he ni escrito una palabra en codigo, pero me gusta esto y esta bueno tener ideas para cuando sepa del tema poder aplicarlas, pero de todas formas hacer algo de esto solo, sin una empresa que te respalde es casi imposible.

0x120x7

#13
Buenas, bueno, yo habia entrado aqui buscando tutoriales de hackeo para win, pero como estoy tan rayado ya... y vi tu post y como es algo que intente en el pasado pues te comento una idea que se me ha ocurrido.

Ya en el pasado probe a hacer algo parecido. En una ocasion hice un bot de IRC, muy sencillo, era un simple bicho que respondia a comandos o preguntas estrictas con respuestas o acciones predeterminadas. Fin. Eso no tiene mucha gracia, verdad?

En otra ocasion intente con redes neuronales. Eso tiene mas gracia, pero no se puede hacer a lo loco. Las redes neuronales artificiales responden a los entrenamientos, si. Pero no se puede simplemente darle una entrada de datos totalmente arbitraria, sin haberla preparado para que tenga un cierto sentido estructural antes, y esperar que la red neuronal responda de manera inteligente. Al menos no con una red de tan pocas neuronas y de estructura tan simple como las que permiten los ordenadores(si, soy español) de hoy dia. Finalmente intente crear un programa de entrenamiento neuronal, que consistia en hacer permutaciones de la estructura neuronal, hasta dar con la estructura mas eficiente para el resultado buscado. Generalmente el entrenamiento neuronal consiste en un reajuste de los pesos de los puentes neuronales para adecuar la respuesta dada a la respuesta esperada; asi que modificar la estructura neuronal era ir un pasito mas alla, pero tampoco es que hiciera milagros. No suele haber indicadores a la hora de diseñar la estructura neuronal que mejor realice un trabajo determinado; es mas una cuestion de prueba y error. Por eso era importante para mi automatizar este proceso de modificacion de la estructura y ver hasta donde podia llegar.

Lo que se me ha ocurrido es lo siguiente(no se si es algo descabellado):

Crear tablas de significado unico por cada palabra, y conseguir un significado unico y completo (como el humano) por cada frase -> procesarlo por una red neuronal -> traducir la respuesta a la inversa con dichas tablas. Me explico:

Analogia:
Como formamos 256 numeros unicos(significados unicos) con tan solo un byte?
Un byte tiene 8 bits. Cada uno de ellos tiene dos unicos estados (1 o 0), pero combinando cada uno de ellos en sus distintos estados conseguimos 256 numeros distintos. Esto funciona porque cada bit es interpretado segun la posicion que ocupa dentro del byte.

Si decimos que cada uno de esos bits es una palabra o la raiz de una palabra (que tiene significado unico por si sola), y los combinamos de manera analoga a como se hace en el byte, obtendriamos 256 significados unicos (frases de diferente significado)

Esto se hace mediante ORs. Por ejemplo:

1: perro
2: bonito
4: esta
8: triste
16: gato
32: feo
64: corre
128: feliz

perro bonito esta triste -> 1+2+4+8 = 15 (15 seria el significado unico que representaria a la frase "(el) perro bonito esta triste")
gato feo corre feliz -> 16+32+64+128 = 240 (240 seria el significado unico que representaria a la frase "(el) gato feo corre feliz")
perro feliz esta feo -> 1+128+4+32 = 165 (165 seria el significado unico que representaria a la frase "(el) perro feliz esta feo")
etc

Esto tiene un problema:
p.e.: "el perro feliz esta feo" y "el perro feo esta feliz" tendria el mismo significado, pero sabemos que en realidad no es asi. No es lo mismo "el perro (que es) feliz esta feo", que "el perro (que es feo) esta feliz". Lo primero apunta a un perro que por lo general suele estar feliz, o que en ese momento esta feliz, y le añade a este un estado (esta feo). Lo segundo apunta a un perro cuya caracteristica es la de ser feo, y añade un significado de estado: esta feliz.

La solucion pasaria por un filtrado de subsecciones semanticas o sintacticas del lenguaje. Obtener el valor significativo unico de cada subseccion, y OR'earlo a la sección padre junto con un bit extra que le indique a la sección padre, que el significado proviene de una sección hija, de modo que el significado final del padre, sea el conjunto completo de padre e hijo y la diferenciacion clara de lo que es el padre y lo que es el hijo. (Esto se me esta complicando ;) ) No tengo muy claro hasta que punto seria esto factible. Voy con un ejemplo, a ver si me puedo aclarar yo mismo, jaja:

De hecho, he pensado que seria imposible determinar el padre y el hijo mediante un solo bit. Por eso creo que la manera adecuada, seria mediante el posicionamiento de los bytes. Vamos a determinar que el byte mas anterior sea el padre del siguiente. Ejemplo:
"el perro feliz esta feo":
"el perro feliz" -> 1+128 = 129
"esta feo" -> 4+32 = 36
"el perro feliz" "esta feo" -> 129 36
si esto lo traducimos en bits, usando dos bytes y no uno, seria:
10000001 00100100
si en lugar de OR'ear estos dos bytes (como haciamos antes con todos los bits) interpretamos los dos bytes tal cual, es decir, asignando nuevos valores de significado unico para los bits del byte superior (el anterior), tendriamos un significado unico de:
33060

"el perro feo esta feliz":
"el perro feo" -> 1+32 = 33
"esta feliz" -> 4+128 = 132
"el perro feo" "esta feliz" -> 33 132
00100001 10000100
8580

Por tanto ahora cada frase tendria un significado completamente distinto, justo como en la realidad.

Y procederiamos asi indefinidamente hasta resolver toda la jerarquia sintactica :)

Mas problemas:
Hay que tener en cuenta que el español, por ejemplo, consta de unas 90mil palabras.
Si cada palabra tomara un valor unico y OR'eable como se explico al principio, tendriamos valores ENORMES, que ningun ordenador actual seria capaz de procesar directamente, PERO, mediante un proceso secuencial, se podria lograr. Es decir, el ordenador no necesita saber que un significado consta de 100mil bytes(por ejemplo), solo necesita procesarlo adecuadamente, con la unidad mayor de informacion de que sea capaz (bytes, palabras de 64bits, etc).
Si ademas, añadimos el hecho de que deberemos utilizar secciones del numero de bits que corresponda al conjunto de todas las palabras del lenguaje, y que cada subseccion semantica podria ser hija de otra sección, tendriamos numeros ASTRONOMICOS. Por ejemplo, si el español consta de unas 90mil palabras, deberiamos manejar secciones compuestas de 90mil bits. Como "esta feo" es una subseccion semantica que pertenece a "el perro feliz", tendriamos una entrada de nada menos que 180mil bits.

Empieza a parecerme que mi acercamiento a la interpretacion del lenguaje humano, aunque parece ser factible y funcional, es ,hoy por hoy, impractico :)

En definitiva, este seria el proceso que yo utilizaria principalmente:

*Filtrar la entrada: eliminar palabras carentes de significado per se, como los articulos determinados (el la), etc.
*procesar la estructura sintactica de la entrada y encontrar las antedichas subsecciones semanticas
*alimentar el valor significativo y unico final a una red neuronal
*entrenar dicha red para que responda:
-con acciones
-con lenguaje humano: se procesa la salida de manera inversa a como se proceso la entrada alimentada a la red, traduciendo mediante tablas las diferentes subsecciones semanticas, obteniendo una estructura sintactica final con sentido semantico unico

Y ya, para terminar, el summum del summum:
*que el ordenador modifique la estructura de su propia red neuronal, acorde con el significado extraido de la entrada:
Al principio, podria modificarse a si mismo, segun lo que interprete de lo que le digamos, en definitiva solo estaria siguiendo ordenes complejas, nada nuevo.
Si le programamos una subrutina que se lance cuando el significado unico de la entrada diga algo asi como "te odio" o "me parece que eres tonto", etc. Esta subrutina podria hacer modificaciones estructurales minimas en la red neuronal, de modo que la siguiente entrada no seria interpretada exactamente del mismo modo que la primera vez, pero aun conserva la capacidad suficiente de interpretacion como para tener un alto grado de coherencia en sus respuestas. Sin embargo, tras ciertas llamadas a esta subrutina, se experimentaria un cambio(experiencia) final que se alejaria mas y mas del entrenamiento inicial(nacimiento), llegando al punto de que el sistema pudiera generar autenticas nuevas salidas(soluciones, opinion), y que no reaccionara del mismo modo anterior para llamar a su subrutina de modificacion estructural(comportamiento, se vuelve terco o complejo).

Por supuesto habria que mantener unos bancos de memoria enormes para almacenar la serie de entradas y salidas pasadas, un historico, y darle una subrutina para que el mismo pueda comprobarlas cuando reaccione a una determinada entrada, que bien pudiera haberse diluido o modificado de la inicial puesto que recordemos que incluimos una subrutina de modificacion estructural. De este modo, gozaria de un simil de la memoria humana, y accederia a ella, para sumarsela a la entrada, segun la entrada inicial lo exigiera, dando como resultado algo que no depende exclusivamente de la entrada recibida ni de su estructura neuronal, sino tambien de su memoria o experiencia(mas alla de su estructura neuronal).

Tambien podria incluirse el factor tiempo, para que pueda recordar y goce de un pensamiento mas humano. Se incluiria una subrutina cuyo proposito fuera el de llamar a la subrutina de acceso a los bancos de memoria (recordar), cogiendo varios y alimentandolos como entrada, para generar una nueva salida, que como ya habreis adivinado, puede ser decir algo, o realizar una accion practica, entre las que se incluirian las susodichas subrutinas de modificacion estructural, acceso a memoria pasada, y alimentacion a la misma subrutina tiempo inicializandola con valores basados en la entrada, para que, segun la entrada, sea llamada en un determinado siguiente momento... Y vuelva a recordar, y a modificarse a si mismo, etc, etc, etc...

Pfiuuu...
Bueno, pues eso es lo que yo NO haria jajajajaja
Yo cogeria algo hecho ya por ahi, e intentaria adaptarlo a mis necesidades.
Como elucubracion esta bonito, pero como proyecto practico queda bastante alejado de la realidad, me parece a mi.
Pero oye, si conseguis hacerlo asi como yo he dicho, me encantaria verlo. Seria algo asi como una conciencia en si misma...
Me avisais cuando lo hagais jajaja ;)

Saludos

Edito:
Un par de apuntes mas (o elucubraciones):

*Aclarar que el procesamiento de numeros mas grandes de los que puede manejar el ordenador no es ninguna invencion, y es perfectamente factible. Si tenemos un sistema de arquitectura de 64bits, con un S.O. de 64 bits, abrimos una calculadora y calculamos el valor de 2 elevado a 64, vemos que nos da el resultado decimal, pero si seguimos sumandole 1, 1, 1... el resultado no se vuelve cero ni mucho menos. El programa de calculo utiliza este sistema de procesamiento al que me referi anteriormente, y nos sigue dando numeros mas altos de los que el sistema es capaz de utilizar per se.

*Habiamos calculado que "el perro feliz esta feo" ocuparia nada menos que 180mil bits, lo que viene a ser 21Kbs nada menos! Pero hay que tener en cuenta, que dificilmente un ser humano lograria componer una frase(o mejor, una subseccion semantica) con la totalidad de las palabras de la lengua española. Por lo que, en definitiva, la mayoria del espacio ocupado por ese "significado", constaria de 0's. Y eso significa que se podria comprimir, y terminaria ocupando muchiiisimo menos, nada que ver. Y no solo seria practico la compresion y descompresion para almacenarlo en la memoria(de recuerdos), sino que incluso se podria utilizar en si misma(sin descomprimir en la practica) a la hora de la interpretacion de los significados mediante el anteriormente citado procesamiento secuencial. Y quizas incluso ahorrariamos ciclos de proceso.

Problem solved!

Lo se, soy un alucinado de la vida :)

0xDani

Pues te ha quedado bastante bien, @0x120x7. Ahora a ver quien se atreve a meterle mano a eso xD
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

$Edu$

Muchas gracias por contestar! es exactamente lo que querian que hagan, veo que me has entendido!

Con todas las conclusiones que sacaste, no se que mas decir, yo tenia pensado algo asi, mezclando con matrices y mapas semanticos jajaj pero es algo complicado, pero por lo menos mas o menos la idea se me viene a la cabeza, por lo menos para poder dejar volar mi imaginacion cuando tenga ganas como cuando cree este tema aca :P

Muchisimas gracias!

pd: Meterle a eso siento que requiere de muchas personas (empresa) para lograr algo como Denise, lamentablemente no esta al alcanze de nosotros.

alister

no quiero ser mamon ,  pero si pretendo sobre todo ser realista.

diseñad primero un parser complejo o un lenguaje de programacion propio.

sim las habiliades que aprendereis haciendo ese camino, no podeis, de momento, apuntar a asumir un pryecto de estas caractersitcas.

las ideas apuntadas estan bien, pero intuyo que estan aun muy inconcretas y vagas, lejos del nivel de concencia y claridad mental que se necesita para este tipo de proyectos.

hay otra variable que podeis tener en cuenta: las faltas de ortografia.

que? a que jode pensar en que una simple h puede estropear el invento? jajajajaja

en la AI las cosas no son literales, y nosotros, que estamos acostumbrados a desarrollar software con comandos y simbolos total y absolutamente literales, puede ser harto complejo cruzar la frontera de lo concreto a lo abstracto.

hacer una AI capaz de "comprender" una conversacion es para ingenieros de primer nivel.
Back 2 business!

$Edu$

Gracias por el comentario, todo aporte sirve, solo no sean tan corta viaje xD dejen soñar un poquito, mil y una vez dije que no lo podre hacer realmente, es solo para tener ideas de como seria, ya has dado una "crear un lenguaje de programacion propio", puede servir, gracias!

Tampoco den por hecho cosas imposible porque bien sabemos que esto se puede hacer en un futuro, el cerebro es muy complejo como para que lo imitemos completamente en un robot pero podemos acercarnos muchisimo y los cientificos estan en ese camino.

alister

Cita de: $Edu$ en 28 Enero 2013, 19:50 PM
Gracias por el comentario, todo aporte sirve, solo no sean tan corta viaje xD dejen soñar un poquito, mil y una vez dije que no lo podre hacer realmente, es solo para tener ideas de como seria, ya has dado una "crear un lenguaje de programacion propio", puede servir, gracias!

Tampoco den por hecho cosas imposible porque bien sabemos que esto se puede hacer en un futuro, el cerebro es muy complejo como para que lo imitemos completamente en un robot pero podemos acercarnos muchisimo y los cientificos estan en ese camino.

yo no cuestiono eso! sé perfectamente que la ciencia avanza mucho en ese terreno.

lo que cuestiono es mas bien nuestro nivel de compromiso hacia este objetivo, y nuestras capacidades como desarrolladores medios o amateurs.

ciertamente es complejo.

pero lo de hacer un lenguaje propio de programación puede servir para que cualquiera ahonde en el área de los algoritmos, que son la graaaaan piedra filosofal de la informatica (la potencia de calculo es impresionante, pero es inutil sin algoritmos)
Back 2 business!

ABDERRAMAH

No es tan dificil como parece (costoso si, dificil no) sólo hace falta algo de estructura. Te han dado buenas opciones (la mejor es la red neuronal multicapa) pero yo, que tengo mis rarezas lo haría de otro modo.

Comenzaría diseñando una máquina virtual con la funcionalidad buscada en mente, o sea, que sea capaz de dar la mejor respuesta ante la entrada y que absolutamente siempre responda con algo. La máquina virtual correría un lenguaje estilo ensamblador, aunque por supuesto usaría todos los beneficios de la programación de alto nivel. La máquina debe ser capaz de leer y escribir en una base de datos, en casos de ia suele ser bueno hacer cosas curiosas, como variables especiales que acepten varios nombres o varios valores, por ejemplo:

Citar"saludo","hola","presentacion"="hola","que tal", "como estas?","ey, que tal", "nos conocemos?"

será la máquina virtual la encargada de que si yo pido la variable "hola" me responda con cualquier frase contenida en su resultado.

Éste método hace que puedas crear diferentes comportamientos cada vez, creando simples archivos de texto y cargandolos como código de la máquina virtual, o podrías modular la ia en diferentes archivos (uno para formular preguntas, otro para encadenar diferentes fragmentos de conversación en busca de datos para añadir a la db etc). Aunque a muchos programadores se les ponen los pelos de punta al hablar de crear un lenguaje, no es tan complicado como parece (creando una máquina virtual) y más aun cuando se trata de algo tan específico como esto.