Cómo buscar en internet con un programa que escribí

A2A

Puedo darte algunos puntos de partida, pero no puedo decirte cómo hacerlo específicamente. Probablemente podría decírtelo en persona, con una pizarra, a un nivel de 10,000 pies, y suponiendo que tenga años de experiencia y / o una maestría o un doctorado.


Creo que tienes un malentendido fundamental de gran parte de lo que entra en algo como un motor de búsqueda.

Solo ser un programador no es suficiente para permitirte construir uno. Hay mucha arquitectura e ingeniería, lo que significa que no se trata solo de escribir código.

Sin entrar en muchos detalles, al más alto nivel, un motor de búsqueda es en realidad un montón de software diferente que funciona en conjunto:

  • Descubrimiento: esto generalmente lo realiza un rastreador web o las personas que envían su propia información con la esperanza de que aparezca en los resultados de búsqueda
  • Indexación: aquí es donde organiza punteros a los datos que le interesan según cómo espera que la gente quiera buscar esos datos; piense en ello como un anuncio de Bed, Bath y Beyond: no puede ver toda la tienda, solo un resumen general
  • Recuperación: esto es lo que todos consideran el motor de búsqueda, ya que es la parte con la que hablan cuando quieren encontrar algo

Como está tratando de buscar palabras en posiciones específicas, necesitaría modificar la forma en que piensa las cosas.


Lo primero que debe saber es el índice.

El índice es en realidad casi todas las búsquedas que puedes hacer, ya hecho.

Dado que es imposible revisar todos los datos en Internet en un período de tiempo razonable como reacción a alguien que solicita una búsqueda, debe separar la parte de indexación de la parte de recuperación .

Desea que la parte de recuperación sea lo más rápida posible, lo que significa que la precalcula durante la fase de indexación y luego “simplemente” busca las cosas en el índice.

Pongo citas de miedo alrededor del “justo”, porque no es tan simple: también debe tener un índice para el índice: es tan grande que ni siquiera podría pasar por el índice en un tiempo razonable.


Veamos su problema específico en particular:

“Busca algunas palabras en posiciones específicas”

Esto es lo que se llama un problema tipo ” Ver y decir “; lleva el nombre del juguete de Mattel inventado en 1965, y se ve así:

La forma en que funciona es que apuntas la flecha del granjero a un animal, sacas la cuerda con el anillo para enrollarla, y cuando la cuerda se vuelve a meter en el juguete, el juguete te dice lo que cada animal “dice”.

Terminas con muchas oraciones que se ven así:

La vaca dice mooooooo!

El perro dice ladrar ladrar ladrar!

¡La rana dice ribbit!

En otras palabras: oraciones de la forma:

¡El _______ dice _______ !

¿Qué pasaría si quisiera buscar en todo Internet todas las oraciones de esa forma, unas con ” algunas palabras en ciertas posiciones “?

Eso es difícil.

El problema es que tienes que hacer un procesamiento de lenguaje natural. Esto es necesario porque debe ser capaz de reconocer cosas válidas que pueden estar en cualquier lugar en blanco, y debe restringir las oraciones a oraciones de esa forma.


Digamos que deseaba poder buscar todas las oraciones de esa forma, y ​​tenía que rastrear todo Internet y crear un índice para eso. ¿Cómo sería ese índice?

Bueno, no puede ser un simple trie de palabras.

Cualquier oración puede ser representada como un trie; Aquí hay un ejemplo muy simple:

Este es un trie simple que comienza con la palabra “I”. En el primer nivel, tiene su palabra de inicio, luego en el segundo nivel, tiene todas las palabras posibles que pueden seguir a “I”, y así sucesivamente.

Así que juguemos un poco con el ejemplo “como Elvis” …

_______ me gusta Elvis

Pero digamos que queremos igualar esto. Además del ejemplo en la imagen, también tenemos que coincidir:

me gusta
odio
asesinado
amor
pintado
lavado
izquierda
casado
descubierto

Hay muchas palabras que caben en el espacio en blanco. Entonces, ¿qué es una estructura de datos que se parecería al patrón que estamos tratando de hacer coincidir?

Resulta que hay muchas opciones, y es posible hacerlo de la manera que lo desee, pero que en realidad es un problema muy complejo: es el mismo problema que hacer que las computadoras entiendan a los humanos.

Solo que es peor que eso, porque en el reconocimiento del lenguaje hablado, es bastante lineal: la gente va a decir las palabras en orden, por lo que podría usar un trie … sobre todo. Pero si la palabra que puso en blanco no tiene sentido o es improbable, aumenta la dificultad, por ejemplo:

