2012-01-30 10 views
20

हमारे पास इस परियोजना में एक आवश्यकता है कि हमें दो ग्रंथों (अपडेट 1, अपडेट 2) की तुलना करना होगा और यह निर्धारित करने के लिए कितने शब्द और कितने वाक्य बदल गए हैं, एक एल्गोरिदम के साथ आना होगा।टेक्स्ट तुलना एल्गोरिदम

क्या कोई एल्गोरिदम है जिसका मैं इसका उपयोग कर सकता हूं? मैं कोड की तलाश भी नहीं कर रहा हूं। अगर मुझे एल्गोरिदम पता है, तो मैं इसे जावा में कोड कर सकता हूं। धन्यवाद।

+0

http://stackoverflow.com/questions/65199/ सी-तेज-तुलना-एल्गोरिदम –

+0

http://neil.fraser.name/software/diff_match_patch/myers.pdf –

उत्तर

11

आमतौर पर यह Longest Common Subsequence (आमतौर पर एलसीएस समस्या कहा जाता है) को ढूंढकर पूरा किया जाता है। इस प्रकार diff काम जैसे टूल हैं। बेशक, diff एक रेखा उन्मुख उपकरण है, और ऐसा लगता है जैसे आपकी ज़रूरतें कुछ अलग हैं। हालांकि, मुझे लगता है कि आप शब्दों और वाक्यों की तुलना करने के लिए पहले से ही कुछ रास्ता बना चुके हैं।

7

diff संस्करण के कुछ प्रकार उपयोगी हो सकता है, जैसे wdiff

आप अपने खुद के एल्गोरिथ्म वसीयत का फैसला करते हैं, तो आप स्थिति है जहाँ एक वाक्य डाला गया है पता करने के लिए करने जा रहे हैं। निम्नलिखित दो दस्तावेज़ों के लिए उदाहरण के लिए:

The men are bad. I hate the men

और

The men are bad. John likes the men. I hate the men

आपका उपकरण पहचान करने के लिए है कि दूसरी में आगे देखने के लिए सक्षम होना चाहिए, I hate the menJohn likes the men द्वारा प्रतिस्थापित नहीं किया गया है लेकिन इसके बजाय छूटा हुआ है, और इससे पहले एक नई वाक्य डाली गई है। यानी इसे एक वाक्य के सम्मिलन की रिपोर्ट करनी चाहिए, न कि चार वाक्य बदलने के बाद एक नई वाक्य।

4

diff और अन्य तुलनात्मक उपयोगिताओं द्वारा उपयोग किया जाने वाला विशिष्ट एल्गोरिदम यूजीन मायर का An O(ND) Difference Algorithm and Its Variations है। इसका जावा कार्यान्वयन java-diff-utils पैकेज में उपलब्ध है।

9

An O(NP) Sequence Comparison Algorithm उपवर्तन के diff इंजन द्वारा उपयोग किया जाता है।

आपकी जानकारी के लिए, github के निम्नलिखित पृष्ठ में स्वयं द्वारा विभिन्न प्रोग्रामिंग भाषाओं के साथ कार्यान्वयन हैं।

https://github.com/cubicdaiya/onp

1

कठिनाई आता है जब बड़ी फ़ाइलों को कुशलता से और अच्छे प्रदर्शन के साथ तुलना की। इसलिए मैं मायर्स हे (एनडी) diff एल्गोरिथ्म का एक परिवर्तन लागू किया - जो बहुत अच्छी तरह से और सही करता है (और नियमित अभिव्यक्ति पर आधारित फिल्टरिंग का समर्थन करता है):

एल्गोरिथ्म यहाँ से बाहर का परीक्षण किया जा सकता है: becke.ch compare tool web application

और एक छोटा सा होम पेज पर अधिक जानकारी: becke.ch compare tool

1

यहां दो पेपर हैं जो अन्य टेक्स्ट तुलना एल्गोरिदम का वर्णन करते हैं जिन्हें आम तौर पर 'बेहतर' (उदाहरण के लिए)छोटे, अधिक सार्थक) मतभेद:

पहले कागज दूसरे का हवाला देते हैं और उसके एल्गोरिथ्म के बारे में यह उल्लेख है:

Heckel [3] बाहर समान बताया एलसीएस तकनीकों के साथ समस्याएं और ब्लॉक चाल का पता लगाने के लिए रैखिक-चूना एल्गोरिदम प्रस्तावित किया। तारों में कुछ डुप्लिकेट प्रतीक होने पर एल्गोरिदम पर्याप्त निष्पादित करता है। हालांकि, एल्गोरिदम अन्यथा खराब परिणाम देता है। उदाहरण के लिए, दो तार अब्ब और bbaa, हेक्सेल का एल्गोरिदम किसी भी सामान्य सबस्ट्रिंग को खोजने में विफल रहता है।

पहले कागज this answer में उल्लेख किया गया था और इसी तरह के एसओ सवाल का this answer में दूसरा, दोनों:

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