पाठ में कोड का पता लगाने के लिए सरल विधि?


142

GMail में यह सुविधा है कि यह आपको चेतावनी देगा यदि आप एक ईमेल भेजने की कोशिश करते हैं जो यह सोचता है कि लगाव हो सकता है।

क्या आप फ़ाइलों को संलग्न करना चाहते थे?

क्योंकि GMail see the attachedने ईमेल में स्ट्रिंग का पता लगाया था , लेकिन कोई वास्तविक लगाव नहीं था, यह मुझे Send बटन पर क्लिक करने पर OK / रद्द संवाद के साथ चेतावनी देता है।

हमें स्टैक ओवरफ्लो पर संबंधित समस्या है। अर्थात्, जब कोई उपयोगकर्ता इस तरह से किसी पोस्ट में प्रवेश करता है :

मेरी समस्या यह है कि मुझे डेटाबेस बदलने की आवश्यकता है लेकिन मैं नहीं बनाऊंगा 
एक नया कनेक्शन। उदाहरण:

डेटासेट dsMasterInfo = नया डेटासेट ();
डेटाबेस db = DatabaseFactory.CreateDatabase ("ConnectionString");
DbCommand dbCommand = db.GetStoredProcCommand ("uspGetMasterName");

इस उपयोगकर्ता ने कोड के रूप में अपने कोड को प्रारूपित नहीं किया !

यही है, वे मार्कडाउन प्रति 4 रिक्त स्थान द्वारा इंडेंट नहीं करते थे, या कोड बटन (या कीबोर्ड शॉर्टकट ctrl+ k) का उपयोग करते हैं जो उनके लिए ऐसा करता है।

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

इसलिए हम Google GMail शैली चेतावनी पर विचार कर रहे हैं:

क्या आपको कोड पोस्ट करने का मतलब था?

आपने वह सामान लिखा है जो हमें लगता है कि कोड जैसा लगता है, लेकिन आपने टूलबार कोड बटन या ctrl+ kकोड फ़ॉर्मेटिंग कमांड का उपयोग करके इसे 4 स्थानों पर इंडेंट करके कोड के रूप में प्रारूपित नहीं किया।

हालाँकि, इस चेतावनी को प्रस्तुत करने से हमें लगता है कि हम जो सोचते हैं उसकी उपस्थिति का पता लगाने के लिए एक प्रश्न में अस्वाभाविक कोड है । ऐसा करने का एक सरल, अर्ध-विश्वसनीय तरीका क्या है?

  • मार्कडाउन के अनुसार , कोड हमेशा 4 स्थानों या बैकटिक्स के भीतर होता है, इसलिए सही ढंग से प्रारूपित कुछ भी चेक से तुरंत खारिज किया जा सकता है।
  • यह केवल एक चेतावनी है और यह केवल कम-प्रतिष्ठा वाले उपयोगकर्ताओं पर लागू होगा जो अपना पहला प्रश्न पूछ रहे हैं (या अपने पहले उत्तर प्रदान कर रहे हैं), इसलिए कुछ गलत सकारात्मक हैं ठीक है, इसलिए जब तक वे लगभग 5% या उससे कम नहीं हो जाते हैं।
  • स्टैक ओवरफ्लो पर प्रश्न किसी भी भाषा में हो सकते हैं, हालांकि हम "बड़ी दस" भाषाओं के लिए अपनी जांच को वास्तविक रूप से सीमित कर सकते हैं। टैग पृष्ठ के अनुसार, जो C #, Java, PHP, JavaScript, Objective-C, C, C ++, Python, Ruby होगा।
  • अपने संभावित समाधान का ऑडिट करने के लिए स्टैक ओवरफ़्लो क्रिएटिव कॉमन्स डेटा डंप का उपयोग करें (या स्टैक ओवरफ़्लो पर शीर्ष 10 टैग में कुछ प्रश्न चुनें ) और देखें कि यह कैसे होता है।
  • स्यूडोकोड ठीक है, लेकिन यदि आप अतिरिक्त अनुकूल होना चाहते हैं तो हम सी # का उपयोग करते हैं।
  • बेहतर (जितना लंबे समय तक काम करता है) उतना ही सरल। चुम्मा! यदि आपके समाधान के लिए हमें 10 अलग-अलग संकलकों में पदों को संकलित करने का प्रयास करने की आवश्यकता है, या लोगों की एक सेना को मैन्युअल रूप से एक बेइज़ियन इंट्रेंस इंजन को प्रशिक्षित करने की आवश्यकता है, तो यह ... बिल्कुल वैसा नहीं जैसा कि हमारे पास था।

34
मुझे लगता है कि यदि आप हमेशा चेतावनी प्रदर्शित करते हैं यदि कोई इंडेंटेशन मौजूद नहीं है, तो आप 5% त्रुटि सीमा से नीचे होंगे। यह केवल एक मजाक के रूप में आधा है।
कोनराड रुडोल्फ

59
@ कोनराड यह और भी बेहतर काम करेगा यदि संदेश होगा: 'या तो आपके प्रश्न में कोड नमूने गायब हैं जो दूसरों को इसे समझने में मदद करेंगे या आप उन्हें ठीक से इंडेंट करना भूल गए'। यह सभी मामलों में 99% को कवर करना चाहिए।
थोरस्टेन मुलर

