วิธีง่าย ๆ ในการตรวจจับโค้ดในข้อความอย่างน่าเชื่อถือ?


142

GMail มีคุณสมบัตินี้ซึ่งจะเตือนคุณหากคุณพยายามส่งอีเมลที่คิดว่าอาจมีไฟล์แนบ

คุณหมายถึงแนบไฟล์หรือไม่?

เนื่องจาก GMail ตรวจพบสตริงsee the attachedในอีเมล แต่ไม่มีสิ่งที่แนบมาจริงจึงเตือนฉันด้วยกล่องโต้ตอบตกลง / ยกเลิกเมื่อฉันคลิกปุ่มส่ง

เรามีปัญหาที่เกี่ยวข้องกับ Stack Overflow กล่าวคือเมื่อผู้ใช้เข้าสู่โพสต์เช่นนี้ :

ปัญหาของฉันคือฉันต้องเปลี่ยนฐานข้อมูล แต่ฉันจะไม่สร้าง 
การเชื่อมต่อใหม่ ตัวอย่าง:

ชุดข้อมูล dsMasterInfo = ชุดข้อมูลใหม่ ();
ฐานข้อมูล db = DatabaseFactory.CreateDatabase ("ConnectionString");
DbCommand dbCommand = db.GetStoredProcCommand ("uspGetMasterName");

ผู้ใช้นี้ไม่ได้ฟอร์แมตรหัสเป็นรหัส!

นั่นคือพวกเขาไม่ได้เยื้อง 4 ช่องว่างต่อมาร์กดาวน์หรือใช้ปุ่มรหัส (หรือแป้นพิมพ์ลัดctrl+ k) ที่ทำเพื่อพวกเขา

ดังนั้นระบบของเรายอมรับการแก้ไขจำนวนมากที่ผู้คนต้องเข้าไปและจัดรูปแบบโค้ดด้วยตนเองสำหรับผู้ที่ไม่สามารถเข้าใจได้ สิ่งนี้นำไปสู่การท้องมาก เราได้ปรับปรุงเครื่องมือแก้ไขหลายครั้ง แต่ขาดการขับรถไปที่บ้านของผู้ใช้และกดปุ่มที่ถูกต้องบนแป้นพิมพ์สำหรับพวกเขาพวกเรากำลังสูญเสียเพื่อดูว่าจะทำอย่างไรต่อไป

นั่นเป็นเหตุผลที่เรากำลังพิจารณาคำเตือนสไตล์ Google GMail:

คุณหมายถึงรหัสไปรษณีย์หรือไม่

คุณเขียนสิ่งที่เราคิดว่าดูเหมือนรหัส แต่คุณไม่ได้จัดรูปแบบเป็นรหัสโดยการเยื้องช่องว่าง 4 โดยใช้ปุ่มรหัสแถบเครื่องมือหรือคำสั่งctrl+ kการจัดรูปแบบรหัส

แต่นำเสนอคำเตือนนี้เราต้องตรวจสอบสถานะของสิ่งที่เราคิดว่าเป็นรหัสที่ยังไม่ฟอร์แมตในคำถาม อะไรคือวิธีที่ง่ายและกึ่งเชื่อถือได้ในการทำเช่นนี้?

  • ต่อMarkdownรหัสจะถูกเยื้องโดยเว้นวรรค 4 ครั้งหรือภายใน backticks ดังนั้นสิ่งใดก็ตามที่จัดรูปแบบอย่างถูกต้องสามารถทิ้งจากเช็คได้ทันที
  • นี่เป็นเพียงคำเตือนและจะใช้กับผู้ใช้ที่มีชื่อเสียงน้อยเท่านั้นที่ถามคำถามแรกของพวกเขา (หรือให้คำตอบแรก) ดังนั้นผลบวกที่ผิดพลาดบางอย่างก็โอเคตราบใดที่พวกเขามีประมาณ 5% หรือน้อยกว่า
  • คำถามเกี่ยวกับ Stack Overflow อาจเป็นภาษาใดก็ได้แม้ว่าเราจะสามารถ จำกัด การตรวจสอบของเราเป็นจริงพูดภาษา "สิบหลัก" ตามหน้าแท็กที่จะเป็น C #, Java, PHP, JavaScript, Objective-C, C, C ++, Python, Ruby
  • ใช้การถ่ายโอนข้อมูลแบบกองซ้อนของครีเอทีฟคอมมอนส์เพื่อตรวจสอบโซลูชันที่เป็นไปได้ของคุณ (หรือเลือกคำถามสองสามข้อในแท็ก 10 อันดับแรกของ Stack Overflow) และดูวิธีการทำงาน
  • Pseudocode นั้นใช้ได้ แต่เราใช้ c # ถ้าคุณต้องการเป็นมิตรเพิ่ม
  • ง่ายกว่าดีกว่า (ตราบใดที่มันใช้งานได้) จูบ! หากวิธีการแก้ปัญหาของคุณต้องการให้เราพยายามรวบรวมโพสต์ในคอมไพเลอร์ 10 ตัวที่แตกต่างกันหรือกองทัพของผู้คนเพื่อฝึกฝนกลไกการอนุมานแบบเบย์ด้วยตนเองนั่นคือ ... ไม่ใช่สิ่งที่เราคิดไว้ในใจ

34
ฉันคิดว่าถ้าคุณแสดงคำเตือนเสมอหากไม่มีการเยื้องอยู่คุณจะได้รับข้อผิดพลาดต่ำกว่า 5% นี่เป็นเพียงเรื่องตลก
Konrad Rudolph

