2011-11-29 11 views
5

दिए गए स्ट्रिंग से अपवित्र शब्दों को पट्टी करने का सही तरीका क्या है:
1) मेरे पास तारों की सरणी में देखने के लिए 100 शब्दों की एक सूची है। 2) आंशिक शब्दों को संभालने का सही तरीका क्या है? ज्यादातर लोग इसे कैसे संभालते हैं? उदाहरण के लिए शब्द द्रव्यमान। फिर कभी-कभी आंशिक शब्द भी बुरा होता है - मान लीजिए कि फोबार एक बेहद अपवित्र शब्द है जिसे मैं फूबर और फूबर * और * फूबर को अस्वीकार करना चाहता हूं।एक नियमित अभिव्यक्ति (100 शब्दों की सूची) का उपयोग कर Profanity फ़िल्टर

तो क्या आप सभी शब्दों को सूची के माध्यम से एक अभिव्यक्ति या लूप में डालते हैं?

इससे निपटने का सही तरीका क्या है? मैं ग्रोवी/ग्रेइल्स का उपयोग कर रहा हूं लेकिन किसी भी आधुनिक भाषा के उदाहरणों का स्वागत है।

+2

इस लिंक को देखें: http://stackoverflow.com/questions/273516/how-do-you-implement-a-good-profanity-filter –

+1

स्कन्थोरपे समस्या के लिए देखें: http: //en.wikipedia .org/wiki/Scunthorpe_problem – rossum

उत्तर

2
  1. जुटना शब्दों की एक सूची में प्रत्येक शब्द - (foobar|foobaz|...)
  2. तब गार्ड समूह के दोनों तरफ असंगत वर्णों

    [^[email protected]#$%^&*]*(foobar|foobaz|foofii)[^[email protected]#$%^&*]*

इसके अलावा

के लिए, डाल आप शायद हूँ एक केस असंवेदनशील ध्वज का उपयोग करना चाहते हैं ताकि यह FooBaz और fOObaR जैसे शब्दों से मेल खा सके।

जहां तक ​​प्रदर्शन चलता है, इसे एक बड़े रेगेक्स के रूप में संयोजित करना शायद सबसे तेज़ है (हालांकि मैं एक विशेषज्ञ नहीं हूं)। Regex एल्गोरिदम & शाखा स्थितियों को संभालने में बहुत कुशल है। असल में, यह बेहतर होना चाहिए की तुलना में O(mn)

3

यह हल करने के लिए काफी कठिन समस्या है और आप यह निर्धारित करता है, तो नियमित अभिव्यक्ति काम करेंगे की जरूरत है (जहां m शब्दों की संख्या है और n पाठ आप खोज रहे हैं के आकार है) आपके लिए और आप एम्बेडिंग को कैसे संभालेंगे (जब आप वास्तविक एफ-शब्द को छोड़कर फ्रैक्सेफ़ेस जैसे बदनामी के लिए एक शब्दकोष शब्द जोड़ते हैं)।

नियमित अभिव्यक्तियों की आम तौर पर सीमा होती है कि वे कितने समय तक हो सकते हैं और यह आमतौर पर आपको अपने सभी शब्दों के लिए एकल रेगेक्स का उपयोग करने से रोकता है। एक स्ट्रिंग के खिलाफ कई नियमित अभिव्यक्तियों को निष्पादित करना वास्तव में धीमा है, इस पर निर्भर करता है कि आपको किस प्रदर्शन की आवश्यकता है और आपकी ब्लैकलिस्ट कितनी बड़ी हो। हम प्रारंभिक रूप से नियमित अभिव्यक्ति प्रणाली के रूप में CleanSpeak को लागू करते हैं, लेकिन यह स्केल नहीं किया गया और हम इसे एक अलग तंत्र का उपयोग करके पुनः लिखते हैं।

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

  • सूची आइटम
  • हैलो
  • हैलो
  • h_e_l_l_o
  • | - | एलो
  • h3llo
  • "हैलो वहाँ" (इस वाक्यांश में कोई भी अपवित्र शब्द नहीं हो सकता है लेकिन संयुक्त वे संयुक्त हैं)

आपको किनारे के मामलों को संभालने की भी आवश्यकता है जहां दो या दो से अधिक शब्दकोश (श्वेतसूची) शब्दों में एक दूसरे के बगल में एक बदनामी होती है।कुछ उदाहरण है कि एस शब्द शामिल:

  • बैश यह
  • ssh यह शांत समय

ये स्पष्ट रूप से गालियां बकने की क्रिया नहीं हैं, लेकिन सबसे देसी और कई वाणिज्यिक समाधान इन मामलों के साथ समस्या है।

हमने पिछले 3 वर्षों में CleanSpeak द्वारा उपयोग किए गए फ़िल्टर को पूरा करने के लिए खर्च किया है ताकि यह सुनिश्चित किया जा सके कि यह इन सभी मामलों को संभालता है और हम इसे ट्विक करना जारी रखते हैं और इसे बेहतर बनाते हैं। हमने प्रदर्शन के लिए हमारे सिस्टम को पूरा करने में 8 महीने बिताए और यह प्रति सेकंड लगभग 5,000 संदेश संभाल सकता है। यह नहीं कहना है कि आप कुछ उपयोग करने योग्य नहीं बना सकते हैं, लेकिन आने वाले कई मुद्दों को संभालने के लिए तैयार रहें और एक ऐसी प्रणाली भी तैयार करें जो नियमित अभिव्यक्तियों का उपयोग न करे।

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