คุณใช้ตัวกรองคำหยาบที่ดีได้อย่างไร


208

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

จะพบรายการคำสาบานที่ดีในภาษาและภาษาถิ่นต่าง ๆ ได้ที่ไหน

มีแหล่ง API ที่มีรายการที่ดีหรือไม่ หรือบางที API ที่บอกว่า "ใช่นี่สะอาด" หรือ "ไม่นี่สกปรก" ด้วยพารามิเตอร์บางอย่าง?

มีวิธีใดที่ดีในการดึงดูดผู้คนที่พยายามจะหลอกลวงระบบเช่น $$, azz หรือ a55?

คะแนนโบนัสหากคุณเสนอโซลูชันสำหรับ PHP :)

แก้ไข: การตอบสนองต่อคำตอบที่บอกว่าหลีกเลี่ยงปัญหาการเขียนโปรแกรม:

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

ดังนั้นฉันหมายถึงวิธีการคิดออกโทเค็นเดียวสกปรกหรือไม่และจากนั้นก็ไม่อนุญาต ฉันจะไม่รบกวนการป้องกันความรู้สึกเช่นการอ้างอิง "ยีราฟคอยาว" เฮฮาโดยสิ้นเชิง คุณไม่สามารถทำอะไรได้ที่นั่น :)


12
มันเป็นความอัปยศที่คำตอบยอดนิยมทั้งหมดมีอยู่และความพ่ายแพ้ที่หลากหลายจากความท้าทายในการเขียนโปรแกรม ด้วยบริการคอมพิวเตอร์ "cyborg" เช่น Mechanical Turk ที่กำลังได้รับไอน้ำและซอฟต์แวร์เกือบทั้งหมดกลายเป็นโซเชียลมันสำคัญยิ่งกว่าที่เคยมีฮิวริสติกสำหรับเนื้อหาที่ติดธงแดงและทำให้ผู้ดูแลกลายเป็นที่สนใจ!
JasonSmith

10
โปรดระวังเกี่ยวกับบริบทภาษาโดยเฉพาะอย่างยิ่งถ้าคุณทำ i18n ฉันเคยลองตั้งกลุ่ม Google สำหรับหลักสูตรที่ฉันให้ชื่อว่า "Sanal ortamda görselleştirme" ซึ่งเป็นภาษาตุรกีสำหรับ "การสร้างภาพในสื่อเสมือน" Google โง่พอที่จะปฏิเสธมันเพราะชื่อที่มีคำว่า "ทวาร" Sanal [tr] = Virtual [en] และ Google กล่าวหาฉันในเรื่องหยาบคายอย่างไร้ความปราณี! : D โปรดอย่าปล่อยให้สิ่งแปลก ๆ เช่นนี้เกิดขึ้น
edgerunner

ถ้าคุณค้นหาคำในภาษาสเปนล่ะ จริงๆแล้วคุณสามารถใช้ตัวกรอง Google รูปภาพในลักษณะนั้นได้ (ถ้าคุณแปลเป็นภาษาอื่น)
new123456

ข้อเสนอแนะอื่นจะไม่ห้ามคำเหล่านี้ แต่เพื่อลงทะเบียนผู้ใช้ที่ใช้พวกเขา หากผู้ใช้ / IP ได้รับมากกว่า 2, 3 หรือทุกอย่างที่คุณต้องการให้บล็อกบุคคลนั้น ไม่เข้าใจผิดไม่ได้ แต่ฉันคิดว่ามันไม่สะดวกกว่าที่จะถูกบล็อกและต้องเปลี่ยนผู้ใช้ / IP / ทั้งคู่มากกว่าที่จะเขียน 'กระต่ายสีขาวปุย' แทนที่จะเป็น 'หี' ส่วนผู้ใช้ไม่ทราบว่าคำหรือนิพจน์อะไรที่พวกเขาไม่สามารถใช้ดังนั้นพวกเขาจึงไม่สามารถเดาคำที่ไม่ดีต่าง ๆ ได้อย่างง่ายดายเมื่อถูกแบน
Francisco Presencia

1
ตัวกรองหยาบคายเป็นความคิดที่ไม่ดี มันยากมากที่จะแยกแยะความแตกต่างระหว่างคนที่พยายามหลอกลวงระบบ ("เหลวไหลคุณ!") และบางคนพูดถึงสิ่งที่เหมาะสมอย่างสมบูรณ์ ("ฉันชอบช็อคโกแลตเหลวไหล")
clickbait

คำตอบ:


177

ตัวกรองความหยาบคาย: ความคิดที่ไม่ดีหรือการแทรกซึมของความคิดที่ไม่น่าเชื่ออย่างไม่น่าเชื่อ?

