2008-12-30 9 views
7

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

 
This is a message from Contoso customer service. 

Recently, you requested customer support. Below is a summary of your 
request and our reply. 

-------------------------------------------------------------------- 
Contoso (Fred) on Tuesday, December 30, 2008 at 9:04 a.m. 
-------------------------------------------------------------------- 
John: 

I've modified your address. You can confirm my work by logging into 
"Your Account" on our Web site. Your order should ship out today. 

Thanks for shopping at Contoso. 

-------------------------------------------------------------------- 
You on Tuesday, December 30, 2008 at 8:03 a.m. 
-------------------------------------------------------------------- 
Oops, I entered my address incorrectly. Can you change it to 

Fred Smith 
123 Main St 
Anytown, VA 12345 

Thanks! 

-- 
Fred Smith 
Contoso Product Lover 

आम तौर पर, यह सब अच्छा काम करता है, लेकिन वहाँ एक ऐसा क्षेत्र है कि मैं गया है एक तरह से थोड़ी देर के लिए अब तक की सफाई बंद डाल है, और यह टेक्स्ट रैपिंग से संबंधित है। ऊपर दिए गए जैसे सुंदर ई-मेल प्रारूप को उत्पन्न करने के लिए, मुझे मूल रूप से भेजे गए पाठ को फिर से लपेटने की आवश्यकता है।

मैं एक एल्गोरिथ्म है कि यह करता है लिखा है (हालांकि कोड को देखते हुए, मैं पूरी तरह से यकीन है कि यह कैसे काम करता है अब और नहीं कर रहा हूँ - यह कुछ पुनर्रचना के इस्तेमाल कर सकते हैं)। लेकिन यह एक कठिन रैप न्यू लाइन, न्यू लाइन एक "पैरा के अंत", और एक "अर्थ" न्यू लाइन के बीच भेद नहीं कर सकते हैं। उदाहरण के लिए, एक हार्ड-चादर न्यू लाइन एक है कि ई-मेल क्लाइंट एक पैरा के भीतर डाला पाठ कहते हैं, की एक लंबी लाइन रैप करने के लिए, 79 कॉलम में है। पैराग्राफ न्यूलाइन का अंत वह है जिसे उपयोगकर्ता ने अनुच्छेद में अंतिम वाक्य के बाद जोड़ा था। और एक अर्थपूर्ण न्यूलाइन br टैग जैसी कुछ होगी, जैसे कि फ्रेड टाइप किया गया पता।

मेरे एल्गोरिथ्म के बजाय केवल दो नई पंक्तियां एक पंक्ति में एक नया पैरा यह दर्शाता है, तो यह ग्राहक के ई-मेल की तरह कुछ प्रारूप तैयार किया जाता होगा के रूप में देखता है:

 
Oops, I entered my address incorrectly. Can you change it to 

Fred Smith 123 Main St Anytown, VA 12345 

Thanks! 

-- Fred Smith Contoso Product Lover 

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

किसी के पास एक एल्गोरिदम है जो टेक्स्ट को फिर से लपेट सकता है इरादा? या यह कार्यान्वयन किसी भी दिए गए समाधान की जटिलता का वजन करते समय "पर्याप्त पर्याप्त" है?

धन्यवाद।

उत्तर

3

आप यह जांचने का प्रयास कर सकते हैं कि लाइन की लंबाई अधिकतम (उर्फ हार्ड रैप) को रखने के लिए एक नई लाइन डाली गई है: बस टेक्स्ट में सबसे लंबी पंक्ति की जांच करें। फिर, किसी दिए गए रेखा के लिए, आप निम्न पंक्ति का पहला शब्द इसमें संलग्न करते हैं। यदि परिणामी रेखा अधिकतम लंबाई से अधिक हो जाती है, तो लाइन ब्रेक शायद एक कठिन लपेटना था।

यहां तक ​​कि सरल आप शायद (maxlength - 15) <= length <= maxlength में सभी ब्रेक को हार्डव्रप्स के रूप में मान सकते हैं (15 केवल एक शिक्षित अनुमान होने के साथ)। यह निश्चित रूप से जानबूझकर ब्रेक को पतों और सामानों के रूप में फ़िल्टर करेगा, और इस सीमा में कोई भी मिस्ड ब्रेक परिणाम को बहुत बुरी तरह प्रभावित नहीं करेगा।