loro ← ” Yo loro como Elvis

← “Zanahoria como Elvis

← ” Yo canto como Elvis

Pero date cuenta de que también obtendrás cosas como esta:

… y así Billy y yo éramos como Elvis para nuestro propio grupo de fanáticos.

Ahora el problema es aún más difícil: debe ser capaz de reconocer la diferencia entre una oración completa y un fragmento de oración.


El término técnico para la relación entre palabras en este contexto es “asociatividad”.

Esto es algo realmente difícil de representar en una estructura de datos. Es factible, pero no de una manera tradicional.

Peor aún, en este punto, incluso si resolvemos el índice de esta oración de cuatro palabras con un espacio en blanco … solo tenemos una solución para una oración.

Ahora multiplique eso por todas las oraciones posibles, con una palabra reemplazada por un espacio en blanco que se puede completar con cualquier palabra.

Y luego volvamos a su pregunta original:

… textos en internet que tienen algunas palabras en posiciones específicas

Eso implica más de un espacio en blanco. Ahora tiene todas las oraciones posibles, con cualquier palabra en la oración potencialmente reemplazada por un espacio en blanco.

Y ahora estamos llegando al punto en que será difícil calcular previamente un índice.


Y como he estado discutiendo esto …

Lo he estado haciendo en inglés.

Ahora agregue francés; Alemán; Chino; Japonés; Tagalo Farsi; Español; Hebreo; Italiano; Holandés; Coreano; Ruso; Azerbaiyano; Tamil; Devanagari; Griego; Africaans; etc.


No es un problema fácil de resolver.

No es algo que alguien pueda simplemente “mostrarte”.

Pero te animo a que continúes tus estudios.

No puedes hacerlo.

Los motores de búsqueda no solo comienzan buscando. Lo primero que hacen es “arañar” la web.

Tienen un programa que carga un sitio web, encuentra todos los enlaces del mismo, sigue cada enlace a su vez, carga cada sitio, sigue todos los enlaces de esos … y así sucesivamente. Eventualmente, carga todo el texto de todos los sitios web de … tal vez el 80% de los sitios web en el planeta.

Esto llevaría una eternidad para una sola PC, pero los buscadores tienen granjas de servidores masivas con vastas redes de alta velocidad y montañas de espacio en disco.

Una vez que tenga esas cosas cargadas, presumiblemente en unos pocos miles de unidades de disco duro, ahora puede considerar cómo buscarlas. En teoría, podría tomar las palabras que escribió el usuario y examinar los miles de discos duros para ver qué sitios web los contienen.

Pero esto llevaría otra eternidad.

Por lo tanto, debe crear un índice … podría hacer una lista de todas las palabras en los idiomas inglés (y otros) y, en cada una, hacer una lista de todos los sitios web que usan esa palabra. Obviamente, querrás evitar palabras como “el”, “y”, “es” y así sucesivamente … pero incluso con eso, tienes una lista increíblemente grande de listas increíblemente grandes.

Creo que el mensaje aquí es que no puedes hacerlo.

Simplemente no puedes escribir tu propio motor de búsqueda. El hecho de tener que utilizar la Web lo suficiente como para ser útil llevaría AÑOS: almacenarlo requeriría más espacio del que podría comprar con el salario de un año; buscarlo todo llevaría más AÑOS. ¡Para cuando obtenga un resultado de una búsqueda, el sitio web que localizó habría cambiado una docena de veces!

Simplemente no es práctico.

Piense en la red como un gráfico con aristas y vértices. Su tarea es visitar los más relevantes con los recursos disponibles para usted. Tenga en cuenta que el ancho de banda de red disponible es mucho más fácil de saturar que la CPU. Por lo tanto, es posible que desee ir tan alto como pueda.

Para empezar, puede usar wget / curl, … para visitar el conjunto inicial de nodos y luego leer todos los enlaces http. Estos serán sus próximos BORDES en el gráfico que lo llevarán a un conjunto de NODOS nuevos. Visítelos primero en aliento, primero en profundidad, al azar o incluso mejor: enumere por relevancia. Péguelos con algún script: bash, python, …

Los recursos que desea considerar: ancho de banda, potencia computacional disponible (memoria / velocidad), tiempo de desarrollo / mantenimiento, …

Debe quedar claro que no tiene suficientes recursos para atravesar todos los nodos, por lo tanto, debe tener una estrategia para descubrir los más relevantes. Considere el aprendizaje por refuerzo y métodos como la programación dinámica.

