Tengo muchos artículos en una base de datos (con título,texto), estoy en busca de un algoritmo para encontrar la X más artículos similares, de algo así como de Desbordamiento de Pila «Preguntas Relacionadas» cuando haces una pregunta.

He intentado buscar en google para esto, pero sólo se ha encontrado en las páginas sobre otras similares «texto» los problemas, algo así como la comparación de cada artículo con todos los demás y guardar una similitud en algún lugar. ASÍ lo hace en «tiempo real» en el texto que acaba de escribir.

Cómo?

15 Comentarios

  1. 34

    Distancia de edición no es un candidato probable, como sería de ortografía/del orden de las palabras dependiente, y mucho más costosas computacionalmente que Se está llevando a creer, teniendo en cuenta el tamaño y número de los documentos que había de estar realmente interesado en la búsqueda.

    Algo como Lucene es el camino a seguir. Índice de todos los documentos, y luego, cuando usted quiere encontrar documentos similares a las de un documento dado, encender el documento dado a una consulta, y buscar en el índice. Internamente Lucene será el uso de tf-idf y un índice invertido a hacer todo el proceso de tomar una cantidad de tiempo proporcional al número de documentos que pudieran corresponder, no el número total de documentos en la colección.

  2. 14

    Depende de su definición de similares.

    La edición de distancia algoritmo es el algoritmo estándar de (lengua latina) sugerencias del diccionario, y puede trabajar con textos completos. Dos textos son similares si tienen básicamente las mismas palabras (eh letras) en el mismo orden. Por tanto, las siguientes dos reseñas de libros sería bastante similar:

    1) «Este es un gran libro»

    2) «Estas no son grandes libros»

    (El número de cartas a eliminar, insertar, borrar o modificar a su vez (2) en (1) se denomina la ‘distancia de edición’.)

    Para implementar este querrá visitar cada revisión de la programación. Esto quizás no sea tan costoso como parece, y si es demasiado costoso, usted podría hacer la comparisions como una tarea de fondo y el almacén de la n-la mayoría-son similares en un campo de base de datos en sí.

    Otro enfoque es entender algo de la estructura de (latino) idiomas. Si usted tira de corto (no capitialised o citado) palabras, y asignar pesos a las palabras (o prefijos) que son comunes o únicos, usted puede hacer un Bayesianesque comparación. Los dos siguientes revisiones de libro podría ser simiplied y se encontró que ser similar:

    3) «La revolución francesa fue bla bla, la Guerra y la Paz, bla, bla Francia.» -> Francia/francés(2) la Revolución(1) Guerra(1) la Paz(1) (tenga en cuenta que un diccionario ha sido utilizado para combinar Francia y francés)

    4) «Este libro es bla, bla, una revolución en la cocina francesa.» -> Francia(1) Revolución(1)

    Para implementar esta usted desea para identificar las ‘palabras clave’ en un examen cuando fue creada/actualizada, y para buscar similares revisiones de utilizar estas palabras clave en las cláusulas where de una consulta (idealmente ‘texto completo de búsqueda si la base de datos soporta), tal vez con un post-procesamiento de los resultados de la puntuación de los candidatos se encuentran.

    Libros también tienen categorías – son las novelas de suspense ambientada en Francia similar a los estudios históricos de Francia, y así sucesivamente? Meta-datos más allá de título y el texto puede ser útil para mantener los resultados pertinentes.

  3. 9

    El tutorial en este enlace suena como que podría ser lo que usted necesita. Es fácil de seguir, y funciona muy bien.

    Su algoritmo de recompensas comunes subcadenas común y un ordenamiento de los subcadenas y así debe escoger títulos similares bastante bien.

  4. 3

    Me sugieren para el índice de los artículos usando Apache Lucene, de alto rendimiento, completo motor de búsqueda de texto de la biblioteca escrita completamente en Java. Se trata de una tecnología adecuada para casi cualquier aplicación que requiera la búsqueda de texto completo, especialmente de la cruz-plataforma de. Una vez indexado, usted puede fácilmente encontrar artículos relacionados.

    • … con «more like this»
  5. 2

    Un algoritmo común que se utiliza es el Mapa De Auto-Organización.
    Es un tipo de red neuronal que se categorizar automáticamente tus artículos. A continuación, puede simplemente encontrar la localización de un artículo actual es en el mapa y cerca de todos los artículos que están relacionados. La parte importante del algoritmo es la manera de vector de cuantización su entrada. Hay varias maneras de hacer con el texto. Puede hash su documento/título, usted puede contar con palabras y usar eso como una n-dimensional de vectores, etc. Espero que ayude, a pesar de que han abierto una caja de Pandora para usted de un viaje interminable en AI.

  6. 1

    LO hace la comparación sólo en el título, no en el cuerpo del texto de la pregunta, por lo que sólo en cadenas cortas.

    Usted puede utilizar su algoritmo (ni idea de lo que parece) en el título del artículo y las palabras clave.
    Si usted tiene más tiempo de cpu a grabar, también en los resúmenes de sus artículos.

  7. 1

    Tal vez lo que tu buscas es algo que hace parafraseando. Sólo tengo somero conocimiento de esto, pero la paráfrasis es una procesamiento del lenguaje natural concepto para determinar si dos pasajes de texto en realidad significa la misma cosa – aunque la puede utilizar completamente diferentes palabras.

    Lamentablemente, no conozco a ningún tipo de herramientas que permiten hacer esto (aunque yo estaría interesado en encontrar uno)

  8. 0

    Puede utilizar SQL Server índice de texto Completo para obtener el smart comparación, creo que LO es mediante una llamada ajax, que hace una consulta para devolver las preguntas similares.

    Qué tecnologías se están utilizando?

  9. 0

    Si usted está buscando por palabras que herida por igual, podría convertir a soundex y el soundex palabras para que coincida con … trabajó para mí

  10. 0

    Traté de algún método, pero ninguno funciona bien.Se puede obtener un relativamente satified resultado como este:
    Primero: obtener un Google SimHash código para cada párrafo del texto y almacenarlo en databse.
    Segundo: Índice para el SimHash código.
    Tercera: el proceso de su texto para ser comparado como en el anterior,obtener una SimHash código y buscar en todo el texto por SimHash índice que aparte de una distancia de Hamming como 5-10. A continuación, compare simility con el término vector.
    Esto podría obras de grandes volúmenes de datos.

  11. 0

    El enlace en @alex77 la respuesta de puntos de la Sorensen-Dice El Coeficiente De que se descubrió de forma independiente por el autor de ese artículo – el artículo está muy bien escrito y bien vale la pena leer.

    Acabé el uso de este coeficiente para mis propias necesidades. Sin embargo, el original coeficiente puede dar lugar a resultados erróneos cuando se trata con

    • letra de tres pares de palabras que contiene un error ortográfico, por ejemplo, [and,amd] y
    • letra de tres pares de palabras que son anagramas por ejemplo, [and,dan]

    En el primer caso, Dados informa erróneamente un coeficiente de cero, mientras que en el segundo caso, el coeficiente de vueltas como 0.5, que es engañosamente alto.

    Una mejora ha sido sugerido que en su esencia consiste en tomar la primera y la última letra de la palabra y la creación de un adicional de bigramas.

    En mi opinión, la mejora es sólo que realmente se requiere para 3 de la carta de las palabras – en palabras de los otros dígrafos tiene un efecto de amortiguación que cubre hasta el problema.
    Mi código que implementa esta mejora es la siguiente.

    JS:

    function wordPairCount(word)
    {
    var i,rslt = [],len = word.length - 1;
    for(i=0;i < len;i++) rslt.push(word.substr(i,2));
    if (2 == len) rslt.push(word[0] + word[len]);
    return rslt;
    }
    function pairCount(arr)
    {
    var i,rslt = [];
    arr = arr.toLowerCase().split(' ');
    for(i=0;i < arr.length;i++) rslt = rslt.concat(wordPairCount(arr[i]));
    return rslt;
    }
    function commonCount(a,b)
    {
    var t;
    if (b.length > a.length) t = b, b = a, a = t; 
    t = a.filter(function (e){return b.indexOf(e) > -1;});
    return t.length;
    }
    function myDice(a,b)
    {
    var bigrams = [],
    aPairs = pairCount(a),
    bPairs = pairCount(b);
    debugger;
    var isct = commonCount(aPairs,bPairs);
    return 2*commonCount(aPairs,bPairs)/(aPairs.length + bPairs.length); 
    }
    $('#rslt1').text(myDice('WEB Applications','PHP Web Application'));
    $('#rslt2').text(myDice('And','Dan'));
    $('#rslt3').text(myDice('and','aMd'));
    $('#rslt4').text(myDice('abracadabra','abracabadra'));

    CSS:

    *{font-family:arial;}
    table
    {
    width:80%;
    margin:auto;
    border:1px solid silver;
    }
    thead > tr > td
    {
    font-weight:bold;
    text-align:center;
    background-color:aqua;
    }

    HTML:

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
    <table>
    <thead>
    <tr>
    <td>Phrase 1</td>
    <td>Phrase 2</td>
    <td>Dice</td>
    </tr>
    <thead>
    <tbody>
    <tr>
    <td>WEB Applications</td>
    <td>PHP Web Application</td>
    <td id='rslt1'></td>
    </tr>
    <tr>
    <td>And</td>
    <td>Dan</td>
    <td id='rslt2'></td>
    </tr>
    <tr>
    <td>and</td>
    <td>aMd</td>
    <td id='rslt3'></td>
    </tr>
    <tr>
    <td>abracadabra</td>
    <td>abracabadra</td>
    <td id='rslt4'></td>
    </tr>
    </tbody>
    </table>

    Nota la deliberada falta de ortografía en el último ejemplo: abracadabra vs abracabadra. A pesar de que no extra dígrafo corrección se aplica el coeficiente reportado es de 0.9. Con la corrección habría sido 0.91.

    Esperemos que esto ayude a otros que están en este hilo.

  12. 0

    Dado un texto de ejemplo, este programa muestra el repositorio de textos ordenados por similitud: simple aplicación de bolsa de palabras en C++. El algoritmo es lineal en la longitud total de la muestra de texto y el repositorio de textos. Además el programa es multi-hilos de proceso repositorio de textos en paralelo.

    Aquí es el algoritmo básico:

    class Statistics {
    std::unordered_map<std::string, int64_t> _counts;
    int64_t _totWords;
    void process(std::string& token);
    public:
    explicit Statistics(const std::string& text);
    double Dist(const Statistics& fellow) const;
    bool IsEmpty() const { return _totWords == 0; }
    };
    namespace {
    const std::string gPunctStr = ".,;:!?";
    const std::unordered_set<char> gPunctSet(gPunctStr.begin(), gPunctStr.end());
    }
    Statistics::Statistics(const std::string& text) {
    std::string lastToken;
    for (size_t i = 0; i < text.size(); i++) {
    int ch = static_cast<uint8_t>(text[i]);
    if (!isspace(ch)) {
    lastToken.push_back(tolower(ch));
    continue;
    }
    process(lastToken);
    }
    process(lastToken);
    }
    void Statistics::process(std::string& token) {
    do {
    if (token.size() == 0) {
    break;
    }
    if (gPunctSet.find(token.back()) != gPunctSet.end()) {
    token.pop_back();
    }
    } while (false);
    if (token.size() != 0) {
    auto it = _counts.find(token);
    if (it == _counts.end()) {
    _counts.emplace(token, 1);
    }
    else {
    it->second++;
    }
    _totWords++;
    token.clear();
    }
    }
    double Statistics::Dist(const Statistics& fellow) const {
    double sum = 0;
    for (const auto& wordInfo : _counts) {
    const std::string wordText = wordInfo.first;
    const double freq = double(wordInfo.second) /_totWords;
    auto it = fellow._counts.find(wordText);
    double fellowFreq;
    if (it == fellow._counts.end()) {
    fellowFreq = 0;
    }
    else {
    fellowFreq = double(it->second) /fellow._totWords;
    }
    const double d = freq - fellowFreq;
    sum += d * d;
    }
    return std::sqrt(sum);
    }
    
  13. -1

    El modo más sencillo y rápido para comparar la similitud entre los resúmenes es, probablemente, utilizando el conjunto de concepto. Primero convertir los textos de los resúmenes en conjunto de palabras. A continuación, comprobar la cantidad de cada conjunto se superpone. Python es la función de conjunto viene muy de la mano de realizar esta tarea. Usted se sorprenderá al ver cómo este método compara a los «similares/papeles relacionados de» opciones ahí fuera proporcionada por GScholar, ANUNCIOS, WOS o Scopus.

Dejar respuesta

Please enter your comment!
Please enter your name here