2011-02-18 25 views
7

टेक्स्ट दस्तावेज़ में डुप्लिकेट ढूंढने के लिए आप कैसे पहुंचेंगे। डुप्लिकेट लगातार शब्दों या वाक्य का एक सेट हो सकता है। वाक्य को डॉट के साथ समाप्त करना जरूरी नहीं है। आइए मान लें कि पृष्ठ में 200 लाइनों का एक दस्तावेज़ है जिसमें से 2 वाक्यों समान हैं, हम "डुप्लिकेट बटन की जांच" करते समय डुप्लिकेट के रूप में उन 2 वाक्यों को हाइलाइट करना चाहते हैं।जावास्क्रिप्ट/jQuery टेक्स्ट डुप्लीकेट

+0

आपका एचटीएमएल संरचित कैसे है? –

+0

मान लें। '

.... पाठ .......

' – Hussein

उत्तर

5

दिलचस्प सवाल - यहां एक विचार है कि मैं इसे कैसे कर सकता हूं: http://jsfiddle.net/SaQAs/1/ - किसी भी तरह अनुकूलित नहीं किया गया है!

var text = $('p').text(), 
    words = text.split(' '), 
    sortedWords = words.slice(0).sort(), 
    duplicateWords = [], 
    sentences = text.split('.'), 
    sortedSentences = sentences.slice(0).sort(), 
    duplicateSentences = []; 


for (var i=0; i<sortedWords.length-1; i++) { 
    if (sortedWords[i+1] == sortedWords[i]) { 
     duplicateWords.push(sortedWords[i]); 
    } 
} 
duplicateWords = $.unique(duplicateWords); 

for (var i=0; i<sortedSentences.length-1; i++) { 
    if (sortedSentences[i+1] == sortedSentences[i]) { 
     duplicateSentences.push(sortedSentences[i]); 
    } 
} 
duplicateSentences = $.unique(duplicateSentences); 

$('a.words').click(function(){ 
    var highlighted = $.map(words, function(word){ 
     if ($.inArray(word, duplicateWords) > -1) 
      return '<span class="duplicate">' + word + '</span>'; 
     else return word; 
    }); 
    $('p').html(highlighted.join(' ')); 
    return false; 
}); 

$('a.sentences').click(function(){ 
    var highlighted = $.map(sentences, function(sentence){ 
     if ($.inArray(sentence, duplicateSentences) > -1) 
      return '<span class="duplicate">' + sentence + '</span>'; 
     else return sentence; 
    }); 
    $('p').html(highlighted.join('.')); 
    return false; 
}); 

अद्यतन 1

यह एक समान शब्दों के चिह्नित क्रम पाता है: http://jsfiddle.net/YQdk5/1/ यहाँ से यह उदा मुश्किल नहीं होना चाहिए तुलना करते समय टुकड़ों के अंत में किसी भी तरह के विराम चिह्न को अनदेखा करें - आपको केवल inArray विधि का अपना संस्करण लिखना होगा।

var text = $('p').text(), 
    words = text.split(' '), 
    sortedWords = words.slice(0).sort(), 
    duplicateWords = [] 
    highlighted = []; 

for (var i=0; i<sortedWords.length-1; i++) { 
    if (sortedWords[i+1] == sortedWords[i]) { 
     duplicateWords.push(sortedWords[i]); 
    } 
} 
duplicateWords = $.unique(duplicateWords); 

for (var j=0, m=[]; j<words.length; j++) { 
    m.push($.inArray(words[j], duplicateWords) > -1); 
    if (!m[j] && m[j-1]) 
     highlighted.push('</span>'); 
    else if (m[j] && !m[j-1]) 
     highlighted.push('<span class="duplicate">'); 
    highlighted.push(words[j]); 
} 

$('p').html(highlighted.join(' ')); 

अद्यतन 2

मेरे regex फू कमजोर है, लेकिन यह (बहुत गंदा!) संस्करण ठीक काम करने के लिए लगता है: http://jsfiddle.net/YQdk5/2/ - मैं यकीन है कि के लिए एक बेहतर तरीका हो सकता है कि कर रहा हूँ ऐसा कर रहा है, लेकिन अभी के लिए मुझे इसे अकेला छोड़ना है! : डी - शुभकामनाएँ!

अद्यतन 3

इसके बारे में सोच रही थी, मुझे नहीं लगता कि पिछले अपडेट से कोड किसी भी अच्छे है। यही कारण है कि मैंने इसे हटा दिया है। तुम अब भी इसे यहाँ पा सकते हैं:

/^word(\.?)$/ 
+0

यह बहुत साफ है। प्रयासों के लिए –

+0