3
यह एक अच्छा सवाल है, लेकिन मुझे लगता है कि इसका कोई जवाब नहीं है। आप मुझे एक बेवकूफ-सबूत प्रणाली दिखाते हैं और मैं आपको एक बेहतर बेवकूफ दिखाऊंगा। भले ही इस समस्या को CODE द्वारा संबोधित किया जा सकता है, शायद यह नहीं होना चाहिए? यह ऐसे अज्ञानी लोग हैं, जिन्हें प्रॉपर क्वेश्चन पूछने की जहमत नहीं उठाई जा सकती है, जो मेरे जैसे लोगों के लिए इस साइट को RUINING कर रहे हैं, जो उचित सवाल पूछते हैं और सही जवाब देने में मदद करते हैं।
maple_shaft

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

3
साइड नोट पर, GMail पुष्टिकरण पाठ भ्रामक है। यदि पहले प्रश्न पर आपका उत्तर 'हां' है तो दूसरे प्रश्न पर उत्तर 'नहीं' है ...
pimvdb

जवाबों:


147

एक उचित समाधान शायद कुछ सीखा / सांख्यिकीय मॉडल होगा, लेकिन यहां कुछ मजेदार विचार हैं:

  1. एक पंक्ति के अंत में अर्ध-कॉलोन । यह अकेला भाषाओं के एक पूरे समूह को पकड़ लेगा।
  2. अलग करने के लिए कोई जगह नहीं के साथ सीधे पाठ के बाद कोष्ठक: myFunc()
  3. दो शब्दों के बीच एक बिंदु या तीर: foo.bar = ptr->val
  4. घुंघराले ब्रेसिज़, कोष्ठक की उपस्थिति: while (true) { bar[i]; }
  5. "टिप्पणी" वाक्य रचना की उपस्थिति (/ *, //, आदि): /* multi-line comment */
  6. असामान्य वर्ण / ऑपरेटर: +, *, &, &&, |, ||, <, >, ==, !=, >=, <=, >>, <<, ::, __
  7. पाठ पर अपना सिंटैक्स हाइलाइटर चलाएँ। यदि यह इसके कुछ उच्च प्रतिशत को उजागर करता है, तो संभवतः यह कोड है।
  8. पोस्ट में कैमलकेस टेक्स्ट।
  9. नेस्टेड कोष्ठक, ब्रेसिज़, और / या कोष्ठक।

इनमें से प्रत्येक के प्रकट होने के समय की संख्या पर नज़र रखी जा सकती है, और इनका उपयोग मशीन-लर्निंग एल्गोरिदम में सुविधाओं के रूप में किया जा सकता है , जैसे कि पेरेसेट्रॉन , जिस तरह से SpamAssassin करता है।


25
टिप्स: 3 का वजन बहुत कम है, क्योंकि शब्दों के बीच एक डॉट टाइपो का परिणाम हो सकता है। 5 URL से मेल नहीं खाना चाहिए। 6 के लिए एम्परसेंड का उपयोग अक्सर कोड संदर्भ के बाहर भी किया जाता है, जिससे आप उस वर्ण को कम कर सकते हैं। यदि हाइलाइटर काम करता है तो डबल चेक करें, क्योंकि यह नॉन-कोड टेक्स्ट को हाइलाइट कर सकता है जैसा कि मैं कभी-कभी नोटपैड ++ में देखता हूं।
तमारा विज्समन

8
वे । एक टाइपो के रूप में - झंडा फहराने में कोई बुराई नहीं होगी जैसा कि लेखक को वैसे भी संपादित करना चाहिए।
user151019

4
इसके अतिरिक्त, विशिष्ट कीवर्ड जिनकी कई भाषाएं मदद कर सकती हैं: WHILE, ELSE, IF, LOOP, BREAK, आदि
JoséNunoFerreira

6
"नॉन न्यूमेरिक शब्दों से पहले $ का उपयोग करें: $ var पर्ल और PHP (और रूबी?) में आम है।"
फीलो

4
तुम मेरी का पता नहीं लगा होगा SELECT DISTINCT name FROM people WHERE id IS NOT NULL
बेनोइट

54

मैं यह देखने के लिए उत्सुक होगा कि एक तरफ लिखित अंग्रेजी के औसत मैट्रिक्स क्या हैं, और दूसरी तरफ कोड।

  • पैराग्राफ की लंबाई
  • लाइनों की लंबाई
  • शब्दों का आकार
  • चार्ट का इस्तेमाल किया
  • अल्फाबेटिक, न्यूमेरिक और अन्य प्रतीक वर्णों के बीच का अनुपात
  • प्रति शब्द प्रतीकों की संख्या
  • आदि।

हो सकता है कि अकेले ही कोड और बाकी के बीच पहले से ही भेदभाव हो। कम से कम मेरा मानना ​​है कि कोड, भाषा की परवाह किए बिना, कई मामलों में कुछ अलग-अलग मीट्रिक दिखाएगा।

अच्छी खबर यह है: आपके पास पहले से ही अपने आंकड़े बनाने के लिए बहुत सारे डेटा हैं।


ठीक है मैं अपनी धारणाओं को वापस लेने के लिए कुछ डेटा के साथ वापस आ गया हूं। :-)