นอกจากนี้ยังไม่มีใครลืมประวัติความเป็นมาอย่างไม่สิ้นสุดของ SpeedChat ของ Toontownซึ่งแม้แต่การใช้ "รายการคำปลอดภัย" ส่งผลให้อายุ 14 ปีหลีกเลี่ยงได้อย่างรวดเร็วด้วย: "ฉันต้องการติดยีราฟคอยาวของฉันให้กระต่ายขาวนุ่มของคุณ ."

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

ระบบที่ลบการไม่เปิดเผยตัวตนและแนะนำความรับผิดชอบ (สิ่งที่ Stack Overflow ทำได้ดี) ก็มีประโยชน์เช่นกันโดยเฉพาะอย่างยิ่งเพื่อช่วยต่อสู้กับของขวัญของ John Gabriel

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

แก้ไขเพื่อตอบคำถามที่แก้ไข:ขอขอบคุณสำหรับความกระจ่างในสิ่งที่คุณพยายามจะทำ ในกรณีนี้หากคุณเพียงแค่พยายามกรองคำง่ายๆมีสองวิธีที่คุณสามารถทำได้ หนึ่งคือการสร้าง regexp ยาวเดียวกับวลีห้ามทั้งหมดที่คุณต้องการเซ็นเซอร์และเพียงทำ regex ค้นหา / แทนที่ด้วย regex ชอบ:

$filterRegex = "(boogers|snot|poop|shucks|argh)"

และรันบนสตริงอินพุตของคุณโดยใช้preg_match ()เพื่อทดสอบการขายส่งสำหรับการเข้าชม

หรือpreg_replace ()เพื่อลบออก

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

สำหรับตัวอย่างการเขียนโปรแกรม PHP เพิ่มเติมโปรดดูหน้านี้สำหรับคลาสทั่วไปที่ค่อนข้างสูงสำหรับการกรองคำที่มีตัวอักษรตรงกลางจากคำที่ถูกเซ็นเซอร์และคำถาม Stack Overflow ก่อนหน้านี้ที่มีตัวอย่าง PHP (ส่วนที่มีคุณค่าหลักในนั้นคือ วิธีการกรองคำที่ใช้ SQL - ตัวชดเชย leet-speak สามารถจ่ายได้หากคุณพบว่าไม่จำเป็น)

นอกจากนี้คุณยังได้เพิ่ม: " การรับรายการคำศัพท์ในตอนแรกเป็นคำถามที่แท้จริง " - นอกเหนือจากลิงก์ Dansgaurdian ก่อนหน้านี้บางรายการคุณอาจพบว่ามีประโยชน์. zipจำนวน 458 คำที่เป็นประโยชน์


@JPLemme: ใช่มันควร - ฉันควรจะเพิ่ม [sic] หลังจากนั้นเพราะนั่นเป็นวิธีที่ Atwood สะกดมัน :)
HanClinto

"Club Penguin" เพิ่มหลายร้อยรายการในตัวกรองคำหยาบของพวกเขาทุกวัน : raphkoster.com/2008/05/09/…
Frank Farmer

6
คำห่อหุ้มรอบตัวเลือกขอบเขต regex ของคุณจะป้องกันไม่ให้clbutticผิดพลาด
CJK

@ck: เฉพาะในกรณีที่คุณไม่กังวลเกี่ยวกับการกรองคำที่สะกดผิด "F * ckkkk yo 'asssss" :) ฉันไม่แน่ใจว่าฉันเชื่อว่าโทรลล์ของฉันมีการสะกดที่แม่นยำมาก
HanClinto

1
หากคุณต้องการฟังเรื่องราว "กระต่ายปุยสีขาว" จากปากม้าสุภาษิตตอนนี้เป็นตอนพอดคาสต์แล้ว: socialmediaclarity.tumblr.com/post/70499341079/ …
F. Randall Farmer Far

44

ในขณะที่ฉันรู้ว่าคำถามนี้ค่อนข้างเก่า แต่เป็นคำถามที่เกิดขึ้นทั่วไป ...

มีทั้งเหตุผลและความต้องการที่แตกต่างกันสำหรับตัวกรองการดูหมิ่น (ดูรายการ Wikipedia ที่นี่ ) แต่บ่อยครั้งที่พวกเขาขาดความถูกต้อง 100% เนื่องจากเหตุผลที่ชัดเจน บริบทและความถูกต้อง

