Chcę policzyć liczbę wystąpień dla określonej frazy w dokumencie. Na przykład "fora stackoverflow". Załóżmy, że D reprezentuje dokumenty ustawione z dokumentem zawierającym oba pojęcia.Szybkie i wydajne obliczenia na tablicach
Teraz załóżmy, że mam następującą strukturę danych:
A[numTerms][numMatchedDocuments][numOccurInADocument]
gdzie numMatchedDocuments jest wielkość D i numOccurInADocument jest liczba wystąpień dany termin występuje w danym dokumencie, na przykład:
A[stackoverflow][document1][occurance1]=3;
oznacza, termin "stackoverflow" występuje w dokumencie "document1", a jego pierwsze wystąpienie znajduje się na pozycji "3".
Następnie wybieram termin, który występuje co najmniej, i zapętla się na wszystkich jego pozycjach, aby sprawdzić, czy "forum" występuje na pozycji + 1 w bieżącym okresie "stackoverflow" pozycji. Innymi słowy, jeśli znajdę "forum" na pozycji 4, to jest to fraza i znalazłem dla niej dopasowanie.
dopasowanie jest proste dla każdego dokumentu i przebiega w miarę szybko, ale gdy liczba dokumentów przekracza 2 000 000, robi się bardzo wolno. Rozdzieliłem ją na rdzenie i oczywiście robi się to szybciej, ale zastanawiam się, czy algorytm ma lepszy sposób na zrobienie tego.
Dzięki,
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;
}
}
}
Być może zamieść bieżącą implementację w kodzie tylko w celach informacyjnych. – OmniOwl
Jakie jest twoje pytanie? –
@MelNicholson ... ale zastanawiam się, czy istnieje algorytmicznie lepszy sposób robienia tego. – DotNet