मैं अपनी पोस्ट पर एक त्वरित और गंदे परीक्षण किया और पर पहली पोस्ट मैं StackOverflow पर पाया , एक बहुत उन्नत उपकरण के साथ: wc

wcपाठ भाग पर और उन दो उदाहरणों के कोड भाग पर चलने के बाद मेरे पास यहां क्या है :

पहले अंग्रेजी भाग को देखो :

  • आपकी पोस्ट का अंग्रेजी हिस्सा (2635 वर्ण, 468 शब्द, 32 लाइनें)
    • 5 वर्ण / शब्द, 82 वर्ण / पंक्ति, 14 शब्द / पंक्ति
  • अन्य पोस्ट का अंग्रेजी हिस्सा (1499 वर्ण, 237 शब्द, 12 लाइनें)
    • 6 वर्ण / शब्द, 124 वर्ण / पंक्ति, 19 शब्द / पंक्ति

सुंदर समान नहीं लगता है?

अब कोड भाग पर एक नज़र डालते हैं !

  • आपकी पोस्ट का कोड भाग (174 वर्ण, 13 शब्द, 3 पंक्तियाँ)
    • 13 वर्ण / शब्द, 58 वर्ण / पंक्ति, 4 शब्द / पंक्ति
  • अन्य पोस्ट का कोड हिस्सा (4181 वर्ण, 287 शब्द, 151 लाइनें)
    • 14 वर्ण / शब्द, 27 वर्ण / पंक्ति, 2 शब्द / पंक्ति

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

मैं खतरनाक कुकी कर सकता हूं?


6
लाइन की लंबाई, खासकर यदि आप बुलेट बिंदुओं को बाहर करते हैं और किसी विशेष लंबाई से कम की गुच्छेदार लाइनों को देखते हैं जिसमें विशिष्ट विराम चिह्न एक अच्छा उपाय होगा।
जॉन हॉपकिंस

यह कोड के ब्लॉक के लिए काम करेगा, लेकिन इनलाइन सीडीडी के लिए यह देखना बहुत कठिन होगा। यह सुनिश्चित नहीं है कि यह कितना मायने रखता है, हालांकि - बड़ी समस्या वैसे भी बिना कोड के बड़े ब्लॉक है।
cHao

3
कुकीज़ नहीं। आपकी पोस्ट का लिंक 404 है।
james.garriss