La imagen es la representación artística de Internet obtenida de The Opte Project bajo licencia creative commons, para que sepa lo que está haciendo.

Espero eso ayude

A2A

Supongo que ya ha escrito el análisis html, bien.

“Todo” lo que necesitas para escribir es una araña web. Es decir, comienza en algún sitio web, utiliza http / https para leer una página, analiza su texto y TAMBIÉN analiza todos los enlaces de la página. Si su analizador ya no lo admite, amplíelo para esa funcionalidad. Teniendo en cuenta la cantidad de datos que necesita para almacenar los enlaces, probablemente sea mejor usar una base de datos para eso. Una base de datos también lo ayudará a evitar leer el mismo enlace varias veces.

Ahora, por dónde empezar: durante años, la mayoría de los motores de búsqueda utilizaron DMOZ como punto de partida, pero ahora está más o menos apagado. Y la mayoría de los otros catálogos del pasado también se han ido. Supongo que todos los principales jugadores (bing, google y ????) tienen suficiente información ahora en sus propias bases de datos, por lo que el interés en mantenerlo vivo fue nulo. Actualmente todavía hay una copia estática de la misma, por lo que aún puede usarla durante un tiempo, pero probablemente se quedará obsoleta bastante rápido, por lo que es mejor buscar alternativas. Tal vez puedas ordeñar a los grandes jugadores para tus puntos de partida.

Para acceder al html de las páginas, debe usar el http (el protocolo https y cada vez se puede acceder a más páginas con https. Por lo tanto, su mejor opción para eso es probablemente libcurl, ya que admite https y http.

Bueno, eso es todo. Suena engañosamente simple. ¡Feliz araña!

muy simple … y sin embargo tan complicado. Su motor de búsqueda necesita visitar sitios en Internet, analizar su contenido y compararlos con su cadena de búsqueda. Hacer esto en tiempo real es prohibitivamente costoso en términos de tiempo y potencia de procesamiento. Por lo tanto, lo mejor es que el motor visite constantemente los sitios y cree un índice de sus contenidos. Luego, cuando alguien usa su motor para consultar una cadena de búsqueda específica, la compara con su índice y devuelve los mejores resultados. Para una selección corta, podría incluso reindexar en tiempo real, eliminando los falsos positivos, los sitios que actualmente están inactivos o que han cambiado.

Es mejor que tenga un mecanismo rápido de indexación y recuperación y mucha capacidad de almacenamiento y computación.

¿Quieres una idea realista? Solo puedes usar un motor de búsqueda y cosecharlo.
Echa un vistazo aquí: Search Engine Scraping – Wikipedia

No recomendaría hacerlo en C, pero es posible, por supuesto.
C plus libcURL es bastante poderoso.

El enfoque idealista sería buscar en la web (rastreo web), pero probablemente incluso necesitaría años para encontrar un poco de ese texto usted mismo, incluso con un presupuesto de miles de USD al mes.
Internet es demasiado grande, decenas de miles de millones de páginas y más. Ya no puede ponerse al día con un motor de búsqueda sin millones de $$.

Use la misma lógica llamada backlinks. Crea un gráfico. Explore Wikipedia, por ejemplo, y obtendrá millones de otros enlaces http. La web es una web igual que las arañas. En realidad, cualquier enlace que no tenga otro sitio que lo vincule, (a menos que alguien suba ese enlace al portal de entrada de Bing o Google), permanecerán aislados como la isla abandonada del Anillo de Fuego que nadie visita.

Bueno. Lo primero es lo primero, es una tarea enorme, y C no es la mejor herramienta para hacerlo. Estoy implementando esto ahora mismo usando Python y Go. Mi idea es que tienes que construir una base de datos que se ajuste a todos esos datos. Entonces escribes un rastreador. Minas acceden a una página, obtienen todos los enlaces en ella y los agrupan para acceder a continuación. Solo indizo el nombre y la URL (el contenido ocuparía demasiado espacio). Luego, accedo a cada enlace. Creando mi propio (pequeño) mapa de la web. Buena suerte con tu proyecto, pero por favor, no te encierres en C. Es un buen lenguaje para muchas cosas. Este no es uno de ellos, al menos para mí.

En primer lugar, debes hacer tu propia tarea.

La forma de construir un motor de búsqueda depende completamente de usted. Tradicionalmente, lo que otros han hecho es escribir código que recorre cada sitio web que puede encontrar y procesa una copia de los datos de esos sitios. Esto requiere un poco de espacio en disco, ya sea para mantener el sitio en sí, o para mantener los resultados procesados ​​después.