59
@Konrad วิธีนี้จะใช้งานได้ดียิ่งขึ้นถ้าข้อความเป็นเช่น: 'อาจเป็นเพราะคำถามของคุณหายไปตัวอย่างรหัสที่จะช่วยให้ผู้อื่นเข้าใจหรือคุณลืมที่จะเยื้องพวกเขาอย่างถูกต้อง' ควรครอบคลุม 99% ของทุกกรณี
thorsten müller

3
นี่เป็นคำถามที่ดี แต่ฉันรู้สึกว่ามันไม่มีคำตอบ คุณแสดงให้ฉันเห็นระบบที่งี่เง่าและฉันจะแสดงให้คุณเห็นถึงความโง่ที่ดีขึ้น ถึงแม้ว่าปัญหานี้อาจได้รับการแก้ไขด้วย CODE แต่ก็ไม่ควรใช่หรือไม่ มันเป็นคนโง่เขลาที่ไม่สามารถถามคำถามที่ถูกต้องที่ทำลายเว็บไซต์นี้สำหรับคนอย่างฉันที่ถามคำถามที่เหมาะสมและให้คำตอบที่เหมาะสมกับ IMHO
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. ข้อความ camelCase ในโพสต์
  9. วงเล็บซ้อนกันวงเล็บและ / หรือวงเล็บเหลี่ยม

เราสามารถติดตามจำนวนครั้งที่ปรากฎแต่ละครั้งและสิ่งเหล่านี้สามารถใช้เป็นคุณสมบัติในอัลกอริทึมการเรียนรู้ของเครื่องอย่างเช่นperceptronซึ่งเป็นวิธีที่ SpamAssassin ทำ


25
เคล็ดลับ: 3 มีน้ำหนักเบามากเนื่องจากจุดระหว่างคำอาจเป็นผลมาจากการพิมพ์ผิด 5 ไม่ควรตรงกับ URL สำหรับ 6 แอมเปอร์แซนด์ยังใช้บ่อยนอกบริบทรหัสซึ่งคุณอาจน้ำหนักตัวอักษรน้อยลง ตรวจสอบอีกครั้งว่าปากกาเน้นข้อความทำงานได้หรือไม่เพราะสามารถเน้นข้อความที่ไม่ใช่รหัสได้บางครั้งฉันเห็นใน Notepad ++
Tamara Wijsman

8
อีกครั้ง ในฐานะที่เป็นตัวพิมพ์ - จะไม่มีอันตรายใด ๆ ในการตั้งค่าสถานะว่าเป็นผู้เขียนควรแก้ไขต่อไป
user151019

4
นอกจากนี้คำหลักเฉพาะที่มีหลายภาษาสามารถช่วยได้ในขณะที่อื่น ๆ หากวน
ซ้ำหยุดพัก

6
เพิ่ม "การใช้ $ ก่อนคำที่ไม่ใช่ตัวเลข: $ var เป็นเรื่องปกติใน Perl และ PHP (และ Ruby?)"
PhiLho

4
SELECT DISTINCT name FROM people WHERE id IS NOT NULLคุณจะไม่ได้ตรวจสอบของฉัน
เบอนัวต์

54

ฉันอยากรู้อยากเห็นว่าการวัดโดยเฉลี่ยของการเขียนภาษาอังกฤษในด้านใดด้านหนึ่งและรหัสในอีกด้านหนึ่ง

  • ความยาวของย่อหน้า
  • ความยาวของเส้น
  • ขนาดของคำ
  • ตัวอักษรที่ใช้
  • อัตราส่วนระหว่างตัวอักษรตัวเลขและสัญลักษณ์อื่น ๆ
  • จำนวนสัญลักษณ์ต่อคำ
  • เป็นต้น

บางทีนั่นอาจแยกแยะระหว่างรหัสและที่เหลือเพียงอย่างเดียว อย่างน้อยฉันก็เชื่อว่ารหัสโดยไม่คำนึงถึงภาษาจะแสดงตัวชี้วัดที่แตกต่างกันอย่างเห็นได้ชัดในหลายกรณี

ข่าวดีคือคุณมีข้อมูลมากมายที่จะสร้างสถิติของคุณ


ตกลงฉันกลับมาพร้อมข้อมูลบางอย่างเพื่อสำรองสมมติฐานของฉัน :-)

ผมได้ทดสอบที่รวดเร็วและสกปรกในโพสต์ของคุณเองและในการโพสต์แรกที่ผมพบใน StackOverflowwcด้วยเครื่องมือที่ทันสมัยสวย:

นี่คือสิ่งที่ฉันมีหลังจากทำงานwcในส่วนข้อความและในส่วนรหัสของทั้งสองตัวอย่าง:

ก่อนอื่นให้ดูที่ส่วนภาษาอังกฤษ :

  • ส่วนภาษาอังกฤษของโพสต์ของคุณ (2635 ตัวอักษร, 468 คำ, 32 บรรทัด)
    • 5ตัวอักษร / คำ, 82ตัวอักษร / บรรทัด, 14คำ / บรรทัด
  • ส่วนภาษาอังกฤษของโพสต์อื่น ๆ (1,499 ตัวอักษร, 237 คำ, 12 บรรทัด)
    • 6ตัวอักษร / คำ, 124ตัวอักษร / บรรทัด, 19คำ / บรรทัด

คุณไม่คิดเหมือนกันเลย

