Questo è ovviamente non banale, ma ci sono algoritmi che almeno tentano di fare cose come questa. Mi affretto ad aggiungere, tuttavia, che sono statici, quindi provare a utilizzare solo due frasi come base sarà estremamente nel migliore dei casi.
L'approccio abituale è simile a questo:
- filtra le parole di arresto
- usa un thesaurus per sostituire una parola canonica per ogni parola
- conta le occorrenze di parole in ogni documento / frase
- calcola la distanza del coseno tra i documenti di base e ciascun candidato documento simile
- seleziona la N più vicina ai documenti di base
Nota che qui c'è spazio per molte variazioni. Ad esempio, il thesaurus può ottenere risultati considerevolmente migliori se è sensibile al contesto e per mantenere il contesto spesso si desidera mantenere le parole di stop, almeno fino al completamento di tale passaggio. Ad esempio, considera i tuoi documenti di base sul tempo che viene confrontato con: "Ho un raffreddore" e "Fa freddo". Se segui i passaggi precedenti, questi saranno entrambi "freddi" al punto 2, ed entrambi sembreranno ugualmente vicini ai documenti di base.
Con un passo del thesaurus sensibile al contesto (un'ontologia, davvero), useresti le parole in più per disambiguare i due usi del "freddo", quindi quando calcoli le distanze, si farebbe riferimento alla malattia chiamata "il freddo" "e l'altro a" tempo freddo ". I documenti di base si riferiscono entrambi al freddo, quindi il risultato mostrerebbe "È freddo" come simile, ma "Ho un raffreddore" come diverso.
Se stai cercando di mantenere le cose più semplici, tuttavia, potresti saltare completamente il lessico e invece limitare le parole. Questo diventa "piovoso" e "piove" entrambi in "pioggia", quindi quando fai confronti compariranno tutti come sinonimi.
Per quanto riguarda i dettagli, ci sono alcuni elenchi di stop-words facilmente trovato . Almeno nei miei test, la scelta non è particolarmente critica.
Per un thesaurus, ho utilizzato il Moby Thesaurus , con alcune elaborazioni (sostanziali) per in pratica l'inversione - - Ad esempio, anziché trovare più sinonimi per una parola, trova una parola canonica per un dato input.
Non ci sono tanti documenti sul contesto- sinonimo sensibile / ricerca di definizione - ma alcuni sono ancora abbastanza buoni . Un sacco di lavoro sul "web semantico" e sulle ontologie correlate è anch'esso lungo questa linea (anche se è poco probabile che sia di grande aiuto nel tuo caso).
Per lo stemming, il Porter Stemmer è ben noto. C'è una versione più recente, leggermente modificata (Porter2) che dovrebbe essere coperta da qualche parte sulla stessa pagina (s). Un altro algoritmo ben noto è Lancaster Stemmer . C'è anche lo stemmer di Lovins, ma non lo raccomanderei veramente 1 - sebbene sia ancora ampiamente conosciuto perché era il primo (ben noto) algoritmo di derivazione pubblicato. Si noti che la maggior parte (tutti?) Di questi strip hanno solo suffissi, non prefissi.
Alcuni documenti discutono la distanza del coseno. È abbastanza noto che anche la voce di Wikipedia è abbastanza decente.
Molte persone hanno già riunito questi pezzi in modo coerente (almeno in genere cercano di essere coerenti) toolkit, programmi completi, ecc. Alcuni esempi ragionevolmente noti includono WordNet , NLTK , Apache OpenNLP e Freeling .
1 In particolare, Lovins rimuove solo il suffisso one da una parola. Se tu avessi, per esempio, "Loverly" e "amorevolmente", Porter ridurrebbe entrambi a "lov" e si mostrerebbero come sinonimi, ma Lovins li ridurrebbe a "amante" e "amorevole", rispettivamente, e loro apparire come diverso. È possibile ripetere l'algoritmo Lovins fino a quando non rimuove più suffissi, ma il risultato non è molto buono - Porter ha un po 'di sensibilità al contesto quindi (per esempio) rimuove solo un suffisso se ha non rimuovi un altro; più applicazioni di Lovins non ne terrebbero conto.