मैं किसी दस्तावेज़ में किसी विशेष वाक्यांश के लिए घटनाओं की संख्या को गिनना चाहता हूं। उदाहरण के लिए "stackoverflow मंच"। मान लीजिए डी दोनों शर्तों वाले दस्तावेज़ के साथ सेट दस्तावेज़ों का प्रतिनिधित्व करता है।सरणी पर तेज और कुशल गणना
अब, मान लीजिए मैं निम्न डेटा संरचना है:
:A[numTerms][numMatchedDocuments][numOccurInADocument]
जहां numMatchedDocuments विकास तथा numOccurInADocument के आकार है उदाहरण के लिए, घटनाओं की संख्या किसी विशेष शब्द एक विशेष दस्तावेज़ में होता है
A[stackoverflow][document1][occurance1]=3;
का अर्थ है, "stackoverflow" शब्द दस्तावेज़ "दस्तावेज़ 1" में होता है और इसका पहला मौका "3" स्थिति में होता है।
तब मैं उस शब्द को चुनता हूं जो कम से कम और लूप होता है ताकि यह पता चल सके कि "फोरम" स्थिति में "फोरम" वर्तमान शब्द "स्टैक ओवरफ्लो" स्थिति में होता है या नहीं। दूसरे शब्दों में, अगर मुझे स्थिति 4 पर "फोरम" मिलता है तो यह एक वाक्यांश है और मुझे इसके लिए एक मैच मिला है।
मिलान प्रति दस्तावेज़ सरल है और उचित रूप से तेज़ चलता है लेकिन जब दस्तावेज़ों की संख्या 2,000,000 से अधिक हो जाती है तो यह बहुत धीमी हो जाती है। मैंने इसे कोर पर वितरित कर दिया है और यह निश्चित रूप से तेज़ी से हो जाता है लेकिन आश्चर्य है कि ऐसा करने का एल्गोरिदमिक रूप से बेहतर तरीका है या नहीं।
धन्यवाद,
psudo-कोड:
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;
}
}
}
शायद संदर्भ के लिए कोड में अपने वर्तमान कार्यान्वयन को पोस्ट करें। – OmniOwl
आपका प्रश्न क्या है? –
@MelNicholson ... लेकिन आश्चर्य है कि ऐसा करने के एल्गोरिदमिक रूप से बेहतर तरीका है। – DotNet