ตอนนี้ให้ดูที่ส่วนรหัส !

  • ส่วนรหัสของโพสต์ของคุณ (174 ตัวอักษร, 13 คำ, 3 บรรทัด)
    • 13ตัวอักษร / คำ, 58ตัวอักษร / บรรทัด, 4คำ / บรรทัด
  • ส่วนรหัสของโพสต์อื่น ๆ (4181 ตัวอักษร 287 คำ, 151 บรรทัด)
    • 14ตัวอักษร / คำ27ตัวอักษร / บรรทัด2คำ / บรรทัด

ดูว่าการวัดเหล่านั้นไม่แตกต่างกันอย่างไรและที่สำคัญกว่านั้นการวัดนั้นแตกต่างจากเมตริกภาษาอังกฤษอย่างไร และนี่เป็นเพียงการใช้เครื่องมือที่มี จำกัด ตอนนี้ฉันมั่นใจว่าคุณจะได้รับสิ่งที่ถูกต้องจริง ๆ โดยการวัดตัวชี้วัดเพิ่มเติม (ฉันกำลังคิดถึงสถิติตัวอักษรโดยเฉพาะ)

ฉันสามารถคุกกี้ฮาเซล?


6
ความยาวบรรทัดโดยเฉพาะอย่างยิ่งถ้าคุณยกเว้นสัญลักษณ์แสดงหัวข้อย่อยและค้นหาบรรทัดที่รวมกลุ่มที่น้อยกว่าความยาวเฉพาะที่มีเครื่องหมายวรรคตอนที่เฉพาะเจาะจงน่าจะเป็นการวัดที่ดี
Jon Hopkins

สิ่งนี้จะใช้งานได้กับบล็อกของโค้ด แต่ดูเหมือนจะยากกว่ามากในการค้นหาอินไลน์ cdde ไม่แน่ใจว่ามีความสำคัญมากเพียงใด - ปัญหาที่ใหญ่กว่านั้นคือบล็อกโค้ดที่ไม่มีการฟอร์แมตขนาดใหญ่
cHao

3
ไม่มีคุกกี้ ลิงก์ในโพสต์ของคุณคือ 404
james.garriss

