मुझे अक्सर डेटा की तुलना करने की आवश्यकता होती है। केस संवेदनशीलता के लिए अलग-अलग आवश्यकताओं के साथ मूल्य मूल्य - यह अक्सर तब आता है जब मैं एनएलपी कार्यों के लिए 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)।
क्या ऐसा करने का कोई बेहतर तरीका है?
केस-असंवेदनशील तुलना के लिए आपको 'toLower' के बजाय वास्तव में' toCaseFold' का उपयोग करना चाहिए। हो सकता है कि इससे कोई फर्क नहीं पड़ता कि आप निश्चित रूप से अंग्रेजी के सभी पाठ अंग्रेजी के बारे में जानते हैं, लेकिन यह अभी भी अधिक सामान्य दृष्टिकोण का उपयोग करने की एक अच्छी आदत है। – Carl
संभवतया आप एक शीर्ष-स्तरीय फ़ंक्शन 'isCaseSensitive' का उपयोग कर सकते हैं, शायद केस-संवेदनशील शब्दों के' डेटा.सेट '("यूएस" सहित "लेकिन" हमें "या" हम "सहित) का उपयोग करके, और समानता जांच लिखें जो कहता है 'xy मेल खाता है IsCase संवेदनशील x || है isCaseSensitive y = x == y' और '| अन्यथा = toCaseFold x == toCaseFold y' – AndrewC