มันขึ้นอยู่กับ (ทั้งหมด) เกี่ยวกับสิ่งที่คุณพยายามที่จะบรรลุ - ที่พื้นฐานที่สุดคุณอาจพยายามที่จะครอบคลุม " เจ็ดคำสกปรก " แล้วบางส่วน ... บางธุรกิจจำเป็นต้องกรองพื้นฐานของความหยาบคายที่สุด: พื้นฐาน คำสาบาน URL หรือข้อมูลส่วนบุคคลและอื่น ๆ แต่คนอื่นต้องป้องกันการตั้งชื่อบัญชีผิดกฎหมาย (Xbox live เป็นตัวอย่าง) หรือมากกว่านั้น ...

เนื้อหาที่ผู้ใช้สร้างขึ้นไม่เพียง แต่มีคำสบถที่อาจเกิดขึ้นเท่านั้น

  • การกระทำทางเพศ
  • รสนิยมทางเพศ
  • ศาสนา
  • เชื้อชาติ
  • ฯลฯ ...

และอาจเป็นในหลายภาษา Shutterstock ได้พัฒนารายการคำสกปรกพื้นฐานใน 10 ภาษาจนถึงปัจจุบัน แต่ยังคงพื้นฐานและเน้นความต้องการของ 'การติดแท็ก' เป็นอย่างมาก มีจำนวนรายการอื่น ๆ บนเว็บ

ฉันเห็นด้วยกับคำตอบที่ยอมรับว่าไม่ใช่วิทยาศาสตร์ที่กำหนดไว้และเนื่องจากภาษาเป็นความท้าทายที่พัฒนาอย่างต่อเนื่องแต่สิ่งหนึ่งที่อัตราการจับ 90% ดีกว่า 0% ขึ้นอยู่กับเป้าหมายของคุณอย่างแท้จริง - สิ่งที่คุณพยายามทำระดับการสนับสนุนที่คุณมีและความสำคัญในการลบความหยาบคายประเภทต่างๆ

ในการสร้างตัวกรองคุณต้องพิจารณาองค์ประกอบต่อไปนี้และวิธีที่เกี่ยวข้องกับโครงการของคุณ:

  • คำ / วลี
  • ตัวย่อ (FOAD / LMFAO เป็นต้น)
  • ผลบวกปลอม (คำ, สถานที่และชื่อเช่น 'mishit', 'scunthorpe' และ 'titsworth')
  • URL (ไซต์ลามกเป็นเป้าหมายที่ชัดเจน)
  • ข้อมูลส่วนบุคคล (อีเมลที่อยู่หมายเลขโทรศัพท์ ฯลฯ - ถ้ามี)
  • ตัวเลือกภาษา (โดยปกติเป็นภาษาอังกฤษโดยค่าเริ่มต้น)
  • การกลั่นกรอง (อย่างไรถ้าคุณสามารถโต้ตอบกับเนื้อหาที่ผู้ใช้สร้างขึ้นและสิ่งที่คุณสามารถทำได้)

คุณสามารถสร้างตัวกรองการดูหมิ่นที่รวบรวมความหยาบคาย 90% + ได้อย่างง่ายดาย แต่คุณจะไม่ได้รับผลกระทบ 100% มันเป็นไปไม่ได้ ยิ่งคุณต้องการใกล้ถึง 100% ยิ่งยากที่จะกลายเป็น ... การสร้างเครื่องมือหยาบคายที่ซับซ้อนในอดีตที่จัดการกับข้อความเรียลไทม์มากกว่า 500K ต่อวันฉันจะให้คำแนะนำต่อไปนี้:

ตัวกรองพื้นฐานจะเกี่ยวข้องกับ:

  • การสร้างรายการคำหยาบ
  • การพัฒนาวิธีการจัดการกับการสืบทอดคำหยาบ

ฟิลเลอร์ที่ซับซ้อนในระดับปานกลางจะเกี่ยวข้องกับ (นอกเหนือจากตัวกรองพื้นฐาน):

  • การใช้การจับคู่รูปแบบที่ซับซ้อนเพื่อจัดการกับ derivations เพิ่มเติม (ใช้ regex ขั้นสูง)
  • การจัดการกับLeetspeak (l33t)
  • การจัดการกับผลบวกที่ผิดพลาด

ตัวกรองที่ซับซ้อนจะเกี่ยวข้องกับจำนวนดังต่อไปนี้ (นอกเหนือจากตัวกรองระดับปานกลาง):


28

ฉันไม่รู้เกี่ยวกับห้องสมุดที่ดีสำหรับเรื่องนี้ แต่สิ่งที่คุณทำตรวจสอบให้แน่ใจว่าคุณทำผิดไปในทิศทางของการปล่อยให้สิ่งต่าง ๆ ผ่าน ฉันจัดการกับระบบที่ไม่อนุญาตให้ฉันใช้ "mpassell" เป็นชื่อผู้ใช้เนื่องจากมี "ass" เป็นซับสตริง นั่นเป็นวิธีที่ยอดเยี่ยมในการโอนผู้ใช้!