@ james.garriss: อินเทอร์เน็ตขโมยโถคุกกี้ของฉัน :( ขอบคุณสำหรับการแจ้งเตือนแม้ว่า
Julien Guertault

23

โดยทั่วไปโซ่มาร์คอฟจะใช้ในการสร้างข้อความ แต่พวกเขายังสามารถใช้ในการทำนายความคล้ายคลึงกันของข้อความ (ต่อCE CE แชนนอน 1950 ) กับรูปแบบการฝึกอบรม ฉันแนะนำโซ่มาร์คอฟหลายลูก

สำหรับแต่ละภาษาที่แพร่หลายฝึกอบรมลูกโซ่มาร์คอฟกับตัวอย่างโค้ดขนาดใหญ่ในภาษา จากนั้นสำหรับโพสต์ Stack Overflow ที่คุณต้องการตรวจจับโค้ดให้ทำดังต่อไปนี้สำหรับแต่ละกลุ่ม:

  • วนรอบบรรทัดในโพสต์
    • ประกาศตัวแปรสองตัว: ACTUAL = 1.0 และ HIGHEST = 1.0
    • วนซ้ำอักขระแต่ละตัวในบรรทัด
      • สำหรับแต่ละตัวอักษรค้นหาความน่าจะเป็นในลูกโซ่มาร์คอฟที่ตัวละครปัจจุบันเป็นตัวถัดจากตัวอักษร N ก่อนหน้า ตั้งจริง = จริง * PROB 1 หากอักขระปัจจุบันไม่มีอยู่ในห่วงโซ่ให้ใช้ค่าเล็ก ๆ สำหรับ PROB 1เช่น 0.000001
      • ตอนนี้ค้นหาตัวละครที่มีโอกาสมากที่สุด (เช่นความน่าจะเป็นสูงสุด) เพื่อติดตามตัวละคร 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

สุดท้ายคุณจะต้องเลือกเกณฑ์เพื่อกำหนดว่าจะมีรหัสในโพสต์เมื่อใด นี่อาจเป็นตัวเลขที่เลือกโดยการสังเกตที่ให้ประสิทธิภาพสูง นอกจากนี้ยังสามารถคำนึงถึงจำนวนบรรทัดด้วยคะแนนสูง

การอบรม

ในการฝึกอบรมจัดหาตัวอย่างโค้ดขนาดใหญ่ที่เป็นตัวแทนในภาษา เขียนโปรแกรมเพื่อวนลูปข้อความรหัสและเชื่อมโยงแต่ละ N-Gram ในไฟล์ (ช่วงสำหรับ N ควรกำหนดพารามิเตอร์) กับความถี่ทางสถิติของตัวละครที่ตามมา สิ่งนี้จะให้สถานะของตัวอักษรที่เป็นไปได้หลายสถานะซึ่งตามหลังบิกแกรมแต่ละอันเกี่ยวข้องกับความน่าจะเป็น ตัวอย่างเช่น bigram "()" อาจมีความน่าจะเป็นของตัวละครดังต่อไปนี้:

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

สิ่งแรกที่ควรอ่านเช่น "ความน่าจะเป็นที่เครื่องหมายอัฒภาคตามหลังเครื่องหมายวงเล็บว่างคือ 0.5"

สำหรับการฝึกอบรมฉันแนะนำขนาด N-กรัมสองถึงห้า ย้อนกลับไปเมื่อฉันทำการวิจัยเกี่ยวกับเรื่องนี้เราพบว่าขนาด N- กรัมสองถึงห้าทำงานได้ดีสำหรับภาษาอังกฤษ เนื่องจากซอร์สโค้ดส่วนใหญ่เป็นภาษาอังกฤษฉันขอแนะนำให้เริ่มต้นด้วยช่วงนั้นแล้วปรับเพื่อค้นหาค่าพารามิเตอร์ที่ดีที่สุดในขณะที่คุณค้นหาสิ่งที่ใช้ได้

ข้อแม้: แบบจำลองจะได้รับผลกระทบจากตัวระบุชื่อวิธีการช่องว่างและอื่น ๆ อย่างไรก็ตามคุณสามารถปรับการฝึกอบรมเพื่อละเว้นคุณลักษณะบางอย่างของตัวอย่างการฝึกอบรม ตัวอย่างเช่นคุณสามารถยุบช่องว่างที่ไม่จำเป็นทั้งหมดได้ การมีอยู่ของช่องว่างในอินพุต (โพสต์สแต็คโอเวอร์โฟลว์) สามารถละเว้นได้เช่นกัน คุณสามารถเพิกเฉยกรณีตัวอักษรซึ่งจะมีความยืดหยุ่นมากกว่าเมื่อต้องเผชิญกับการตั้งชื่อตัวระบุที่แตกต่างกัน

ในระหว่างการวิจัยของฉันเราพบว่าวิธีการของเราทำงานได้ดีสำหรับภาษาสเปนและภาษาอังกฤษ ฉันไม่เห็นว่าทำไมสิ่งนี้ถึงทำงานได้ไม่ดีสำหรับซอร์สโค้ด ซอร์สโค้ดมีโครงสร้างและคาดการณ์ได้ดีกว่าภาษามนุษย์


2
ปัญหาเดียวที่ฉันคาดว่าน่าจะเป็นที่จะได้รับอย่างมากมายขนาดเล็กกว่าในตัวอย่างของเล่นของคุณ เมื่อพิจารณาความไม่แน่นอนเชิงตัวเลขซึ่งหมายความว่าในไม่ช้าความน่าจะเป็นทั้งหมดคือ 0 การใช้อัตราต่อรองในการแก้ปัญหาแบบนี้ นอกจากนี้ฉันจะใช้โทเค็นที่ใหญ่กว่า (เช่นไม่ใช่ตัวอักษร แต่ใช้คำ / เครื่องหมายวรรคตอน)
Konrad Rudolph

2
@ Konrad: ความคิดที่นี่ไม่ได้เป็นการทดสอบความน่าจะเป็นที่แน่นอน: เพื่อทดสอบความน่าจะเป็นแบบสัมพัทธ์ สำหรับแต่ละบรรทัดคือข้อความของบรรทัดนั้นมีแนวโน้มที่จะถูกสร้างขึ้นโดยโมเดลภาษาอังกฤษหรือโดยโมเดลภาษาโค้ด
Ken Bloom

5
คุณสามารถฝึกอบรมโมเดลนี้กับโพสต์ SO ที่มีอยู่ (โดยเฉพาะอย่างยิ่งเพราะคุณอาจจำเป็นต้องมีบัญชีสำหรับไวยากรณ์ Markdown) หากคุณคิดว่าโพสต์ส่วนใหญ่มีรูปแบบที่ถูกต้อง (หรือคุณเลือกโพสต์เป็นจำนวนมากตามลำดับจำนวนนับหมื่นเพื่อลบโพสต์ที่ไม่ได้จัดรูปแบบถูกต้อง) จากนั้นคุณถือว่าสิ่งที่ไม่ได้จัดรูปแบบโค้ดเป็นข้อความภาษาอังกฤษ และสิ่งที่มีการจัดรูปแบบรหัสคือรหัสคุณสามารถฝึกได้จากคำตอบ SO ที่แท้จริง
Ken Bloom

1
กวดวิชาเกี่ยวกับวิธีการทำเช่นนี้ (ใช้ LingPipe ในชวา) สามารถใช้ได้จากเว็บไซต์ของ LingPipe ในตอนท้ายของบทช่วยสอนมีเอกสารจำนวนหนึ่งเกี่ยวกับเทคนิคในการแก้ไขปัญหานี้ ฉันแนะนำให้อ่าน
Ken Bloom

1
เป็นที่น่าสนใจที่จะเห็นว่าวิธีการแก้ปัญหาที่ทันสมัยนั้นมีเพียงคะแนนโหวตที่ต่ำมากและอัตราที่น้อยกว่าโซลูชั่น Ad-hoc เหล่านั้นซึ่งเป็นที่ยอมรับอาจจะดีพอ แต่ต้องพึ่งพาเคสพิเศษเป็นอย่างมาก มีแนวโน้มที่จะ overfitting
Konrad Rudolph

13

ฉันขอแนะนำวิธีที่แตกต่างอย่างสิ้นเชิงได้ไหม? ในดังนั้นมนุษย์เพียงคนเดียวที่ได้รับอนุญาตภาษาคือภาษาอังกฤษดังนั้นอะไรที่ไม่ใช่ภาษาอังกฤษมี 99.9% มีโอกาสที่จะเป็นข้อมูลโค้ด

ดังนั้นวิธีการแก้ปัญหาของฉันคือ: ใช้หนึ่งในตัวตรวจสอบภาษาอังกฤษที่มีอยู่มากมาย (ตรวจสอบให้แน่ใจว่าพวกเขาส่งสัญญาณ - ด้านข้างคำที่สะกดผิด - ข้อผิดพลาดทางไวยากรณ์เช่นจุดสองจุดหรือสัญลักษณ์ที่ไม่ใช่ภาษาเช่น#หรือ~) จากนั้นบรรทัด / ย่อหน้าใด ๆ ที่ส่งข้อผิดพลาดและคำเตือนจำนวนมากควรเปิดใช้งาน "รหัสนี้หรือไม่" คำถาม.

วิธีการนี้ยังสามารถปรับใช้สำหรับไซต์ StackExchange เหล่านั้นโดยใช้ภาษาอื่นที่ไม่ใช่ภาษาอังกฤษแน่นอน

แค่ 2 my ของฉัน ...


16
ปัญหาคือมีคำถามมากมายที่เข้ามาไม่ใช่ภาษาอังกฤษ (แม้ว่าจะคล้ายกัน)
เบรนแดน Long

3
@Brendan - เพิ่มความได้เปรียบของข้อเสนอนี้แล้ว: ขีดเส้นใต้ (หรือเน้น) ข้อผิดพลาดในส่วนที่อาจจะเป็นภาษาอังกฤษของโพสต์และช่วยให้นักเขียนเขียน ... เป็นภาษาอังกฤษ! ;)
mac

1
ฉันเป็นชาวดัตช์และทุกอย่างที่ฉันเขียนโค้ดเป็นภาษาอังกฤษโดยความเห็นไม่ใช่ (ขึ้นอยู่กับโครงการ) ดังนั้นไม่ใช่ภาษาอังกฤษจะต้องเป็นรหัสจะไม่พอเพียง หรือคุณหมายความว่าภาษาอังกฤษที่แตกต้องเป็นรหัส
Ivo Limmen

@Ivo - ความคิดเห็นของฉันได้รับการกล่าวถึงเรื่องภาษาอังกฤษที่ล้อเล่น! ;) อย่างไรก็ตามฉันจะบอกว่าด้วยความคิดเห็นข้อเสนอของฉันในภาษาอื่นจะทำงานได้ดี ... OTOH บล็อกความคิดเห็นเป็นภาษาอังกฤษจะไม่เรียก "รหัสนี้หรือไม่" คำถาม แต่ที่ดีเพียงเพราะรหัสที่แสดงความคิดเห็นได้รับการเขียนแล้วจะได้เรียกมัน ...
แม็ค