+0

इस साधारण विचार के लिए धन्यवाद। एक त्वरित और गंदे नमूना कार्यान्वयन के लिए नीचे मेरा जवाब देखें। –

2

मेरे पास दो सुझाव हैं, जैसा कि निम्नानुसार है। विराम चिह्न के लिए

  • वेतन ध्यान: इस आप एक "हार्ड रैप" न्यू लाइन और न्यू लाइन (एक "पैरा के अंत" के बीच अंतर करने में मदद मिलेगी क्योंकि, अगर लाइन एक पूर्ण विराम के साथ समाप्त होता है, तो यह अधिक संभावना है कि उपयोगकर्ता ने इसे अनुच्छेद का अंत करने का इरादा किया था।

  • ध्यान दें कि लाइन अधिकतम लाइन लंबाई से बहुत कम है या नहीं: ऊपर दिए गए उदाहरण में, आपके पास टेक्स्ट हो सकता है जो 79 वर्णों पर "हार्ड-लपेटा" हो रहा है, साथ ही आपके पास पता पंक्तियां हैं जो केवल 30 वर्ण हैं लंबा; क्योंकि 30 79 से बहुत कम है, आप जानते हैं कि पता पंक्तियों को उपयोगकर्ता द्वारा तोड़ दिया गया था, न कि उपयोगकर्ता के टेक्स्ट-रैप एल्गोरिदम द्वारा।

इसके अलावा, इंडेंट पर ध्यान देना: के रूप में वे इस मंच पर हैं लाइनों जो बाएं से सफेद स्थान के साथ इंडेंट कर रहे हैं, नए पैराग्राफ, पिछले लाइनों से टूट होना चाहिए हो सकता है।

2

ऊपर ओले की सलाह के बाद, मैंने थ्रेसहोल्ड देखने के लिए अपने कार्यान्वयन को फिर से काम किया। ऐसा लगता है कि मैं उन परिदृश्यों को संभालने में प्रतीत होता हूं जो मुझे बिना फेंकने के पर्याप्त हैं और बिना कोड के लिखने वाले कोड लिखते हैं जो वास्तव में अंग्रेजी भाषा को समझते हैं।

असल में, मैं पहले इनपुट स्ट्रिंग के माध्यम से स्कैन करता हूं और परिवर्तनीय inputMaxLineLength में सबसे लंबी लाइन लंबाई रिकॉर्ड करता हूं। फिर जब मैं rewrapping कर रहा हूँ, अगर मुझे एक नई लाइन का सामना करना पड़ता है जिसमें inputMaxLineLength और 85% inputMaxLineLength के बीच एक सूचकांक है, तो मैं उस नई लाइन को एक स्थान के साथ प्रतिस्थापित करता हूं क्योंकि मुझे लगता है कि यह एक कठिन लपेटने वाली नई लाइन है - जब तक कि यह तुरंत एक और नई लाइन के बाद न हो, क्योंकि तब मुझे लगता है कि यह सिर्फ एक पंक्ति अनुच्छेद है जो कि उस सीमा के भीतर होता है। ऐसा तब हो सकता है जब कोई छोटी बुलेट सूची टाइप करता है, उदाहरण के लिए।

निश्चित रूप से सही नहीं है, लेकिन मेरे परिदृश्य के लिए "पर्याप्त पर्याप्त" है, पाठ पर विचार करना आम तौर पर पिछले ई-मेल क्लाइंट द्वारा शुरू किया जाता है।

यहां कुछ कोड है, मेरे कुछ घंटों पुराने कार्यान्वयन जो शायद कुछ किनारे के मामलों में (सी # का उपयोग कर) में अंडर्रैप्स हैं। यह मेरे पिछले समाधान की तुलना में बहुत कम जटिल है, जो अच्छा है।

Test Code

किसी को भी एक बेहतर कार्यान्वयन है (और कोई संदेह नहीं है एक बेहतर कार्यान्वयन मौजूद है), तो मैं:

Source Code

और यहाँ कुछ इकाई परीक्षण है कि उस कोड का प्रयोग (MSTest का उपयोग) है आपके विचारों को पढ़ने में खुशी होगी! धन्यवाद।

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