2010-02-01 11 views
12

क्या कोई अच्छी लाइब्रेरी संयुक्त स्ट्रिंग से शब्दों का पता लगा सकती है और विभाजित कर सकती है?रिक्त स्थान/संयुक्त शब्दों के बिना पाठ से अधिकतर संभावित शब्दों का पता लगाएं

उदाहरण:

"cdimage" -> ["cd", "image"] 
"filesaveas" -> ["file", "save", "as"] 
+1

मुझे इस क्षेत्र में कोई अनुभव नहीं है, लेकिन आप प्राकृतिक भाषा टूलकिट पर एक नज़र डालना शुरू कर सकते हैं। http://www.nltk.org/ –

+3

और filesaveas के रूप में विभाजित किया जा सकता है * फ़ाइलें एवेन्यू * नहीं सिर्फ * फ़ाइल इस रूप में सहेजें * यह सिर्फ जब तक आप एक विशिष्ट शब्दावली है शब्द संभावनाओं पर विभाजित करने के लिए कठिन हो जाएगा। .. – Sparky

+4

और ["सी", "मंद", "आयु"], ["सीडी", "i", "mage"], आदि ... संदर्भ को जानने के बिना यह अधिकार प्राप्त करना आसान नहीं है। सही विकल्प चुनने में भी मुश्किल हो जाती है जब बहुत सारे डोमेन विशिष्ट शब्द और संक्षेप होते हैं जो सामान्य पाठ में दुर्लभ होते हैं लेकिन सामान्य अपेक्षित इनपुट में आम होते हैं। आपको शायद एल्गोरिदम को प्रशिक्षित करने की आवश्यकता होगी। –

उत्तर

11

यहाँ एक गतिशील प्रोग्रामिंग समाधान (एक memoized समारोह के रूप में कार्यान्वित) है पर एक कैप्चा के रूप में उन्हें हल करने के लिए प्राप्त करें।अपने आवृत्तियों के साथ शब्दों के शब्दकोश को देखते हुए, यह उन पदों पर इनपुट टेक्स्ट को विभाजित करता है जो समग्र रूप से सबसे अधिक संभावित वाक्यांश देते हैं। आपको एक वास्तविक शब्दसूची मिलनी होगी, लेकिन मैंने एक सरल परीक्षण के लिए कुछ मेक-अप आवृत्तियों को शामिल किया था।

WORD_FREQUENCIES = { 
    'file': 0.00123, 
    'files': 0.00124, 
    'save': 0.002, 
    'ave': 0.00001, 
    'as': 0.00555 
} 

def split_text(text, word_frequencies, cache): 
    if text in cache: 
     return cache[text] 
    if not text: 
     return 1, [] 
    best_freq, best_split = 0, [] 
    for i in xrange(1, len(text) + 1): 
     word, remainder = text[:i], text[i:] 
     freq = word_frequencies.get(word, None) 
     if freq: 
      remainder_freq, remainder = split_text(
        remainder, word_frequencies, cache) 
      freq *= remainder_freq 
      if freq > best_freq: 
       best_freq = freq 
       best_split = [word] + remainder 
    cache[text] = (best_freq, best_split) 
    return cache[text] 

print split_text('filesaveas', WORD_FREQUENCIES, {}) 

--> (1.3653e-08, ['file', 'save', 'as']) 
7

मैं इसके लिए किसी भी पुस्तकालय का पता नहीं है, लेकिन यह बुनियादी कार्यक्षमता को लागू करने के लिए मुश्किल नहीं होना चाहिए।

  1. यूनिक्स के words जैसे शब्दों की सूची प्राप्त करें।
  2. अपनी शब्द सूची की सामग्री को एक trie में भरें।
  3. वह स्ट्रिंग लें जिसे आप विभाजित करना चाहते हैं और ट्राई में अपने पथ का पालन करें। प्रत्येक बार जब आप एक वैध शब्द तक पहुंचते हैं, तो एक नई शाखा बनाएं जो आपके द्वारा प्राप्त स्ट्रिंग के बिंदु से शुरू होने वाले शब्द की खोज करे। एक बार जब आप अपनी वर्तमान शाखा को समाप्त कर लेते हैं, तो आपके द्वारा बनाए गए किसी के लिए बैकट्रैक, जैसे गहराई में पहली खोज।
  4. हेरिस्टिक या प्राकृतिक भाषा पार्सर के माध्यम से परिणामस्वरूप सूचियों को मैन्युअल रूप से असंबद्ध करें।