11

ฉันอาจจะได้รับการลงคะแนนเล็กน้อยสำหรับเรื่องนี้ แต่ฉันคิดว่าคุณกำลังเข้าใกล้นี้จากมุมที่ผิด

บรรทัดนี้ให้ฉัน:

คนต้องเข้าไปและจัดรูปแบบรหัสด้วยตนเองสำหรับคนที่ไม่สามารถคิดออก

IMO นั้นจุดยืนคือความหยิ่ง ฉันพบสิ่งนี้มากในการออกแบบซอฟต์แวร์ที่โปรแกรมเมอร์และนักออกแบบสร้างความรำคาญให้กับผู้ใช้ที่ไม่สามารถหาวิธีใช้ซอฟต์แวร์ได้อย่างถูกต้องเมื่อปัญหาไม่ใช่ผู้ใช้ แต่เป็นตัวซอฟต์แวร์เองหรือ UI อย่างน้อย

สาเหตุที่แท้จริงของปัญหานี้ไม่ใช่ผู้ใช้ แต่ความจริงที่ว่าพวกเขาไม่สามารถทำได้

แล้วการเปลี่ยนแปลง UI จะทำให้สิ่งนี้ชัดเจนยิ่งขึ้นได้อย่างไร แน่นอนนี่จะเป็น:

  1. ชัดเจนมากขึ้นกับผู้ใช้ใหม่ว่าสิ่งที่พวกเขาต้องทำ
  2. ง่ายกว่าสำหรับคุณที่จะสร้างแทนที่จะเขียนอัลกอริทึมที่ซับซ้อนเพื่อตรวจสอบลอจิกโค้ดของภาษาจำนวนมาก

ตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่


26
อันที่จริง IMO นี้บังคับใช้คำถามที่ไม่ดีเช่น "ฉันมีปัญหาโปรดช่วยฉันด้วยรหัสด้านล่าง" - รหัสค่อนข้างจะต้องแยกออกจากคำถาม คำถามที่ดีที่สุดจะเป็นเช่นนี้ "ฉันต้องการบรรลุผลและเขียนโค้ดสองบรรทัดนี้ แต่ผลกระทบคือสิ่งต่อไปนี้คือปัญหาอะไร" - มีโค้ดน้อยมากแทรกอย่างหนักกับภาษาธรรมดา
sharptooth

4
สังเกตรากของคุณถูกต้อง แต่การวินิจฉัยของคุณยังคงไม่ถูกต้อง: ในความเป็นจริง, เจฟฟ์จะพยายามที่จะปรับปรุงส่วนติดต่อผู้ใช้ผ่านทางวิธีการนี้ นอกจากนี้ UI ปัจจุบันผ่านไปหลายรอบแล้วและในขณะที่ฉันไม่สงสัยเลยว่ามันจะดีขึ้น (อย่างมาก) ฉันสงสัยว่าสิ่งนี้จะช่วยต่อต้านไอ้ขี้เกียจที่ขี้เกียจ วิธีแก้ปัญหาที่เสนอของคุณจะไม่ @sharptooth มีข้อมูลนี้
Konrad Rudolph