+1। डुप्लिकेट शब्दों को खोजने के लिए मेरे पास एक समान अवधारणा थी। वाक्य यहाँ मुद्दा है। आपके मामले में इसे पहचानने के लिए इसे एक बिंदु के साथ समाप्त होना चाहिए। तो अगर हमारे पास अलग-अलग क्षेत्रों में एक ही 2 वाक्य हैं, लेकिन यदि कोई डॉट के बाद नहीं होता है, तो इसे पहचाना नहीं जाएगा। – Hussein

+0

मुझे लगता है कि यह वाक्य की तुलना में एक शब्द अनुक्रम का अधिक है, है ना?)। – polarblau

3

यहाँ है समाधान प्रत्यय पेड़ का उपयोग करता है:

function SuffixTree(text) { 
    var regex = /\b\w+/g; 
    var words = text.match(regex); 
    var wave = []; 
    var words_l = words.length; 
    if (words_l == 0) return false; 
    this.tree = this.node("", false); 
    for (var i = 0; i < words_l; ++i) { 
     var x = words[i] + "_"; 
     wave.push(this.tree); 
     var wave_l = wave.length; 
     for (var j = 0; j < wave_l; ++j) { 
      var y = wave[j]; 
      if (typeof y[x] != 'undefined') y[x].count++; 
      else y[x] = this.node(words[i], y); 
      wave[j] = y[x]; 
     } 
    } 
} 

SuffixTree.prototype = { 
    dummy: {count: 1}, 

    node: function(word, num, parent) { 
     return { 
      count: 1, 
      word: word, 
      parent: parent 
     }; 
    }, 

    duplicates: function(h) { 
     this.dups = []; 
     this.bypass(this.tree, h, 0); 
     var l = this.dups.length; 
     this.dups.sort(function(d1, d2) { return d1.depth > d2.depth ? 1 : -1; }); 
     for (var i = 0; i < l; ++i) { 
      var d = this.dups[i]; 
      this.dups[i] = { s: " " + this.sentence(d.a) + " ", depth: d.depth, count: d.a.count }; 
     } 
     for (var i = 0; i < l; ++i) { 
      var d = this.dups[i]; 
      console.log(i, d.s); 
     } 
     for (var i = 0; i < l; ++i) { 
      var d = this.dups[i]; 
      var fl = true; 
      for (var j = i + 1; j < l; ++j) { 
       if (this.dups[j].s.indexOf(d.s) != -1) fl = false; 
      } 
      if (fl) h(d.s.substr(1, d.s.length - 2), d.count); 
     } 
    }, 

    bypass: function(a, h, depth) { 
     if (a.constructor != Object) return; 
     var fl = true; 
     for (var i in a) { 
      if (i == 'parent') continue; 
      var b = a[i]; 
      if (b.count == a.count) fl = false; 
      this.bypass(b, h, depth + 1); 
     } 
     if (fl && a.count > 1) { 
      this.dups.push({ a: a, depth: depth }); 
     } 
    }, 

    sentence: function(a) { 
     var s = a.word; 
     while (a = a.parent) { 
      s = a.word + " " + s; 
     } 
     return s; 
    } 
}; 

var text = "This is a text with some duplicates: words, sentences of different length. For example here is a duplicate word. This sentence has some duplicates. But not all of us can find clones."; 

var T = new SuffixTree(text); 
var h = function(s, c) { 
    document.write(s + "[" + c + "]<br/>"); 
}; 
T.duplicates(h); 

http://jsfiddle.net/YQdk5/2/ मुख्य बिंदु शब्द का मिलान कर, की तर्ज पर कुछ एक regex का उपयोग करने के लिए है 1) इनपुट पाठ को शब्दों की सरणी में विभाजित करें। 2) प्रत्यय पेड़ का निर्माण करें। 3) पेड़ के सबसे लंबे प्रत्यय खोजें। 4) दूसरों में निहित वाक्यों को हटाएं (यानी "है" को हटाएं जो "यह एक है" का हिस्सा है)।

आप एचटीएमएल टैग को ध्यान में रखने के लिए नियमित अभिव्यक्ति को बदल सकते हैं।

मुझे आशा है कि यह आपकी मदद करेगा।

पीएस h पाया डुप्लिकेट के लिए कॉलबैक है।

0

आप जावास्क्रिप्ट में jQuery नामक जावास्क्रिप्ट लाइब्रेरी के संदर्भ हैं।

आप इसे अपने HTML में शामिल नहीं कर रहे हैं, और इस प्रकार यह विफल हो जाएगा। आप इसे jquery cdn

और आज के टिप के माध्यम से शामिल कर सकते हैं: अपने ब्राउज़र में डेवलपर टूल का उपयोग करें। कंसोल में आप देख सकते हैं कि जावास्क्रिप्ट के कौन से हिस्से विफल हो जाते हैं।

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