उदाहरण:

  1. शब्द: "filesaveasstring"
  2. पहले वैध शब्द "फाइल" है। "Saveas" मिलान करने का प्रयास करें। पहला मान्य शब्द "सहेजें" है। "Asstring" मिलान करने का प्रयास करें। पहला वैध शब्द "जैसा" है। "स्ट्रिंग" मिलान करने का प्रयास करें। पहला मान्य शब्द "स्ट्रिंग" है। अंत तक मिलान किया; अपनी परिणाम सूची में [फ़ाइल को स्ट्रिंग के रूप में सहेजें] डालें।
  3. "स्ट्रिंग" से मेल खाने के लिए बैकट्रैक - कोई अन्य संभावनाएं नहीं। "Asstring" के लिए बैकट्रैक। पहला अनजान वैध शब्द "गधा" है। "ट्रिंग" मिलान करने का प्रयास करें। कोई संभावित मैच नहीं "Asstring" के लिए बैकट्रैक। कोई संभावित मैच नहीं "Filesaveasstring" पर बैकट्रैक।
  4. पहला अन्वेषण मैच "फ़ाइलें" है। "एवेसस्ट्रिंग" से मेल खाने का प्रयास करें। पहला मैच "एवी" है। "एस्ट्रिंग" (चरण 2/3 के समान परिणाम) मिलान करने का प्रयास करें, अपनी परिणाम सूची में [फ़ाइलों को एवी स्ट्रिंग] जोड़ें और शुरुआत में बैकट्रैक जोड़ें।
  5. "filesaveasstring" से मिलान करने का प्रयास करें। कोई अवांछित मैच नहीं। किया हुआ।
  6. एक ह्यूरिस्टिक या प्राकृतिक भाषा पार्सर का उपयोग करके [[फाइल स्ट्रिंग के रूप में फ़ाइल] [स्ट्रिंग के रूप में फाइल]] से सबसे अधिक संभावना का चयन करें।
+0

इसका रनटाइम क्या है? मैं किसी भी तरह से इस सटीक बिग-ओ जटिलता को खोजने के लिए पर्याप्त समस्या को सामान्य करने में सक्षम नहीं हूं। –

2

मुझे लगता है कि यह करता है एक पुस्तकालय पता नहीं है, लेकिन यदि आप शब्दों की एक सूची है लिखने के लिए भी मुश्किल नहीं है:

wordList = file('words.txt','r').read().split() 
words = set(s.lower() for s in wordList) 

def splitString(s): 
    found = [] 

    def rec(stringLeft, wordsSoFar): 
     if not stringLeft: 
      found.append(wordsSoFar) 
     for pos in xrange(1, len(stringLeft)+1): 
      if stringLeft[:pos] in words: 
       rec(stringLeft[pos:], wordsSoFar + [stringLeft[:pos]]) 

    rec(s.lower(), []) 
    return found 

इस में स्ट्रिंग विभाजित करने के लिए हर संभव तरीके वापस आ जाएगी दिए गए शब्द

उदाहरण:

>>> splitString('filesaveas') 
[['file', 'save', 'as'], ['files', 'ave', 'as']] 
-1

यदि आप मनोरंजन के लिए यह नहीं कर रहे हैं, लेकिन वास्तव में काम आदि के लिए कुछ कर रहा है, मेरी सलाह स्रोत पर इस से निपटने के लिए है। आप इन तारों को संयुक्त क्यों करते हैं? आप उन तारों को कहां मिला? यदि यह संभव है, तो उन तारों के स्रोत पर रिक्त स्थान डालें जहां से ये तार आते हैं।

+1

क्षमा करें, लेकिन यह हर समस्या के लिए एक जवाब है। (क्यू: "घर को सफेद रंग कैसे पेंट करें?" -> ए: "जमीन पर सफेद कैल्शियम जोड़ें और 1 मिलियन साल बाद आओ और पहली जगह में सफेद ईंटें खोदें") –

3

लोगों को अपनी वेबसाइट :)

-1

मुझे पता है कि यह प्रश्न पायथन के लिए चिह्नित है लेकिन मुझे जावास्क्रिप्ट कार्यान्वयन की आवश्यकता है। पिछले उत्तरों से बाहर निकलने पर मुझे लगा कि मैं अपना कोड साझा करूंगा। काम करने के लिए लगता है।

function findWords(input){ 
    input = input.toLowerCase().replace(/\s/g, ""); //Strip whitespace 

    var index = 0; 
    var validWords = []; 
    for (var len = input.length; len > 0; len--){ //Go backwards as to favor longer words 
     var testWord = input.substr(index, len); 
     var dictIndex = _dictionary.indexOf(testWord.replace(/[^a-z\']/g, "")); //Remove non-letters 
     if (dictIndex != -1){ 
      validWords.push(testWord); 
      if (len == input.length){ 
       break; //We are complete 
      } 
      var nextWords = findWords(input.substr(len, input.length - len)); //Recurse 
      if (!nextWords.words.length){ //No further valid words 
       validWords.pop(); 
      } 
      validWords = validWords.concat(nextWords.words); 
      if (nextWords.complete === true){ 
       break; //Cascade complete 
      } 
     } 
    } 
    return { 
     complete:len > 0, //We broke which indicates completion 
     words:validWords 
    }; 
} 

नोट: "_dictionary" आवृत्ति द्वारा क्रमबद्ध शब्दों की एक सरणी होने की उम्मीद है। मैं प्रोजेक्ट गुटेनबर्ग से एक वर्डलिस्ट का उपयोग कर रहा हूं।

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