@ james.garriss: इंटरनेट ने मेरी कुकी जार चुरा ली। :( हालांकि नोटिस के लिए धन्यवाद।
जूलियन गुर्टाल्ट

23

आमतौर पर, मार्कोव श्रृंखलाएं पाठ उत्पन्न करने के लिए उपयोग की जाती हैं, लेकिन उन्हें एक प्रशिक्षित मॉडल को पाठ की समानता (प्रति सीई शैनन 1950 ) की भविष्यवाणी करने के लिए भी इस्तेमाल किया जा सकता है । मैं कई मार्कोव श्रृंखलाओं की सिफारिश करता हूं।

प्रत्येक प्रचलित भाषा के लिए, भाषा में कोड के एक बड़े, प्रतिनिधि नमूने पर मार्कोव श्रृंखला को प्रशिक्षित करें। फिर, एक स्टैक ओवरफ्लो पोस्ट के लिए जिसके लिए आप कोड का पता लगाना चाहते हैं, प्रत्येक श्रृंखला के लिए निम्न कार्य करें:

  • पोस्ट में लाइनों के माध्यम से लूप।
    • दो चर घोषित करें: ACTUAL = 1.0 और उच्चतम = 1.0
    • लाइन में प्रत्येक वर्ण के माध्यम से लूप।
      • प्रत्येक वर्ण के लिए, मार्कोव श्रृंखला में संभावना पाते हैं कि वर्तमान वर्ण पिछले N वर्णों का अनुसरण करने वाला है। निर्धारित करें = ACTUAL * PROB । यदि वर्तमान वर्ण श्रृंखला में मौजूद नहीं है, तो 0.000001 की तरह PROB 1 के लिए एक छोटे मूल्य का उपयोग करें ।
      • अब, पिछले N वर्णों का अनुसरण करने के लिए चरित्र को सबसे अधिक संभावना (यानी उच्चतम संभावना) ढूंढें। उच्चतम सेट करें = उच्चतम * PROB 2
      • जाहिर है, PROB 2 > = PROB 1

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

my problem is I need to change the database but I don't won't to create // 0.0032
a new connection. example: // 0.0023

DataSet dsMasterInfo = new DataSet(); // 0.04
Database db = DatabaseFactory.CreateDatabase("ConnectionString");   // 0.05
DbCommand dbCommand = db.GetStoredProcCommand("uspGetMasterName");  // 0.04

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

प्रशिक्षण

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

"()" 0.5-> ";"
"()" 0.2-> "."
"()" 0.3-> "{"

पहले पढ़ा जाना चाहिए, उदाहरण के लिए "संभावना है कि एक अर्धविराम खाली पेरेंटाइल का अनुसरण करता है 0.5"।

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

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

मेरे शोध के दौरान , हमने पाया कि हमारे तरीकों ने स्पेनिश के साथ-साथ अंग्रेजी के लिए भी अच्छा काम किया। मैं यह नहीं देखता कि यह स्रोत कोड के लिए भी अच्छा काम क्यों नहीं करेगा। स्रोत कोड मानव भाषा की तुलना में और भी अधिक संरचित और अनुमानित है।


2
केवल एक ही समस्या मुझे समझ में आती है कि संभावनाएँ आपके खिलौने के उदाहरण की तुलना में बहुत कम होंगी । संख्यात्मक अस्थिरता को देखते हुए, इसका मतलब है कि जल्द ही सभी संभावनाएं हैं 0. लॉग ऑड्स का उपयोग करना हालांकि यह हल करता है। इसके अलावा, मैं बड़े टोकन का उपयोग करता हूं (यानी वर्ण नहीं बल्कि शब्द / विराम चिह्न)।
कोनराड रुडोल्फ

2
@Konrad: यहाँ विचार पूर्ण संभावनाओं का परीक्षण करने के लिए नहीं है: यह सापेक्ष संभावनाओं का परीक्षण करने के लिए है। प्रत्येक पंक्ति के लिए, उस रेखा का पाठ अंग्रेजी भाषा के मॉडल या एक कोड भाषा मॉडल द्वारा उत्पन्न होने की अधिक संभावना है।
केन ब्लूम

5
आप इस मॉडल को मौजूदा एसओ पदों पर प्रशिक्षित कर सकते हैं (विशेषकर क्योंकि आपको मार्कडाउन सिंटैक्स के लिए खाते की आवश्यकता हो सकती है)। यदि आप मान लेते हैं कि अधिकांश पोस्ट सही तरीके से फॉर्मेट की गई हैं (या आप बड़ी संख्या में पोस्टों के माध्यम से, हजारों के दसियों क्रम में, उन पोस्ट को हटाने के लिए जिन्हें सही तरीके से फॉर्मेट नहीं किया गया है), तो आप मान लेते हैं कि कोड फॉर्मेट नहीं किया गया सामान अंग्रेजी पाठ है , और कोड स्वरूपित सामान कोड है, आप वास्तविक SO उत्तरों से प्रशिक्षित कर सकते हैं।
केन ब्लूम

1
इसे कैसे करें (जावा में लिंगपाइप का उपयोग कैसे करें) के बारे में एक ट्यूटोरियल लिंगपाइप की वेबसाइट से उपलब्ध है । ट्यूटोरियल के अंत में, इस समस्या से निपटने के लिए तकनीकों पर कई कागजात हैं। मैं उन्हें पढ़ने का सुझाव देता हूं।
केन ब्लूम

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

13

क्या मुझे मौलिक रूप से भिन्न दृष्टिकोण का सुझाव देना चाहिए? SO पर केवल मानव-भाषा की अनुमति दी गई अंग्रेजी है, इसलिए जो कुछ भी गैर-अंग्रेजी है , उसमें 99.9% कोड स्निपेट होने की संभावना है

तो मेरी समाधान होगा: कई अंग्रेजी भाषा-चेकर्स में से एक वहाँ बाहर का उपयोग करें (- बगल में ग़लत वर्तनी - डबल डॉट्स, या गैर-भाषा प्रतीकों की तरह वाक्यविन्यास गलतियों बस सुनिश्चित करें कि वे भी संकेत कर #या ~)। फिर कोई भी लाइन / पैराग्राफ जो बड़ी मात्रा में त्रुटियों और चेतावनियों को फेंकता है, उसे "यह कोड है?" सवाल।

यह दृष्टिकोण उन स्टैकएक्सचेंज साइटों के लिए अनुकूलित किया जा सकता है जो निश्चित रूप से अंग्रेजी के अलावा अन्य भाषाओं का उपयोग कर रहे हैं।

बस मेरे 2 ¢ ...


16
समस्या यह है कि आने वाले कई प्रश्न अंग्रेजी भी नहीं हैं (हालाँकि वे इसे पसंद करते हैं)।
ब्रेंडन लॉन्ग

3
@ ब्रेंडन - इस प्रस्ताव का तब जोड़ा गया: पोस्ट के शायद-इच्छित-से-अंग्रेज़ी भागों में गलतियों को रेखांकित (या उजागर) करें और लेखक को अंग्रेजी में ... लिखने में मदद करें! ;)
मैक

1
मैं डच हूं और सब कुछ मैं कोड अंग्रेजी में हूं, टिप्पणी के अनुसार (परियोजना के आधार पर) नहीं हैं। तो गैर-अंग्रेजी कोड होना चाहिए पर्याप्त नहीं होगा। कि या आप का मतलब है कि टूटी हुई अंग्रेजी कोड होना चाहिए।
इवो ​​लिममेन

@ इवो - मेरी टिप्पणी मजाकिया ढंग से टूटी हुई अंग्रेजी मुद्दे पर संबोधित की गई थी! ;) हालांकि मैं कहूंगा कि मेरे प्रस्ताव के साथ किसी अन्य भाषा में टिप्पणियाँ सिर्फ ठीक काम करेंगी ... अंग्रेजी में OTOH ब्लॉक टिप्पणी "यह कोड नहीं है?" सवाल है, लेकिन यह ठीक है क्योंकि जिस कोड के लिए टिप्पणी लिखी गई है, वह पहले से ही इसे ट्रिगर कर देगा ...
मैक