17
หรือห้าม "ห้องนักบิน" ในเกมยานอวกาศบิน
Shinhan

24

ในระหว่างการสัมภาษณ์งานของฉัน บริษัท CTO ที่สัมภาษณ์ฉันลองใช้คำศัพท์ / เกมบนเว็บที่ฉันเขียนด้วยภาษาจาวา จากรายการคำศัพท์ของพจนานุกรม Oxford English ทั้งหมดคำแรกที่เดาออกมาคืออะไร

แน่นอนคำที่หยาบคายที่สุดในภาษาอังกฤษ

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

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


8
ปิดหัวข้อ แต่คำที่หยาบคายที่สุดคืออะไร? ฉันมักจะคิดว่ามันเป็นคำ c หรือคำ n แต่ฉันคิดว่าผู้คนคิดว่าคำว่า f คือ
Jeff

2
"ฉันสงสัยว่าผู้ใช้จะใช้มันบ่อยพอที่จะเป็นปัญหา"รักษาความหวังไว้ เมื่อผู้ใช้สะดุดกับตัวกรองพวกเขาจะพยายามหาวิธีหลบเลี่ยง มันอาจเป็นเรื่องง่ายเหมือนการเปลี่ยนตัวอักษรด้วยตัวเลขไปเป็นตำแหน่งที่ว่างแปลก ๆ ฯลฯ )
BryanH

21

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

ที่กล่าวว่ารายการ 'คำหยาบคาย' ใด ๆ ที่มีแนวโน้มที่จะดำเนินการเช่นเดียวกับรายการอื่น ๆ เนื่องจากปัญหาพื้นฐานคือการทำความเข้าใจภาษาซึ่งค่อนข้างยากกับเทคโนโลยีในปัจจุบัน

ดังนั้นวิธีแก้ปัญหาในทางปฏิบัติเพียงอย่างเดียวคือสองเท่า:

  1. เตรียมที่จะอัปเดตพจนานุกรมของคุณเป็นประจำ
  2. จ้างบรรณาธิการมนุษย์เพื่อแก้ไขผลบวกปลอม (เช่น "clbuttic" แทนที่จะเป็น "คลาสสิก") และเชิงลบที่ผิดพลาด (โอ๊ะโอพลาดไปหนึ่งอัน!)

1
เพียงตรวจจับคำที่มีช่องว่างทั้งสองข้างหยุดเต็มหลังไม่?
David D

1
H3ll ไม่มีมนุษย์คนใดที่ได้ผลดีที่สุดในคดีเท่านั้น เรากำลังติดต่อกับมนุษย์ที่นี่และพวกเขาฉลาดมาก :)
สตีเวนเอโลว์

14

วิธีเดียวที่จะป้องกันการป้อนข้อมูลผู้ใช้ที่ไม่เหมาะสมคือการป้องกันการป้อนข้อมูลผู้ใช้ทั้งหมด

หากคุณยืนยันที่จะอนุญาตให้ผู้ใช้ป้อนข้อมูลและต้องการการกลั่นกรองให้รวมผู้กลั่นกรองคนด้วย


13

13
เจ๋ง .. แต่มันไม่ได้มารับ (.) (.)
Jason Jong

2
ระมัดระวัง CDYNE ไม่ได้ดูแลผลิตภัณฑ์นี้อีกต่อไป คุณสามารถใช้ความเสี่ยงของคุณเอง
Sari Rahal

7

เกี่ยวกับคำถามย่อย "หลอกลวงระบบ" ของคุณคุณสามารถจัดการได้โดยการปรับรายการ "คำที่ไม่เหมาะสม" และข้อความที่ผู้ใช้ป้อนให้เป็นมาตรฐานก่อนทำการค้นหา เช่นใช้ชุดของ regexes (หรือtrถ้ามี PHP) เพื่อแปลง[z $ 5]เป็น "s", [4 @]เป็น "a" ฯลฯ จากนั้นเปรียบเทียบรายการ "คำที่ไม่ดี" ปกติกับมาตรฐาน ข้อความ โปรดทราบว่าการปรับสภาพอาจนำไปสู่การบวกเท็จเพิ่มเติมแม้ว่าฉันไม่สามารถนึกถึงกรณีที่เกิดขึ้นจริงในขณะนี้

ความท้าทายที่ยิ่งใหญ่คือการหาสิ่งที่จะทำให้คนพูดว่า " ปากกานั้นยิ่งใหญ่กว่าดาบ" ในขณะที่บล็อก "peni s"


