2012-07-10 20 views
7

मैं कुछ लिख रहा हूं जो पाठ का एक ब्लॉक लेता है और इसे संभावित डेटाबेस क्वेरीज़ में तोड़ देता है जिसका उपयोग पाठ के समान ब्लॉक खोजने के लिए किया जा सकता है। अद्वितीय की एक सरणी बनाने के शेष पाठ सेतारों की सरणी से अद्वितीय संयोजनों की सरणी बनाएं

  1. पाठ से निकालें रोकने वाले शब्द
  2. निकालें विशेष वर्ण
  3. ": (" इसी तरह के सवाल "सूची में ऐसी ही कुछ नहीं बनाया जा रहा है, जबकि मैं इस टाइप) बुनियादी प्रक्रिया उपजा "
  4. सरणी के संभव संयोजनों की एक सरणी बनाएँ तनों के (जहाँ मैं अटक कर रहा हूँ ... एक तरह से)

यहाँ मैं अब तक है:

//baseList starts with an empty array 
    //candList starts with the array of unique stems 
    //target is where the arrays of unique combinations are stored 

    function createUniqueCombos(baseList,candList,target){ 

    for(var i=0;i<candList.length;i++){   

     //copy the base List 
     var newList = baseList.slice(0); 

     //add the candidate list item to the base list copy 
     newList.push(candList[i]); 

     //add the new array to the target array 
     target.push(newList); 

     //re-call function using new array as baseList 
     //and remaining candidates as candList 
     var nextCandList = candList.slice(i + 1);  
     createUniqueCombos(newList,nextCandList,target); 
    } 

} 

यह काम करता है, लेकिन पाठ 25 शब्दों या तो की तुलना में बड़ा के ब्लॉक पर, यह मेरी ब्राउज़र दुर्घटनाओं। मुझे एहसास है कि गणितीय रूप से संभावित संयोजनों की एक बड़ी संख्या हो सकती है। मैं क्या जानना चाहता हूं:

  1. क्या ऐसा करने का एक और अधिक प्रभावी तरीका है?
  2. मैं न्यूनतम/अधिकतम संयोजन सरणी लंबाई को कैसे परिभाषित कर सकता हूं?
+0

यह एक शानदार पहला सवाल है। StackOverflow में आपका स्वागत है! आपका ब्राउज़र संभवतः इस्तेमाल की गई स्मृति की मात्रा, या बहुत अधिक रिकर्सिंग से क्रैश हो जाएगा। – Bojangles

+0

क्या आपको वास्तव में एक ही समय में सभी संयोजनों की आवश्यकता है? क्या आप उन्हें बड़े पैमाने पर एकत्रित करने के बजाय उन्हें उत्पन्न नहीं कर सकते हैं? रिकर्सन के बजाय पुनरावृत्ति के लिए अपने एल्गोरिदम को फिर से लिखने का प्रयास करें। –

+0

धन्यवाद, मैं कुछ समय के लिए एक दर्शक रहा हूं;) @ ओलेगवी। वोल्कोव नहीं, मुझे उन सभी संयोजनों की आवश्यकता नहीं है जिन्हें मैं लौटा संयोजन सरणी के लिए न्यूनतम/अधिकतम लंबाई परिभाषित करने में सक्षम होना चाहता हूं। पुनरावृत्ति सुझाव के लिए धन्यवाद। – HartyeTech

उत्तर

1

मुझे लगता है कि आपके तर्क मूल रूप से त्रुटिपूर्ण हैं क्योंकि आप कितने संयोजन बना रहे हैं।

एक दृष्टिकोण जो मैं लेता हूं;

  1. स्प्लिट अलग-अलग शब्दों में पाठ
  2. (हम इस चर split_words फोन करता हूँ) निकालें विशेष वर्ण
  3. लघु/आम शब्दों निकालें (और, या, मैं एक); या तो शब्दों का एक काली सूची द्वारा लंबाई से ऐसा करते हैं, या अधिक समझदारी से
  4. जो कॉलम block_id और word
  5. एक SQL क्वेरी है एक मेज (जैसे blocks) है जैसे