11

मैं शायद इसके लिए कुछ डाउन वोट प्राप्त करने जा रहा हूं, लेकिन मुझे लगता है कि आप इसे गलत एंगल से ले रहे हैं।

यह लाइन मुझे मिली:

लोगों को उन लोगों के लिए मैन्युअल रूप से प्रारूप कोड में जाना पड़ता है जो किसी भी तरह से यह पता लगाने में असमर्थ हैं

आईएमओ कि दृष्टिकोण एक तरह से अभिमानी है। मुझे सॉफ़्टवेयर डिज़ाइन में यह बहुत मिलता है जहाँ प्रोग्रामर और डिज़ाइनर उन उपयोगकर्ताओं से परेशान हो जाते हैं जो यह पता नहीं लगा सकते हैं कि सॉफ्टवेयर का सही उपयोग कैसे किया जाए, जब समस्या उपयोगकर्ता की नहीं बल्कि सॉफ्टवेयर की ही हो - या यूआई कम से कम।

इस समस्या का मूल कारण उपयोगकर्ता नहीं है, लेकिन तथ्य यह है कि यह उनके लिए स्पष्ट नहीं है कि वे ऐसा कर सकते हैं।

यह अधिक स्पष्ट करने के लिए UI में परिवर्तन के बारे में कैसे? निश्चित रूप से यह होगा:

  1. नए उपयोगकर्ताओं के लिए अधिक स्पष्ट वही है जो उन्हें करने की आवश्यकता है
  2. भाषाओं की भीड़ के कोड लॉजिक का पता लगाने के लिए जटिल एल्गोरिदम लिखने के बजाय आपको बनाना आसान है

उदाहरण:

यहां छवि विवरण दर्ज करें


26
वास्तव में यह IMO खराब प्रश्नों को लागू करता है जैसे "मुझे एक समस्या है कृपया मेरी मदद करें, कोड नीचे है" - काफी कम कोड को प्रश्न से अलग करने की आवश्यकता है। सर्वश्रेष्ठ प्रश्न इस तरह से चलते हैं "मैं इसे हासिल करना चाहता हूं और कोड की इन दो पंक्तियों को लिखा है, लेकिन प्रभाव निम्नलिखित है, समस्या क्या है" - वहाँ बहुत कम कोड है जो सादे भाषा के साथ बहुत अधिक हस्तक्षेप करता है।
शार्प जुथ

4
आपका जड़ अवलोकन सही है लेकिन अपने निदान अभी भी गलत है: वास्तव में, जेफ है इस दृष्टिकोण के माध्यम से यूजर इंटरफेस बेहतर बनाने की कोशिश। इसके अलावा, वर्तमान यूआई पहले ही कई चक्रों से गुजर चुका है और जबकि मुझे संदेह नहीं है कि इसमें सुधार किया जा सकता है (काफी), मुझे संदेह है कि यह आलसी बेवकूफों के खिलाफ मदद करेगा। न ही आपका प्रस्तावित समाधान होगा। @ शार्टपूथ में यह कवर है।
कोनराड रुडोल्फ

2
मैं बॉक्स के बारे में सोचने के लिए +1 करूंगा लेकिन मैं विशिष्ट सुझाव से असहमत हूं, क्योंकि "सपोर्टिंग कोड" पोस्ट करने से एक प्रश्न प्रवाह होता है जो अप्राकृतिक हो सकता है। मैंने अपने प्रश्न के निचले भाग में कभी भी कोड नहीं डाला है। मैं लगभग हमेशा एक परिचय, नमूना कोड, फिर वास्तविक प्रश्न पोस्ट करता हूं । यदि आप इस आधार को स्वीकार करते हैं कि इनलाइन कोड आवश्यक है, तो कुछ प्रकार के प्रारूपण की आवश्यकता होती है - प्रारूपण जिसे उपयोगकर्ता द्वारा दर्ज किया जाना चाहिए या सिस्टम द्वारा अनुशंसित किया जाना चाहिए। और यही वह सटीक काम है जो जेफ करने के बारे में पूछ रहा है।
निकोल

1
@ कोनराड: मेरी उपरोक्त टिप्पणी के अलावा और आपकी प्रतिक्रिया में, मुझे विश्वास नहीं है कि जेफ इस रास्ते को लेकर यूआई में सुधार कर रहा है, लेकिन केवल एक अंतर्निहित समस्या के लक्षणों का इलाज कर रहा है। यदि UI में सुधार किया गया था ताकि गलती न हो सके, तो उपयोगकर्ता को सचेत करने का समाधान आवश्यक नहीं होगा। मैं इस भ्रम में नहीं हूं कि मेरा उदाहरण अंतिम समाधान है, लेकिन कुछ लोगों को इस सवाल पर जाने की आवश्यकता है "क्या हम इसे सर्वोत्तम तरीके से प्रस्तुत कर रहे हैं?"।
मैट_सबरी