2
ฉันจะ +1 ด้วยการคิดนอกกรอบ แต่ฉันไม่เห็นด้วยกับคำแนะนำเฉพาะเนื่องจากการโพสต์ "รหัสสนับสนุน" บังคับให้มีการไหลของคำถามที่อาจผิดธรรมชาติ ฉันไม่เคยทิ้งรหัสไว้ที่ด้านล่างของคำถาม ฉันโพสต์ข้อความเกริ่นนำเกือบทุกครั้งแล้วจึงเป็นคำถามจริง หากคุณยอมรับหลักฐานนี้ว่าจำเป็นต้องใช้รหัสแบบอินไลน์ดังนั้นจึงจำเป็นต้องมีการจัดรูปแบบบางประเภท - การจัดรูปแบบที่ผู้ใช้ต้องป้อนหรือแนะนำโดยระบบ และนั่นคือสิ่งที่แน่นอนที่เจฟฟ์ถามเกี่ยวกับการทำ
Nicole

1
@ Konrad: นอกเหนือจากความคิดเห็นข้างต้นของฉันและเพื่อตอบสนองต่อคุณฉันไม่เชื่อว่า Jeff กำลังปรับปรุง UI โดยใช้เส้นทางนี้ แต่เพียงรักษาอาการของปัญหาพื้นฐาน หาก UI ได้รับการปรับปรุงเพื่อไม่ให้เกิดข้อผิดพลาดดังนั้นการแจ้งเตือนผู้ใช้ก็ไม่จำเป็น ฉันไม่มีภาพลวงตาว่าตัวอย่างของฉันเป็นวิธีแก้ปัญหาขั้นสุดท้าย แต่ความคิดบางอย่างต้องการคำถาม "เราจะนำเสนอสิ่งนี้ในวิธีที่ดีที่สุดเท่าที่จะเป็นไปได้หรือไม่"
matt_asbury

1
ประโยคง่าย ๆโปรดทำเครื่องหมายรหัสโดยใช้{}ปุ่มรอบ ๆ ช่องข้อความอาจจะเพียงพอ
Paŭlo Ebermann

11

รหัสหลอกจะเป็นสิ่งที่ท้าทายอย่างแท้จริงเพราะภาษาการเขียนโปรแกรมทั้งหมดขึ้นอยู่กับอักขระพิเศษเช่น '[]', ';', '()' ฯลฯ เพียงนับการเกิดขึ้นของอักขระพิเศษเหล่านี้ เช่นเดียวกับที่คุณตรวจพบไฟล์ไบนารี (ตัวอย่างมากกว่า 5% มีค่าไบต์ 0)


ฉันจะปรับปรุงสิ่งนี้ให้มากที่สุดเท่าที่มีกลุ่มของตัวอักษรพิเศษเหล่านี้เช่น [] (); {} = แต่ละบรรทัดที่มีมากกว่า 2-3 กลุ่มจะมีบรรทัดของรหัส
Honza

... และมองหาสตริงทั่วไปในภาษาที่พบบ่อยที่สุดเช่น "= Gatord ();" สำหรับภาษาวงเล็บปีกกาส่วนใหญ่ไวยากรณ์คล้าย XML เช่น "<something>" และ "<ab: cde>" และสตริงทั่วไปอื่น ๆ ในภาษาอื่น ฉันเชื่อว่าการเรียงลำดับของตารางการค้นหาของไวยากรณ์ทั่วไปจะเป็นทางออกที่ดีเนื่องจากคุณสามารถขยายได้เมื่อคุณค้นหาภาษาใหม่ที่จะนำไปใช้
Arve Systad

คุณอาจจะวางรหัสเทียม บางคนชอบเขียนมันเป็นภาษา C แต่คนอื่นจะใช้ภาษาอังกฤษธรรมดากับบางสิ่งที่ดูใกล้เคียงกับ VB6
James P.

4

ฉันคิดว่าคุณอาจต้องกำหนดเป้าหมายนี้กับภาษาเฉพาะเท่านั้นโดยทั่วไปปัญหานี้อาจเป็นเรื่องยากเนื่องจากคุณสามารถรับภาษาที่ค่อนข้างคล้ายคลึงกับภาษาอังกฤษ (เช่นinform7 ) แต่โชคดีที่สิ่งที่ใช้มากที่สุดนั้นสามารถครอบคลุมได้ง่ายพอสมควร

การตัดครั้งแรกของฉันคือค้นหาลำดับ "; \ n" ซึ่งจะช่วยให้คุณได้รับการจับคู่ที่ดีสำหรับ C, C ++, Java, C # และภาษาอื่น ๆ ที่ใช้ไวยากรณ์ที่คล้ายกันและง่ายมาก มันยังมีโอกาสน้อยที่จะใช้ในภาษาอังกฤษกว่า; โดยไม่ต้องขึ้นบรรทัดใหม่


รวมทั้งเครื่องหมายปีกกาอาจมีมากมาย p
Marc Gravell

1
อย่างที่เจฟฟ์บอกไว้ในโพสต์เขาอาจตั้งเป้าหมายเฉพาะภาษาหลักเท่านั้น และในกรณีใด ๆ ฉันสงสัยว่าผู้ใช้ใหม่ (สำหรับผู้ที่มีฟังก์ชั่นการใช้งานนี้) มีแนวโน้มที่จะโพสต์ C # หรือ Javascript มากกว่า, พูด, INTERCAL ;-)
Ben

ใช่ แต่จะไม่สามารถใช้งานได้กับภาษาการเขียนโปรแกรม BRAINFUCK หรือ BLANK ;-)
Ivo Limmen

4

มีคนพูดถึงการดูที่แท็กจากนั้นมองหาไวยากรณ์สำหรับสิ่งนั้น แต่นั่นถูกทำให้แย่ลงเพราะสิ่งนี้มีวัตถุประสงค์เพื่อผู้ใช้ใหม่

