Desidero contare il numero di occorrenze per una frase particolare in un documento. Ad esempio "forum StackOverflow". Supponiamo che D rappresenti i documenti impostati con il documento che contiene entrambi i termini.Calcolo veloce ed efficiente su array
Ora, supponiamo di avere la seguente struttura dei dati:
A[numTerms][numMatchedDocuments][numOccurInADocument]
dove numMatchedDocuments è la dimensione di D ed numOccurInADocument è il numero di occorrenze di un particolare termine si verifica in un particolare documento, ad esempio:
A[stackoverflow][document1][occurance1]=3;
significa, il termine "stackoverflow" si verifica nel documento "document1" e la sua prima occorrenza è nella posizione "3".
Quindi seleziono il termine che si verifica meno e ricopro tutte le sue posizioni per trovare se "forum" si verifica in una posizione + 1 il termine corrente "stackoverflow" posizioni. In altre parole, se trovo "forum" nella posizione 4, questa è una frase e ho trovato una corrispondenza per questo.
la corrispondenza è semplice per documento e viene eseguita abbastanza velocemente ma quando il numero di documenti supera i 2.000.000 diventa molto lento. L'ho distribuito su core e ovviamente è più veloce, ma mi chiedo se c'è un modo algoritmicamente migliore per farlo.
grazie,
psudo-Code:
boolean docPhrase=true;
int numOfTerms=2;
// 0 for "stackoverflow" and 1 for "forums"
for (int d=0;d<D.size();d++){
//D is a set containing the matched documents
int minId=getTheLeastOccuringTerm();
for (int i=0; i<A[minId][d].length;i++){ // For every position for LeastOccuringTerm
for(int t=0;t<numOfTerms;t++){ // For every terms
int id=BinarySearch(A[t][d], A[minId][d][i] - minId + t);
if (id<0) docPhrase=false;
}
}
}
Forse postare l'implementazione corrente nel codice solo per riferimento. – OmniOwl
Qual è la tua domanda? –
@MelNicholson ... ma chiedo se c'è un modo algoritmicamente migliore per farlo. – DotNet