1
पाठ बॉक्स के चारों ओर बटन का उपयोग करके{} सरल वाक्य कृपया मार्क कोड पर्याप्त हो सकता है।
पाओलो एबरमन

11

छद्म कोड एक वास्तविक चुनौती होगा क्योंकि सभी प्रोग्रामिंग भाषा '[]', ',', ',' ('') आदि जैसे विशेष वर्णों पर निर्भर करती हैं, बस इन विशेष वर्णों की घटना की गणना करें। जैसे आप एक बाइनरी फ़ाइल का पता लगाते हैं (5% से अधिक नमूने में बाइट मान 0 होता है)।


मैं इसे इन विशेष वर्णों के समूहों जैसे कि [] () में सुधार करूँगा; {} = प्रत्येक पंक्ति जिसमें इनमें से 2-3 से अधिक समूह शामिल हैं, कोड की एक पंक्ति है।
होनज़ा

... और सबसे आम भाषाओं में भी सामान्य तार की तलाश करें, जैसे "= someord ();" अधिकांश घुंघराले ब्रैकेट भाषाओं के लिए, XML- जैसे सिंटैक्स जैसे "<कुछ>" और "<ab: cde>", और अन्य भाषाओं में अन्य सामान्य तार। मेरा मानना ​​है कि सामान्य वाक्यविन्यास की कुछ प्रकार की लुकअप तालिका एक अच्छा समाधान होगी, क्योंकि जब आप नई भाषाओं को लागू करने के लिए पाते हैं, तो आप इसका विस्तार कर सकते हैं।
सिस्टाद

आपको संभवतः छद्म कोड छोड़ देना चाहिए। कुछ लोग इसे सी-स्टाइल भाषा के रूप में लिखना पसंद करते हैं, लेकिन अन्य लोग सादे अंग्रेजी का उपयोग कुछ ऐसी चीज़ों के साथ करेंगे जो VB6 के करीब लगती हैं
जेम्स पी।

4

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

मेरी पहली कट सीक्वेंस की तलाश होगी "; \ n" जो आपको सी, सी ++, जावा, सी # और किसी भी अन्य भाषा के लिए एक अच्छा मैच मिलेगा जो समान सिंटैक्स का उपयोग करता है और वास्तव में सरल है। यह भी एक की तुलना में अंग्रेजी में उपयोग किए जाने की संभावना कम है; बिना किसी नई रेखा के


प्लस शायद घुंघराले ब्रेसिज़ की एक बहुतायत; पी
मार्क ग्रेवेल

1
जैसा कि जेफ़ अपने पोस्ट में कहते हैं, वे शायद मुख्य भाषाओं को ही लक्षित करेंगे। और किसी भी मामले में, मुझे संदेह है कि नए उपयोगकर्ता (जिनके लिए यह कार्यशीलता इरादा है), C # या जावास्क्रिप्ट पोस्ट करने की संभावना अधिक होगी, कह सकते हैं, INTERCAL ;-)
बेन

हां, लेकिन यह प्रोग्रामिंग भाषा BRAINFUCK या BLANK के साथ काम नहीं करेगा। ;-)
इवो ​​लिममेन

4

किसी ने टैग्स को देखने का उल्लेख किया और फिर उसके लिए वाक्यविन्यास की तलाश की, लेकिन इसे गोली मार दी गई क्योंकि यह नए उपयोगकर्ताओं के लिए लक्षित है।

प्रश्न के शरीर में भाषा के नाम देखने के लिए एक संभावित बेहतर समाधान होगा, फिर उसी रणनीति को लागू करें। यदि मैं "जावास्क्रिप्ट", "जावा" या "सी #" का उल्लेख करता हूं, तो संभावना है कि प्रश्न के बारे में क्या है, और प्रश्न में कोड उस भाषा में होने की संभावना है।


खासकर अगर शीर्षक कुछ ऐसा है जैसे "vb c # .net डॉट नेट मेरी मदद करो मेरी मदद करो !!!"
निकाल्विन

1

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

तब विराम चिह्न / विशेष वर्ण होते हैं जो सादे अंग्रेजी के लिए विशिष्ट नहीं होते हैं, कोड के लिए विशिष्ट होते हैं:

  • something(); बस सादा अंग्रेजी नहीं हो सकती;
  • $somethingजहां somethingसभी संख्यात्मक नहीं है;
  • -> शब्दों के बीच w / o रिक्त स्थान;
  • . शब्दों के बीच w / o स्थान;

बेशक, यह अच्छी तरह से काम कर रहा है, आप इन विशेषताओं के शीर्ष पर निर्मित बायेसियन क्लासिफायरियर होना चाह सकते हैं।


1
एक गैर इंडेंट युक्त लाइन का पता लगाना (); संदेश का सुझाव देने के लिए एक अच्छा कारण होगा।

कोड को चिपकाए जाने से पहले कौन-सा वर्तनी परीक्षक चोक नहीं करेगा?
टिम पोस्ट

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

@Ph: ये प्रश्न / उत्तर वैसे भी एसओ पर स्वीकार नहीं किए जाते हैं।
vartec

1