ทางออกที่ดีกว่าที่เป็นไปได้คือการค้นหาชื่อภาษาในเนื้อหาของคำถามจากนั้นใช้กลยุทธ์เดียวกัน หากฉันพูดถึง "Javascript", "Java" หรือ "C #" โอกาสที่จะเป็นไปได้คือคำถามที่เกี่ยวกับและรหัสในคำถามนั้นน่าจะเป็นภาษานั้น


โดยเฉพาะอย่างยิ่งถ้าชื่อเรื่องนั้นเป็นอะไร "vb c # .net dot net ช่วยฉันด้วย !!!"
NickAldwin

1

อันดับแรกเรียกใช้ผ่านการตรวจสอบการสะกดคำจะพบคำภาษาอังกฤษที่เหมาะสมน้อยมาก แต่ควรมีคำจำนวนมากที่เครื่องตรวจการสะกดคำจะแนะนำให้แยก

จากนั้นมีเครื่องหมายวรรคตอน / อักขระพิเศษที่ไม่ปกติสำหรับภาษาอังกฤษทั่วไปโดยทั่วไปสำหรับรหัส:

  • something(); ไม่สามารถเป็นภาษาอังกฤษธรรมดาได้
  • $somethingที่somethingไม่ใช่ตัวเลขทั้งหมด
  • -> ระหว่างคำที่ไม่มีช่องว่าง
  • . ระหว่างคำที่ไม่มีช่องว่าง

แน่นอนว่ามันจะทำงานได้ดีคุณอาจต้องการให้ตัวจําแนกเบส์สร้างขึ้นจากคุณลักษณะเหล่านี้


1
การตรวจจับบรรทัดที่ไม่มีการเยื้องที่มี (); จะเป็นเหตุผลที่ดีในการแนะนำข้อความ

เครื่องมือตรวจสอบการสะกดใดจะไม่สำลักก่อนที่รหัสจะถูกวาง?
Tim Post

ด้วยข้อความบางส่วนที่เขียนโดยนักเขียนที่ไม่ใช่เจ้าของภาษาชาวอังกฤษผู้ตรวจการสะกดคำจะสำลักทุกคำ ...
PhiLho

@Ph: คำถาม / คำตอบเหล่านี้ยังไม่ได้รับการยอมรับดังนั้น
vartec

1

มีหลายภาษาที่ใช้ไวยากรณ์ร่วมกัน ภาษาส่วนใหญ่ได้รับอิทธิพลจากบางภาษาดังนั้นภาษา [AMPL, AWK, csh, C ++, C--, C #, วัตถุประสงค์ -C, BitC, D, Go, Java, JavaScript, Limbo, LPC, Perl, PHP, Pike, การประมวลผล [ทั้งหมดได้รับอิทธิพลจาก C ดังนั้นหากคุณตรวจพบ C คุณอาจตรวจพบภาษาเหล่านี้ทั้งหมด ดังนั้นคุณต้องเขียนรูปแบบง่าย ๆ เพื่อตรวจจับชุดภาษานี้เท่านั้น

ฉันจะแยกข้อความออกเป็นบล็อกด้วยเนื่องจากโค้ดส่วนใหญ่จะแบ่งเป็นสองบรรทัดใหม่หรือคล้ายกันจากบล็อกข้อความอื่น ๆ ในโพสต์

สิ่งนี้สามารถทำได้ง่ายด้วย javascript (ตัวอย่างที่ไม่สมบูรณ์สำหรับครอบครัวค):

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 ++) {} นั่นหมายความว่าอย่างไร

นั่นคือรหัสและภาษาอังกฤษและควรถูกทำเครื่องหมายเช่นเดียวกับ back-ticks:

ถ้าฉันบอกfor (i=0; i>100; i++) {}ว่านั่นหมายความว่าอย่างไร


0

ฉันคิดว่าคุณควรแยกแยะความแตกต่างระหว่างโค้ดที่จัดรูปแบบ (อย่างเพียงพอ) ที่จำเป็นต้องได้รับการกำหนดให้เป็นเช่นนี้และ (เกินไป) โค้ดที่จัดรูปแบบไม่ดีซึ่งต้องการการจัดรูปแบบด้วยตนเองอยู่ดี

รหัสที่จัดรูปแบบมี breaklines และเยื้อง นั่นคือ: ถ้าบรรทัดนำหน้าด้วย breakline เดียวคุณมีผู้สมัครที่ดี ถ้ามันมี whitespaces ชั้นนำด้านบนของที่คุณมีผู้สมัครที่ดีมาก

ข้อความปกติใช้จุดพักสองหรือสองช่องว่างและเส้นแบ่งสำหรับการจัดรูปแบบดังนั้นจึงมีเกณฑ์ที่ชัดเจนสำหรับความแตกต่าง

ในรหัส LISP คุณจะไม่พบอัฒภาคในรหัส Ruby คุณอาจไม่พบวงเล็บในรหัสหลอกคุณอาจไม่พบอะไรเลย แต่ในภาษาใด ๆ ที่ไม่ใช่ความลับคุณจะพบโค้ดที่เหมาะสมที่จะจัดรูปแบบด้วยตัวแบ่งและการเยื้อง ไม่มีอะไรที่เป็นสากลอย่างนั้น เพราะในรหัสท้ายคือเขียนเพื่อให้มนุษย์อ่านได้