14
อย่าลืมผู้เชี่ยวชาญ-exchange.comและ pen-island.com URL ไซต์เหล่านั้นครั้งหนึ่งไม่มีเครื่องหมายขีดคั่น
BryanH

7

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

ตัวอย่างหนึ่งในปัจจุบันของเรื่องนี้: ebay ใช้วิธีการแบบพจนานุกรมเพื่อกรอง "คำที่ไม่เหมาะสม" จากข้อเสนอแนะ หากคุณพยายามป้อนคำแปลภาษาเยอรมันของ "นี่เป็นธุรกรรมที่สมบูรณ์แบบ" ("das war eine perfekte Transaktion") อีเบย์จะปฏิเสธข้อเสนอแนะเนื่องจากคำที่ไม่ดี

ทำไม? เพราะคำภาษาเยอรมันสำหรับ "เคย" คือ "สงคราม" และ "สงคราม" อยู่ในพจนานุกรมอีเบย์ของ "คำที่ไม่ดี"

ดังนั้นระวังปัญหาการแปล


6

หากคุณสามารถทำอะไรบางอย่างเช่น Digg / Stackoverflow ซึ่งผู้ใช้สามารถลงคะแนน / ทำเครื่องหมายเนื้อหาลามกอนาจาร ... ทำได้

จากนั้นสิ่งที่คุณต้องทำคือตรวจสอบผู้ใช้ "ซน" และบล็อกพวกเขาหากพวกเขาทำผิดกฎ


4

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

การเปิดเผยแบบเต็มฉันเขียนปลั๊กอินนี้ ...

อย่างไรก็ตาม.

วิธีการที่ฉันได้ไปคืออนุญาตให้ผู้ใช้ "เลือกใช้" ในการกรองคำหยาบ การดูหมิ่นโดยทั่วไปจะได้รับอนุญาตตามค่าเริ่มต้น แต่หากผู้ใช้ของฉันไม่ต้องการอ่านพวกเขาก็ไม่จำเป็นต้อง สิ่งนี้จะช่วยแก้ไขปัญหา "l33t sp3 @ k" ด้วย

แนวคิดนั้นง่าย ปลั๊กอินที่ได้รับการฉีดจากเซิร์ฟเวอร์หากบัญชีของลูกค้าเปิดใช้งานการกรองคำหยาบ จากตรงนั้นมันเป็นแค่เส้นเรียบง่ายสองสามเส้นที่ลบล้างคำสาบาน

นี่คือหน้าตัวอย่าง
https://chaseflorell.github.io/jQuery.ProfanityFilter/demo/

<div id="foo">
    ass will fail but password will not
</div>

<script>
    // code:
    $('#foo').profanityFilter({
        customSwears: ['ass']
    });
</script>

ผลลัพธ์

*** จะล้มเหลว แต่รหัสผ่านจะไม่


นี่คือตัวอย่าง การทำงาน jsFiddle ที่จะมาพร้อมกับคำตอบนี้
Chase Florell

ไร้เดียงสามาก ไม่ได้กรองa$$
ฝ่ายซ้าย

3
@EmperorAiman มันก็ไม่เคยตั้งใจที่จะกรองออกl33t พูด ฉันไม่แนะนำให้พยายามกรองมันเนื่องจากเป็นการต่อสู้ที่แพ้ ตัวกรองการดูหมิ่นที่ฉันได้โพสต์คือ "สร้างขึ้นเพื่อให้ผู้ใช้สามารถ" เลือกใช้ "ในการกรองการดูหมิ่น" หมายความว่าจะใช้งานได้ดีที่สุดในไซต์ที่อนุญาตการดูหมิ่นโดยค่าเริ่มต้น ถ้าคุณต้องการที่จะกรองa$$แล้วคุณเพิ่มลงในรายการตัวกรอง
Chase Florell

4

ฉันรวบรวม 2200 คำที่ไม่ดีใน 12 ภาษา: en, ar, cs, da, de, eo, es, fa, fi, fr, hi, hu, มัน, ja, ko, nl, ไม่, pl, pt, ru, sv , th, tlh, tr, zh

มีตัวเลือกการถ่ายโอนข้อมูล MySQL, JSON, XML หรือ CSV

https://github.com/turalus/openDB

ฉันขอแนะนำให้คุณรัน SQL นี้ในฐานข้อมูลของคุณและตรวจสอบทุกครั้งเมื่อผู้ใช้ป้อนข้อมูล


2

อย่า มันนำไปสู่ปัญหาเท่านั้น ประสบการณ์ส่วนตัวอย่างหนึ่งที่ฉันมีกับตัวกรองหยาบคายคือเวลาที่ฉันถูกเตะ / แบนจากช่อง IRC เพื่อกล่าวถึงว่าฉัน "มุ่งหน้าข้ามสะพานไปยังแฮนค็อกสักสองสามชั่วโมง" หรืออะไรก็ตาม