भाषाओं के कई सेट हैं जो समान सिंटैक्स साझा करते हैं। अधिकांश भाषाएं कुछ भाषाओं से प्रभावित हुईं, इसलिए भाषाएं [AMPL, AWK, csh, C ++, C--, C #, ऑब्जेक्टिव-सी, बिटकॉइन, डी, गो, जावा, जावास्क्रिप्ट, लिम्बो, एलपीसी, पर्ल, पीएचपी, PHP पाइक, प्रोसेसिंग [सभी C से प्रभावित थे, इसलिए यदि आप C का पता लगाते हैं तो आप शायद इन सभी भाषाओं का पता लगा लेंगे। इसलिए आपको केवल इस भाषा-सेट का पता लगाने के लिए एक सरल पैटर्न लिखना होगा।

मैं पाठ को ब्लॉकों में भी विभाजित कर दूंगा क्योंकि अधिकांश कोड पोस्ट में अन्य टेक्स्ट ब्लॉक से दो नईलाइन या समान से विभाजित होंगे।

यह जावास्क्रिप्ट के साथ आसान हो सकता है (सी परिवार के लिए एक अधूरा अधूरा नमूना):

var txt = "my problem is I need to change the database but I don't won't to create a new connection. example:\n\nDataSet dsMasterInfo = new DataSet();Database db = DatabaseFactory.CreateDatabase(&quot;ConnectionString&quot;);DbCommand dbCommand = db.GetStoredProcCommand(&quot;uspGetMasterName&quot;);";
var blocks = txt.split(/\n\n/gi); console.dir(blocks);
var i = blocks.length;
var cReg = /if\s*\(.+?\)|.*(?:int|char|string|short|long).*?=.+|while\s*\(.+?\)/gi;

while ( i-- ){
   var current = blocks[i];
   if ( cReg.test( current ) ){
      console.log("found code in block[" +  i + "]");
   }
}

0

बस प्रत्येक पंक्ति के लिए शब्दों / विराम चिह्न वर्ण की गणना करें। अंग्रेजी में 4 या अधिक, 2 से कम कोड होगा।

ऊपर दिए गए पैराग्राफ में 18 शब्द हैं, और 4 विराम चिह्न वर्ण, उदाहरण के लिए। इस अनुच्छेद में 19 शब्द और 4 विराम चिह्न हैं, इसलिए अपेक्षाओं के भीतर।

बेशक, यह नौसिखिया गरीब-अंग्रेजी बोलने वालों के सवालों के खिलाफ परीक्षण किए जाने की आवश्यकता होगी, और यह हो सकता है कि उन मामलों में, आंकड़ों को छोड़ दिया जाए।

मुझे उम्मीद है कि [गैर-व्हाट्सएप]। [व्हाट्सएप या न्यूलाइन] कोड में बहुत दुर्लभ है, लेकिन अंग्रेजी में आम है, इसलिए इसे शब्दों के रूप में गिना जा सकता है, विराम चिह्न नहीं।

मुझे लगता है कि सबसे बड़ी समस्या इनलाइन कोड होगा, जहां कोई व्यक्ति एक सवाल पूछता है जैसे:

अगर मैं (i = 0; i> 100; i ++) के लिए कहता हूं {} इसका क्या मतलब है?

यह कोड और अंग्रेजी है, और इसे बैक-टिक के साथ चिह्नित किया जाना चाहिए:

अगर मैं कहूं for (i=0; i>100; i++) {}कि इसका क्या मतलब है?


0

मुझे लगता है कि आपको पहले (पर्याप्त रूप से) स्वरूपित कोड के बीच एक अंतर करना चाहिए, जिसे केवल वास्तव में इस तरह के रूप में नामित करने की आवश्यकता है, और (बहुत) खराब स्वरूपित कोड, जिसे वैसे भी मैन्युअल स्वरूपण की आवश्यकता है।

स्वरूपित कोड में ब्रेकलाइन और इंडेंटेशन है। वह है: यदि एक लाइन एक एकल ब्रेकलाइन से पहले है, तो आपके पास एक अच्छा उम्मीदवार है। यदि इसके शीर्ष पर व्हाट्सएप है, तो आपके पास बहुत अच्छा उम्मीदवार है।

सामान्य पाठ दो ब्रेकलाइन या दो रिक्त स्थान और स्वरूपण के लिए एक ब्रेकलाइन का उपयोग करता है, इसलिए भेद के लिए एक स्पष्ट मानदंड है।

LISP कोड में आपको अर्धविराम नहीं मिलेंगे, Ruby कोड में आपको कोष्ठक नहीं मिल सकते हैं, छद्म कोड में आपको बहुत कुछ नहीं मिल सकता है। लेकिन किसी भी (गैर-गूढ़) भाषा में आपको ब्रेकलाइन और इंडेंटेशन के साथ सभ्य कोड मिलेगा। वहाँ के रूप में सार्वभौमिक रूप में कुछ भी नहीं है। क्योंकि अंत कोड में, मनुष्यों द्वारा पढ़ा जाने वाला लिखा गया है।

तो पहले, कोड की संभावित लाइनों की खोज करें । इसके अलावा, कोड की लाइनें आमतौर पर समूहों में आती हैं। यदि आपके पास एक है, तो एक अच्छा मौका है कि ऊपर या नीचे एक कोड की एक पंक्ति है।

एक बार जब आप कोड की संभावित रेखाओं को निकाल लेंगे, तो आप उन्हें मात्रात्मक मानदंड के विरुद्ध देख सकते हैं और कुछ सीमाएँ चुन सकते हैं :

  • गैर-शब्द वर्णों की आवृत्ति
  • पहचानकर्ताओं की आवृत्ति: बहुत कम शब्द या बहुत लंबे शब्द CamelCase या under_score शैली के साथ
  • असामान्य शब्दों की पुनरावृत्ति

इसके अलावा, अब जब प्रोग्रामर और सीएस हैं, तो स्टैकओवरफ्लो का दायरा स्पष्ट रूप से कम हो गया है। सभी भाषा टैग को भाषा के रूप में चिह्नित करने पर विचार हो सकता है। और पोस्ट करते समय, आपसे कम से कम एक भाषा टैग लेने के लिए कहा जाएगा, टैग चुनें language-agnosticया इसे स्पष्ट रूप से छोड़ें।

पहले मामले में आप जानते हैं कि किन भाषाओं को देखना है, दूसरे मामले में, आप छद्म कोड की तलाश कर सकते हैं और अंतिम स्थिति में, शायद कोई कोड नहीं होगा, क्योंकि यह किसी तकनीक से संबंधित प्रश्न है या ढांचा या ऐसा।


0

आप उस प्रत्येक भाषा के लिए एक पार्सर बना सकते हैं जिसका आप पता लगाना चाहते हैं (ANTLR के लिए भाषा परिभाषाएं आमतौर पर खोजना आसान हैं), फिर प्रत्येक पार्सर के माध्यम से प्रश्न की प्रत्येक पंक्ति को चलाएं। यदि कोई रेखा सही ढंग से पार्स करती है, तो आपके पास शायद कोड है।

इसके साथ समस्या यह है कि कुछ अंग्रेजी (प्राकृतिक भाषा) वाक्य कोड के रूप में पार्स कर सकते हैं, इसलिए आप कुछ अन्य विचारों को भी शामिल करना चाह सकते हैं, या आप सकारात्मक परिणाम सीमित कर सकते हैं यदि एक या दो लगातार लाइनों के साथ सही ढंग से पार्स करें। वही भाषा पार्सर।

अन्य संभावित मुद्दा यह है कि यह संभवतः स्यूडोकोड नहीं उठाएगा, लेकिन यह ठीक हो सकता है।


अक्सर लोगों को उनके कोड में सिंटैक्स त्रुटियां होती हैं (और इस बारे में पूछ रहे हैं)।
पाओलो एबरमन

0

सबसे अधिक भविष्य के प्रमाण क्या हो सकते हैं और लंबे समय में कम से कम मैनुअल समायोजन की आवश्यकता होती है, क्योंकि अन्य भाषाएं (जो कि अब उपयोग की जाने वाली प्रोग्रामिंग भाषाओं की तुलना में कुछ अलग दिखती हैं) अधिक लोकप्रिय हो जाती हैं और वर्तमान में उपयोग की जाने वाली भाषाएं कम लोकप्रिय हो जाती हैं, ऐसा करना है कुछ ऐसा है जैसे Google अनुवाद क्या करता है (पैरा का शीर्षक "यह कैसे काम करता है?") देखें, इसके बजाय कुछ चीज़ें जैसे ab और a (), आदि की तलाश करें।

दूसरे शब्दों में, मैन्युअल रूप से देखने के लिए कोड में पाए जाने वाले पैटर्न के बजाय, कंप्यूटर इसे स्वयं ही समझ सकता है । यह होने से किया जा सकता है

  1. कई अलग-अलग प्रोग्रामिंग भाषाओं में बहुत सारे कोड

    • सुझाव: स्वचालित रूप से वेब-आधारित स्रोत कोड रिपॉजिटरी जैसे Google कोड या जीथब से कोड नमूने लें, या यहां तक ​​कि पहले से ही कोड के रूप में चिह्नित Stackoverflow पर चीजों से

    • नोट: कोड टिप्पणियों को पार्स करना एक अच्छा विचार हो सकता है

  2. वेब पर लेखों से बहुत सारे अंग्रेजी पाठ

    • यद्यपि प्रोग्रामिंग के बारे में लेखों से नहीं (अन्यथा उनके पास कोड हो सकते हैं और सिस्टम को मिला सकते हैं :-))

और किसी प्रकार के एल्गोरिथ्म को स्वचालित रूप से कोड में ऐसे पैटर्न मिलते हैं जो अंग्रेजी में नहीं हैं, और इसके विपरीत, और उन पैटर्नों का उपयोग करके पता लगा सकते हैं कि कोड क्या है और कोड पर एल्गोरिथ्म चलाकर कोड क्या नहीं है।

(हालांकि, मुझे यकीन नहीं है कि इस तरह का एल्गोरिदम कैसे काम करेगा। वर्तमान प्रश्न के अन्य उत्तर उसके लिए उपयोगी जानकारी हो सकते हैं।)

फिर सिस्टम उस समय कोड को देखने के तरीके को बदलने के लिए हर एक बार कोड को फिर से स्कैन कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.