और फिर आपके पास block_ids की एक सूची होगी जो कि ब्लॉक के सामान्य में कितने शब्दों के आधार पर आदेश दिया गया है।

+0

उत्तर के लिए धन्यवाद। मैं पहले से ही इस चरण में आने से पहले 1, 2, और 3 कर रहा हूं। मैं सर्वर की तरफ एक मालिकाना मंच और डेटाबेस तकनीक से निपट रहा हूं, और एक समाधान को लागू करने जैसा आप सुझाव दे रहे हैं, मैंने कुछ ऐसा माना है। दुर्भाग्यवश, डेटा को तोड़ना मैं व्यक्तिगत शब्दों में खोज करूँगा संभव नहीं होगा। – HartyeTech

1

मिले इस पिछले प्रश्न: Algorithm to find articles with similar text

जवाब में से एक में एक लेख है कि खोजने कितने आसन्न चरित्र जोड़े दोनों तार में निहित हैं पता चलता है के लिए एक लिंक प्रदान की है। [http://www.catalysoft.com/articles/StrikeAMatch.html]

उदाहरण जावा में है, लेकिन मुझे यकीन है कि जे एस करने के लिए आसानी से मोड़ा जा सकता है कर रहा हूँ:

/** @return an array of adjacent letter pairs contained in the input string */ 
private static String[] letterPairs(String str) { 
    int numPairs = str.length()-1; 
    String[] pairs = new String[numPairs]; 
    for (int i=0; i<numPairs; i++) { 
     pairs[i] = str.substring(i,i+2); 
    } 
    return pairs; 
} 

/** @return an ArrayList of 2-character Strings. */ 
private static ArrayList wordLetterPairs(String str) { 
    ArrayList allPairs = new ArrayList(); 
    // Tokenize the string and put the tokens/words into an array 
    String[] words = str.split("\\s"); 
    // For each word 
    for (int w=0; w < words.length; w++) { 
     // Find the pairs of characters 
     String[] pairsInWord = letterPairs(words[w]); 
     for (int p=0; p < pairsInWord.length; p++) { 
      allPairs.add(pairsInWord[p]); 
     } 
    } 
    return allPairs; 
} 

/** @return lexical similarity value in the range [0,1] */ 
public static double compareStrings(String str1, String str2) { 
    ArrayList pairs1 = wordLetterPairs(str1.toUpperCase()); 
    ArrayList pairs2 = wordLetterPairs(str2.toUpperCase()); 
    int intersection = 0; 
    int union = pairs1.size() + pairs2.size(); 
    for (int i=0; i<pairs1.size(); i++) { 
     Object pair1=pairs1.get(i); 
     for(int j=0; j<pairs2.size(); j++) { 
      Object pair2=pairs2.get(j); 
      if (pair1.equals(pair2)) { 
       intersection++; 
       pairs2.remove(j); 
       break; 
      } 
     } 
    } 
    return (2.0*intersection)/union; 
} 
+0

यह बहुत अच्छा है। मैं जो करने की कोशिश कर रहा हूं वह इस तरह की तुलना करने के लिए अन्य "लेख" ढूंढने के लिए "नेट डाला" है। एक बार जब मेरा मूल प्रश्न पता चला, तो ऐसा कुछ अगले चरण की संभावना होगी। – HartyeTech

0

आपकी समस्या आसानी से अपने binomial coefficient class से हल किया जा सकता है। मेरे answer से कुछ हद तक संबंधित समस्या से कोड पर नज़र डालें। मुझे नहीं पता कि सी # कोड को एसक्यूएल संग्रहित प्रो पर पोर्ट करना एक अच्छा विचार होगा या नहीं।यह जावा या जेएस पर पोर्ट करना आसान होगा और उस संग्रह से अपनी संग्रहित प्रो को कॉल करें।

संबंधित मुद्दे