2

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

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

ขอบคุณสำหรับความคิด

กฎ HanClinto!


2

เมื่อคุณมีตาราง MYSQL ที่ดีของคำที่ไม่ดีบางคำที่คุณต้องการกรอง (ฉันเริ่มด้วยลิงก์ในกระทู้นี้) คุณสามารถทำสิ่งนี้ได้:

$errors = array();  //Initialize error array (I use this with all my PHP form validations)

$SCREENNAME = mysql_real_escape_string($_POST['SCREENNAME']); //Escape the input data to prevent SQL injection when you query the profanity table.

$ProfanityCheckString = strtoupper($SCREENNAME); //Make the input string uppercase (so that 'BaDwOrD' is the same as 'BADWORD').  All your values in the profanity table will need to be UPPERCASE for this to work.

$ProfanityCheckString = preg_replace('/[_-]/','',$ProfanityCheckString); //I allow alphanumeric, underscores, and dashes...nothing else (I control this with PHP form validation).  Pull out non-alphanumeric characters so 'B-A-D-W-O-R-D' shows up as 'BADWORD'.

$ProfanityCheckString = preg_replace('/1/','I',$ProfanityCheckString); //Replace common numeric representations of letters so '84DW0RD' shows up as 'BADWORD'.

$ProfanityCheckString = preg_replace('/3/','E',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/4/','A',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/5/','S',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/6/','G',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/7/','T',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/8/','B',$ProfanityCheckString);

$ProfanityCheckString = preg_replace('/0/','O',$ProfanityCheckString); //Replace ZERO's with O's (Capital letter o's).

$ProfanityCheckString = preg_replace('/Z/','S',$ProfanityCheckString); //Replace Z's with S's, another common substitution.  Make sure you replace Z's with S's in your profanity database for this to work properly.  Same with all the numbers too--having S3X7 in your database won't work, since this code would render that string as 'SEXY'.  The profanity table should have the "rendered" version of the bad words.

$CheckProfanity = mysql_query("SELECT * FROM DATABASE.TABLE p WHERE p.WORD = '".$ProfanityCheckString."'");
if(mysql_num_rows($CheckProfanity) > 0) {$errors[] = 'Please select another Screen Name.';} //Check your profanity table for the scrubbed input.  You could get real crazy using LIKE and wildcards, but I only want a simple profanity filter.

if (count($errors) > 0) {foreach($errors as $error) {$errorString .= "<span class='PHPError'>$error</span><br /><br />";} echo $errorString;} //Echo any PHP errors that come out of the validation, including any profanity flagging.


//You can also use these lines to troubleshoot.
//echo $ProfanityCheckString;
//echo "<br />";
//echo mysql_error();
//echo "<br />";

ฉันแน่ใจว่ามีวิธีที่มีประสิทธิภาพมากขึ้นในการทำสิ่งทดแทนเหล่านั้นทั้งหมด แต่ฉันไม่ฉลาดพอที่จะเข้าใจได้ (และดูเหมือนว่าจะทำงานได้ดี

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

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


1

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

สิ่งที่ฉันจะทำคือการใช้ตัวกรอง regex เช่นนั้น/[\s]dooby (doo?)[\s]/iหรือคำนั้นนำหน้าไปยังผู้อื่น, /[\s]doob(er|ed|est)[\s]/. สิ่งเหล่านี้จะป้องกันการกรองคำเช่น assuaged ซึ่งใช้ได้อย่างสมบูรณ์ แต่ยังต้องการความรู้เกี่ยวกับตัวแปรอื่น ๆ และการปรับปรุงตัวกรองจริงถ้าคุณเรียนรู้สิ่งใหม่ เห็นได้ชัดว่านี่เป็นตัวอย่างทั้งหมด แต่คุณต้องตัดสินใจเองว่าจะทำอย่างไร

ฉันไม่ได้กำลังพิมพ์คำทั้งหมดที่ฉันรู้ไม่ใช่ตอนที่ฉันไม่อยากรู้


1

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

Boxwood เป็นส่วนขยาย PHP สำหรับการแทนที่คำหลายคำในข้อความอย่างรวดเร็ว รองรับการจับคู่แบบตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ มันต้องการให้ข้อความที่ทำงานนั้นถูกเข้ารหัสเป็น UTF-8

ดูโพสต์บล็อกนี้สำหรับรายละเอียดเพิ่มเติม:

ด้วย Boxwood คุณสามารถทำให้รายการคำค้นหาของคุณยาวเท่าที่คุณต้องการ - การค้นหาและแทนที่อัลกอริทึมไม่ได้ช้าลงด้วยคำเพิ่มเติมในรายการคำที่จะค้นหา มันทำงานได้โดยการสร้างคู่ของคำค้นหาทั้งหมดแล้วสแกนข้อความหัวเรื่องของคุณเพียงครั้งเดียวเดินลงองค์ประกอบของคู่ชีวิตและเปรียบเทียบกับตัวละครในข้อความของคุณ รองรับ US-ASCII และ UTF-8 การจับคู่ตัวพิมพ์เล็กหรือตัวพิมพ์เล็กและมีตรรกะการตรวจสอบขอบเขตของคำศัพท์ภาษาอังกฤษ


1

ฉันได้ข้อสรุปเพื่อสร้างตัวกรองหยาบคายที่ดีเราต้องการส่วนประกอบหลัก 3 ประการหรืออย่างน้อยก็เป็นสิ่งที่ฉันจะทำ พวกนี้คือ:

  1. ตัวกรอง: บริการพื้นหลังที่ตรวจสอบกับบัญชีดำพจนานุกรมหรืออะไรทำนองนั้น
  2. ไม่อนุญาตบัญชีที่ไม่ระบุชื่อ
  3. รายงานการล่วงละเมิด

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


1

ในช่วงท้ายเกมด้วยเช่นกัน แต่การทำวิจัยและสะดุดไปที่นี่ ดังที่คนอื่น ๆ พูดถึงมันเกือบจะเป็นไปไม่ได้ถ้ามันเป็นไปโดยอัตโนมัติ แต่ถ้าการออกแบบ / ความต้องการของคุณสามารถมีส่วนร่วมในบางกรณี (แต่ไม่ใช่ตลอดเวลา) การโต้ตอบของมนุษย์เพื่อตรวจสอบว่ามันดูหมิ่นหรือไม่ https://docs.microsoft.com/en-us/azure/cognitive-services/content-moderator/text-moderation-api#profanityเป็นตัวเลือกปัจจุบันของฉันตอนนี้ด้วยเหตุผลหลายประการ:

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

สำหรับความต้องการของฉันมัน / ขึ้นอยู่กับบริการสาธารณะเชิงพาณิชย์ (OK, videogames) ที่ผู้ใช้รายอื่นอาจ / จะเห็นชื่อผู้ใช้ แต่การออกแบบนั้นต้องผ่านตัวกรองคำหยาบเพื่อปฏิเสธชื่อผู้ใช้ที่ไม่เหมาะสม ส่วนที่น่าเศร้าเกี่ยวกับเรื่องนี้คือปัญหา "clbuttic" แบบคลาสสิกมักจะเกิดขึ้นเนื่องจากชื่อผู้ใช้มักเป็นคำเดียว (ไม่เกิน N ตัวอักษร) ซึ่งบางครั้งก็มีหลายคำที่ต่อกัน ... อีกครั้งบริการองค์ความรู้ของ Microsoft จะไม่ตั้งค่าสถานะ "Assist" เป็นข้อความ HasProfanity = true แต่อาจตั้งค่าสถานะความน่าจะเป็นหนึ่งในหมวดหมู่ให้สูง

เมื่อถาม OP เรื่องเกี่ยวกับ "a $$" นี่คือผลลัพธ์เมื่อฉันผ่านมันผ่านตัวกรอง: ป้อนคำอธิบายรูปภาพที่นี่อย่างที่คุณเห็นมันไม่ได้ดูหมิ่น แต่มีโอกาสสูงที่จะเป็นเช่นนั้น ของการตรวจสอบ (ปฏิสัมพันธ์ของมนุษย์)

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

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

หากสนใจฉันสามารถแสดงข้อเสียในความคิดเห็นในอนาคต


-2

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

จับคำ

สมมติว่าคุณต้องการจับ F-Word ง่ายใช่มั้ย เรามาดูกันดีกว่า

คุณสามารถวนรอบสตริงเพื่อค้นหา "fuck" น่าเสียดายที่ทุกคนหลอกตัวกรองในปัจจุบัน ตัวกรองหยาบคายไม่ได้รับ "fuk"

หนึ่งสามารถลองตรวจสอบการสะกดและคำที่หลากหลายของคำ แต่จะทำให้ประสิทธิภาพการทำงานของโค้ดของคุณช้าลง ในการรับ F-Word คุณต้องมองหา "fuc", "Fuc", "fuk", "Fuk", "F ***" เป็นต้นและรายการจะเริ่มขึ้นเรื่อย ๆ

หลีกเลี่ยงความไร้เดียงสา

โอเคแล้วมันทำให้ตัวพิมพ์เล็กและตัวพิมพ์เล็กและไม่สนใจช่องว่างดังนั้นจึงจับ "F u C k" ได้ไหม นั่นอาจฟังดูเป็นความคิดที่ดี แต่ใครบางคนสามารถข้ามตัวกรองคำหยาบด้วย "FUCK"

คุณไม่สนใจเครื่องหมายวรรคตอน

ตอนนี้เป็นปัญหาจริงเนื่องจากประโยคเช่น " Hell o, there!" จะหยิบขึ้นมาเป็น "นรก" และ "Wh ass ?" เลือกเป็น "ตูด"

และมีกำลังพวงของคำว่าคุณจะต้องแยกออกจากตัวกรองเช่น "จุดด้อยหัวนม ution" เพราะมี "หัวนม" อยู่ในนั้น

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

อย่าใช้ตัวกรองคำหยาบ มันยากที่จะพัฒนาและช้าพอ ๆ กับการรวบรวมข้อมูล


2
-1 ไม่ตอบคำถาม OP และส่วนใหญ่เป็นความคิดเห็น มีหลายกรณีการใช้ที่ถูกต้องสำหรับยูทิลิตี้นี้ ตัวอย่างเช่นการล้างซอร์สโค้ดก่อนการตรวจสอบเพื่อให้ บริษัท ไม่ได้รับความอับอาย
davidjmcclelland

-3

อย่า

เพราะ:

  • Clbuttic
  • การดูหมิ่นไม่ใช่ OMG EVIL
  • ไม่สามารถนิยามความหยาบคายได้อย่างมีประสิทธิภาพ
  • คนส่วนใหญ่อาจไม่รู้สึกซาบซึ้งที่ถูก "ป้องกัน" จากการดูหมิ่น

แก้ไข: ในขณะที่ฉันเห็นด้วยกับผู้วิจารณ์ที่กล่าวว่า "การเซ็นเซอร์ผิด" นั่นไม่ใช่ลักษณะของคำตอบนี้


90
10 upvotes สำหรับคำตอบนี้หรือไม่? ราวกับว่าใครที่ต้องการกรองความหยาบคายจะต้องเป็นคนมีคุณธรรม ความเศร้าโศกที่ดี นี่เป็นคำถามที่ถูกต้องและไม่ตอบสนองต่อการตอบสนองของผู้ขับขี่ -1
Kluge

12
@Klge: คุณเป็นคนเดียวที่พูดว่า "คุณธรรมครึ่งปัญญา" ในความเป็นจริงฉันไม่ได้พูดอะไรเกี่ยวกับลักษณะทางศีลธรรมของการใช้ตัวกรองหยาบคายเลย มิทช์นำเสนอส่วนหนึ่งของเหตุผลที่ฉันพูดว่า "ไม่" และมันไม่ใช่การขับรถอย่างบ้าคลั่ง บางครั้งคำว่า "ไม่" เป็นคำตอบที่ถูกต้องสำหรับ "ฉันจะ ... ได้อย่างไร" [ต่อไป]
หนังตา

2
@eyelidlessness: บางทีคุณอาจจะถูกที่ฉันอ่านมากเกินไปในคำตอบคำเดียวของคุณ แต่เนื่องจากคุณไม่ได้ทำอย่างละเอียดฉันไม่สามารถบอกได้ว่าการคัดค้านของคุณอยู่บนพื้นฐานทางศีลธรรมหรือทางเทคนิค ฉันจะยอมรับว่าฉันรู้สึกเบื่อหน่ายกับ "การเซ็นเซอร์ในรูปแบบใด ๆ ที่ไม่ดี" ความคิดเห็น
Kluge

5
-1 "ไม่" ไม่ใช่คำตอบที่ถูกต้องโดยไม่คำนึงถึงประเด็นทางศีลธรรมหรือทางเทคนิค มีหลายครั้งที่เหมาะสมอย่างยิ่งในการกรองเนื้อหาตามลักษณะของเนื้อหา ลองนึกภาพไซต์อีคอมเมิร์ซที่ขายชุดชั้นในสตรีและเสนอคุณลักษณะ 'บทวิจารณ์' คุณต้องการเด็กผู้ชายที่เตรียมไว้ล่วงหน้าเกลื่อนไซต์ของคุณด้วยขยะหรือไม่ ไม่แน่นอน และอาจจะยุ่งยากเกินไปที่จะมีกระบวนการอนุมัติโดยมนุษย์ ตัวกรองอย่างง่ายเพื่อปฏิเสธความเห็นเกี่ยวกับขยะเป็นสิ่งที่ดี
pspahn

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