ดังนั้นแรกค้นหาศักยภาพสายรหัส นอกจากนี้บรรทัดของรหัสมักจะมาในกลุ่ม หากคุณมีหนึ่งมีโอกาสที่ดีที่ด้านบนหรือด้านล่างเป็นบรรทัดของรหัสเช่นกัน

เมื่อคุณแยกบรรทัดของรหัสที่เป็นไปได้แล้วคุณสามารถตรวจสอบกับเกณฑ์เชิงปริมาณและเลือกเกณฑ์ :

  • ความถี่ของอักขระที่ไม่ใช่คำ
  • ความถี่ของตัวระบุ: คำที่สั้นมากหรือคำที่ยาวมากด้วย CamelCase หรือ under_score style
  • การทำซ้ำคำที่ผิดปกติ

นอกจากนี้ตอนนี้มีโปรแกรมเมอร์และ cs ขอบเขตของ stackoverflow แคบลงอย่างชัดเจน หนึ่งอาจพิจารณา denoting แท็กภาษาทั้งหมดเป็นภาษา และเมื่อโพสต์คุณจะถูกขอให้เลือกอย่างน้อยหนึ่งแท็กภาษาเลือกlanguage-agnosticแท็กหรือละเว้นอย่างชัดเจน

ในกรณีแรกคุณรู้ว่าภาษาใดที่ควรมองหาในกรณีที่สองคุณอาจต้องการค้นหารหัสหลอกและในกรณีสุดท้ายอาจไม่มีรหัสใด ๆ เพราะเป็นคำถามที่เกี่ยวข้องกับเทคโนโลยีบางอย่างหรือ กรอบหรือเช่น


0

คุณสามารถสร้างเครื่องมือแยกวิเคราะห์สำหรับแต่ละภาษาที่คุณต้องการตรวจหา (คำจำกัดความภาษาสำหรับ ANTLR มักจะหาง่าย) จากนั้นเรียกใช้แต่ละบรรทัดของคำถามผ่านแต่ละเครื่องมือแยกวิเคราะห์ หากมีการแยกบรรทัดใด ๆ อย่างถูกต้องคุณอาจมีรหัส

ปัญหาของเรื่องนี้คือประโยคภาษาอังกฤษ (ภาษาธรรมชาติ) บางประโยคอาจแยกวิเคราะห์เป็นรหัสดังนั้นคุณอาจต้องการรวมแนวคิดอื่นด้วย ตัวแยกวิเคราะห์ภาษาเดียวกัน

ปัญหาที่อาจเกิดขึ้นอื่น ๆ คือสิ่งนี้อาจจะไม่รับรหัสเทียม แต่อาจเป็นไปได้


บ่อยครั้งที่ผู้คนมีข้อผิดพลาดทางไวยากรณ์ในรหัสของพวกเขา (และกำลังถามเกี่ยวกับเรื่องนี้)
Paŭlo Ebermann

0

สิ่งที่อาจเป็นหลักฐานในอนาคตและต้องการการปรับคู่มือน้อยที่สุดในระยะยาวเนื่องจากภาษาอื่น ๆ (ซึ่งดูแตกต่างจากภาษาโปรแกรมที่ใช้มากที่สุดตอนนี้) เป็นที่นิยมมากขึ้นและภาษาที่ใช้ในปัจจุบันกลายเป็นที่นิยมน้อยลง คล้ายกับที่Google แปลภาษาทำงาน (ดูย่อหน้าที่ชื่อว่า "ทำงานอย่างไร?") แทนที่จะมองหาบางอย่างเช่น ab และ a () เป็นต้น

ในคำอื่น ๆ แทนการด้วยตนเองความคิดของรูปแบบที่พบในรหัสที่จะมองหาคอมพิวเตอร์สามารถคิดออกด้วยตัวเอง ซึ่งสามารถทำได้โดยมี

  1. รหัสมากมายในภาษาการเขียนโปรแกรมที่แตกต่างกัน

    • คำแนะนำ: นำตัวอย่างรหัสจากแหล่งเก็บข้อมูลบนเว็บโดยอัตโนมัติเช่น Google Code หรือ Github หรือแม้กระทั่งจากสิ่งต่าง ๆ ใน Stackoverflow ที่ทำเครื่องหมายเป็นรหัสแล้ว

    • หมายเหตุ: อาจเป็นการดีที่จะแยกวิเคราะห์ความคิดเห็นของโค้ด

  2. ข้อความภาษาอังกฤษมากมายที่นำมาจากบทความบนเว็บ

    • แม้ว่าจะไม่ได้มาจากบทความเกี่ยวกับการเขียนโปรแกรม (มิฉะนั้นพวกเขาอาจมีรหัสในพวกเขาและผสมระบบขึ้น :-))

และการมีอัลกอริทึมบางอย่างจะค้นหารูปแบบในโค้ดที่ไม่ได้เป็นภาษาอังกฤษโดยอัตโนมัติและในทางกลับกันและใช้รูปแบบเหล่านั้นเพื่อตรวจสอบโค้ดคืออะไรและโค้ดใดที่ไม่ใช้รหัสโดยเรียกใช้อัลกอริทึมบนโพสต์

(อย่างไรก็ตามฉันไม่แน่ใจว่าอัลกอริทึมดังกล่าวทำงานอย่างไรคำตอบอื่น ๆ สำหรับคำถามปัจจุบันอาจมีข้อมูลที่เป็นประโยชน์สำหรับเรื่องนั้น)

จากนั้นระบบสามารถสแกนรหัสซ้ำ ๆ เป็นระยะ ๆ เพื่อพิจารณาการเปลี่ยนแปลงของวิธีการดูรหัส ณ จุดนั้นในเวลา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.