2014-07-02 7 views
5

मुझे अक्सर डेटा की तुलना करने की आवश्यकता होती है। केस संवेदनशीलता के लिए अलग-अलग आवश्यकताओं के साथ मूल्य मूल्य - यह अक्सर तब आता है जब मैं एनएलपी कार्यों के लिए chatter का उपयोग कर रहा हूं।डेटा.Text के लिए केस संवेदनशील/असंवेदनशील तुलना?

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

यह सब कहना है कि मैं आसानी से प्रत्येक समानता वर्ग के लिए टाइपक्लास रैपर नहीं बना सकता, क्योंकि यह एक मूल्य-आधारित पहलू है। (इसलिए case-insensitive पैकेज ऐसा नहीं लगता है कि यह काम करेगा)।

अब तक, मैं toLower उपयोग कर रहा हूँ एक विहित अभ्यावेदन करने की है, और की तुलना उन अभ्यावेदन तो मैं पाठ तुलना कार्यों कि एक संवेदनशीलता झंडा ले, जैसे के कस्टम संस्करण बना सकते हैं:

matches :: CaseSensitive -> Text -> Text -> Bool 
matches Sensitive x y = x == y 
matches Insensitive x y = (T.toLower x) == (T.toLower y) 

हालांकि, मैं मुझे चिंतित है कि यह इनपुट टेक्स्ट पर अतिरिक्त पास लेता है। मैं कल्पना कर सकता हूं कि यह कुछ मामलों में फ्यूजिंग कर रहा है, लेकिन शायद सभी नहीं (उदाहरण: T.isSuffixOf, T.isInfixOf)।

क्या ऐसा करने का कोई बेहतर तरीका है?

+5

केस-असंवेदनशील तुलना के लिए आपको 'toLower' के बजाय वास्तव में' toCaseFold' का उपयोग करना चाहिए। हो सकता है कि इससे कोई फर्क नहीं पड़ता कि आप निश्चित रूप से अंग्रेजी के सभी पाठ अंग्रेजी के बारे में जानते हैं, लेकिन यह अभी भी अधिक सामान्य दृष्टिकोण का उपयोग करने की एक अच्छी आदत है। – Carl

+0

संभवतया आप एक शीर्ष-स्तरीय फ़ंक्शन 'isCaseSensitive' का उपयोग कर सकते हैं, शायद केस-संवेदनशील शब्दों के' डेटा.सेट '("यूएस" सहित "लेकिन" हमें "या" हम "सहित) का उपयोग करके, और समानता जांच लिखें जो कहता है 'xy मेल खाता है IsCase संवेदनशील x || है isCaseSensitive y = x == y' और '| अन्यथा = toCaseFold x == toCaseFold y' – AndrewC

उत्तर

2

यदि तुलना की शैली तुलना की जा रही चीज़ों के अर्थशास्त्र द्वारा संचालित होती है, तो क्या यह अर्थ है कि उन अर्थशास्त्रों को वास्तविक पाठ के साथ पारित किया जा सकता है? तुम भी तो सामान्य सकते हैं, जहां बार-बार से बचने के लिए उचित बाद में गुजरता है:

data Token = Token CaseSensitive Text -- Text is all lower-case if Insensitive 
    deriving Eq 

और शायद एक स्मार्ट निर्माता को परिभाषित: कि परिवर्णी शब्द "अमेरिका" कभी के बराबर की तुलना नहीं होगा

token Sensitive t = Token Sensitive t 
token Insensitive t = Token Insensitive (T.toLower t) 

इसका मतलब है शब्द "हम", लेकिन यह वैसे भी तार्किक लगता है।

आप Sensitive/Insensitive की तुलना में मानों को शब्द/शब्द/जैसे कुछ और विस्तृत रूप से टैग कर सकते हैं।

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