npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, πŸ‘‹, I’m Ryan HefnerΒ  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you πŸ™

Β© 2024 – Pkg Stats / Ryan Hefner

tetrapod

v1.0.0

Published

😊 Improved swear word detection module

Downloads

2

Readme

Tetrapod.js

Tetrapod.js λŠ” λ³€ν˜•λœ 비속어 단어 ν‘œν˜„λ“€μ„ νŒŒμ•…ν•˜κ³  νƒμ§€ν•˜κΈ° μœ„ν•΄ 개발 되고 μžˆλŠ” λͺ¨λ“ˆν˜• ν”„λ‘œκ·Έλž¨μž…λ‹ˆλ‹€. ν•œκ΅­μ–΄μ—μ„œ μ‘΄μž¬ν•˜λŠ” 비속어 단어듀을 μš°μ„ μ μœΌλ‘œ 탐지 λŒ€μƒμœΌλ‘œ μ •ν•˜μ—¬ 개발되고 있으며, ν–₯ν›„ λͺ¨λ“  μ–Έμ–΄μ—μ„œ λ³€ν˜•λœ 비속어 ν‘œν˜„μ„ νƒμ§€ν•˜λŠ”λ° μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

ν˜„μž¬ 초기 개발 진행 쀑에 μžˆλŠ” ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ λͺ©ν‘œ

λŒ€μ²΄λ‘œ λΆ„μœ„κΈ°κ°€ 쒋지 μ•ŠμœΌλ©΄, μ–Έμ–΄ λ˜ν•œ κ·Έλ ‡κ²Œ λœλ‹€. (When the general atmosphere is bad, language must suffer)

인터넷 μƒμ—μ„œ λ‹€μˆ˜κ°€ λͺ¨μ—¬μ„œ λŒ€ν™” 쀑 λΆ„μœ„κΈ°κ°€ λ‚˜λΉ μ§€κ±°λ‚˜ μ‚¬νšŒ λ‚΄ λΆ„μœ„κΈ°κ°€ λ‚˜μ˜κ²Œ 되면, 이에따라 μ‚¬λžŒλ“€μ΄ μ‚¬μš©ν•˜λŠ” μ–Έμ–΄ λ˜ν•œ κ³Όκ²©ν•˜κ²Œ λ˜κ±°λ‚˜ λΉ„μ†μ–΄λ‚˜ μ €μ†ν•œ 단어λ₯Ό μ„žμ–΄ μ‚¬μš©ν•˜λŠ” μ‚¬λžŒλ“€μ΄ λ“±μž₯ν•˜κ²Œ λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μƒν™©μ˜ 근본적 원인은 μ‚¬νšŒμ  문제일 μˆ˜λ„, 개인적 문제일 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν‘œν˜„μ€ λ‹Ήμ‚¬μžμ˜ 감정을 λ‹΄κ³  있으며 이λ₯Ό λ³Έ μ‚¬λžŒλ“€ λ˜ν•œ 감정이 μƒν•˜κ²Œ λ˜λŠ” κ²½μš°κ°€ μƒκΉλ‹ˆλ‹€.

생각이 μ–Έμ–΄λ₯Ό μ˜€μ—Όμ‹œν‚¨λ‹€λ©΄, μ–Έμ–΄ μ—­μ‹œ 생각을 μ˜€μ—Όμ‹œν‚¬ 수 μžˆλ‹€. (If thought corrupts language, language can also corrupt thought.)

μ–Έμ–΄λŠ” 감정을 싀을 수 μžˆλŠ” 맀개체둜써, μ–΄λ– ν•œ 언어적 ν‘œν˜„μ„ 보고 기뢄이 λ‚˜μ˜κ²Œ λ§Œλ“œλŠ” 것 뿐만 μ•„λ‹ˆλΌ, μ–΄λ– ν•œ 감정을 μ „λ‹¬ν•˜κΈ° μœ„ν•œ λͺ©μ λ§Œμ„ μœ„ν•΄μ„œ μ‚¬νšŒμ μœΌλ‘œ 개인 λ˜λŠ” 집단에 μ˜ν•΄μ„œ λͺ¨λ‘κ°€ μ‚¬μš©ν•˜λŠ” μ–Έμ–΄κ°€ λ³€ν˜•λ  수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡κ²Œ 언어에 λ‹΄κΈ°λŠ” κ°μ •μ—λŠ” 성적인 감정이 λ‹΄κΈΈ μˆ˜λ„, 폭λ ₯적인 감정이 λ‹΄κΈΈ μˆ˜λ„ 있으며 κ·Έ μœ ν˜•μ€ 맀우 λ‹€μ–‘ν•©λ‹ˆλ‹€.

ν•œκ΅­μ–΄λŠ” 자음과 λͺ¨μŒμ„ λͺ¨μ•„μ„œ μ“Έ 수 μžˆλŠ” λͺ¨μ•„μ“°κΈ°κ°€ κ°€λŠ₯ν•œ μ μ—μ„œ κΈ°μ‘΄ λ‹€λ₯Έ μ–Έμ–΄κΆŒκ³ΌλŠ” λ‹€λ₯΄κ²Œ μ–΄λ– ν•œ 단어가 λ³€ν˜•λ˜μ–΄ 생길 수 μžˆλŠ” νŒŒμƒλ‹¨μ–΄κ°€ 생기기 맀우 μ‰¬μš°λ©° λ³€ν˜•λœ 단어λ₯Ό κΈ°κ³„μ μœΌλ‘œ νƒμ§€ν•˜κΈ° 맀우 μ–΄λ €μš΄ ꡬ쑰λ₯Ό κ°–μΆ”κ³  μžˆμŠ΅λ‹ˆλ‹€.

μžμ‹ μ΄ μ“°λŠ” μ–Έμ–΄λ₯Ό κ°„κ²°ν•˜κ²Œ ν•œλ‹€λ©΄, κ°€μž₯ 어리석은 ν†΅μ„€λ‘œλΆ€ν„° μžμœ λ‘œμ›Œμ§ˆ 수 μžˆλ‹€. λΆˆν•„μš”ν•œ κ΄€μš©μ–΄λ₯Ό μ“Έ 수 μ—†μœΌλ©°, 어리석은 ν‘œν˜„μ„ μ“°λ©΄ κ·Έ μ–΄λ¦¬μ„μŒμ΄ μŠ€μŠ€λ‘œμ—κ²Œλ„ λΆ„λͺ…νžˆ λ“œλŸ¬λ‚˜ 보이게 λœλ‹€. (If you simplify your English, you are freed from the worst follies of orthodoxy. You cannot speak any of the necessary dialects, and when you make a stupid remark its stupidity will be obvious, even to yourself.)

이 ν”„λ‘œμ νŠΈμ˜ λͺ©ν‘œλŠ” 인터넷 μƒμ—μ„œ λ²”λžŒν•˜λŠ” 비속어가 λ¬΄λΆ„λ³„ν•˜κ²Œ νΌμ§€λŠ” 것을 방지할 수 μžˆλŠ” μ–΄λ– ν•œ λ°©νŒŒμ œμ™€ 같은 λͺ¨λ“ˆμ„ κ°œλ°œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. λ§Žμ€ κ³³μ—μ„œ μ‚¬μš©λ˜λŠ” 것을 λͺ©μ μœΌλ‘œ ν•˜κΈ°μ— 이 ν”„λ‘œμ νŠΈ ꡬ성은 Copyleft 둜 κ΅¬μ„±λ˜λ©° μœ λ¬΄μƒμ„ 가리지 μ•Šκ³  무료둜 자유둜운 μ‚¬μš©μ΄ κ°€λŠ₯ν•˜κ²Œλ” λ°°ν¬λ˜λŠ” 것을 λͺ©μ μœΌλ‘œ ν•©λ‹ˆλ‹€.

λΌμ΄μ„ΌμŠ€

MIT Licensed

κΈ°μ‘΄ 비속어 탐지 μ²΄κ³„μ˜ ν•œκ³„

기쑴의 필터링은 λ¬Έμž₯ λ‹¨μœ„λ‘œ 비속어 λ¬Έμžκ°€ λ¬Έμžμ—΄ 상에 μ‘΄μž¬ν•˜λŠ”μ§€ λ§Œμ„ ν™•μΈν•©λ‹ˆλ‹€. κ°€λ Ή 바보 λΌλŠ” 비속어λ₯Ό μ°¨λ‹¨ν•˜λ € ν• λ•Œ μ΄μš©μžκ°€ μ•ˆλ…• 바보야 λΌλŠ” 메세지λ₯Ό μž…λ ₯ν–ˆλ‹€λ©΄, λ°”λ³΄λΌλŠ” λ¬Έμž₯이 μ‘΄μž¬ν•˜λŠ” κ²½μš°μ™€ 같이, λ³€ν˜•λ˜μ§€ μ•Šμ€ μš•μ„€μ΄ μ‘΄μž¬ν•˜λŠ” λ©”μ‹œμ§€μ— ν•œν•΄μ„œλ§Œ 탐지가 κ°€λŠ₯ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ•„λž˜μ™€ 같은 λ³€ν˜•μ— λŒ€ν•΄μ„œλŠ” λŒ€μ²˜ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€.

  • 문자 사이사이에 λΆˆκ·œμΉ™ν•œ κΈ€μžλ₯Ό μ„žμ—ˆμ„ λ•Œ
    • μ•ˆλ…• λ°”111보야, μ•ˆλ…• 바아아아보야
  • 발음 상 λ˜λŠ” λͺ¨μ–‘ 상 μœ μ‚¬ν•œ ν‘œν˜„μœΌλ‘œ λŒ€μ²΄ν•œ 경우
    • μ•ˆλ…• λΉ μ•„λ½€μ˜€μ•Ό!, μ•ˆλ…• ba보야!
  • ν•œκΈ€ λ°›μΉ¨ λ“± νŠΉμˆ˜ν•œ 쑰합을 μ΄μš©ν•΄ λ³€ν˜•ν•œ λΉ„μ†μ–΄μ˜ 경우
    • κ°’μ‚Ύν•ͺλ‹šλ‹Ά
  • 문자λ₯Ό 일뢀 λ’€μ§‘μ–΄μ„œ ν‘œν˜„ν•œκ²½μš°
    • 제발 μ’€ μž… λ‹₯쳐! => 제발 μ’€ μž… 쳐λ‹₯!

λ˜ν•œ 비속어λ₯Ό 일뢀 ν¬ν•¨ν•˜κ³  μžˆμ§€λ§Œ μ •μƒμ μœΌλ‘œ 쓰일 수 μžˆλŠ” 단어듀이 μ‘΄μž¬ν•˜μ—¬ 일뢀 ν‘œν˜„μ„ μ˜€νƒμ§€ν•  ν™•λ₯ μ„ 높이기도 ν•©λ‹ˆλ‹€.

  • ν•œμž λ°œμŒμƒ λ™μΌν•œ λ‹¨μ–΄μ΄λ‚˜ 뜻이 λ‹€λ₯Έ ν‘œν˜„μ΄ 일뢀 더해져 μžˆλŠ” 경우
    • κ·Έ μ‚¬κ±΄μ˜ μ‹œλ°œμ μ€ Aμ”¨μ˜€λ‹€.

Tetrapod.js 은 μ΄λŸ¬ν•œ 비속어 탐지 μ•Œκ³ λ¦¬μ¦˜μ˜ ν•œκ³„λ₯Ό κ·Ήλ³΅ν•˜κΈ°μœ„ν•΄μ„œ, 정상단어λ₯Ό λ¨Όμ € μ°Ύμ•„μ„œ 탐지 λ²”μœ„μ—μ„œ λ°°μ œν•œλ‹€μŒ, 비속어 단어λ₯Ό ν•œ κΈ€μž μ”© μ‘΄μž¬μ—¬λΆ€λ₯Ό νŒŒμ•…ν•©λ‹ˆλ‹€. λ˜ν•œ ν•œκ΅­μ–΄ μš•μ„€μ„ μˆ˜μ§‘ν•˜κ³  ν•΄λ‹Ή μš•μ„€μ˜ λ³€ν˜•μœ ν˜•μ„ 음운, 음절, μ–΄μ ˆ 3단계에 κ±Έμ³μ„œ κ°€λŠ₯ν•œ λͺ¨λ“  λ³€ν˜•κ°€λŠ₯ν•œ ν˜•νƒœλ₯Ό νŒŒμ•…ν•©λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ 상 탐지 μ•Œκ³ λ¦¬μ¦˜ ꡬ성

Tetrapod.js μ—μ„œ μ‚¬μš©ν•˜λŠ” 비속어 탐지 μ•Œκ³ λ¦¬μ¦˜μ˜ ꡬ성은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

정상단어 λͺ©λ‘ ꡬ성

  • μ‹œλ°œμ κ³Ό 같은 λ‹¨μ–΄μ˜ μ˜€νƒμ§€λ₯Ό 막기 μœ„ν•΄μ„œ 사전에 λ¬Έμžμ—΄μ—μ„œ μ°Ύμ•„μ„œ 비속어 νƒμ§€μ‹œ νƒμ§€λŒ€μƒμ—μ„œ μ œμ™Έμ‹œν‚¬ μš©λ„μ˜ 정상단어 λͺ©λ‘μ„ κ΅¬μ„±ν•©λ‹ˆλ‹€.

비속어단어 λͺ©λ‘ ꡬ성

  • μ—¬λŸ¬ 비속어 λ‹¨μ–΄μ˜ λ³€ν˜•μ„ λͺ¨λ‘ νŒŒμ•…ν•˜κΈ° μœ„ν•΄μ„œ, 음운, 음절, μ–΄μ ˆ 3단계에 κ±Έμ³μ„œ 각 κΈ€μž μš”μ†Œλ“€μ˜ λ³€ν˜•μ„ λͺ¨λ‘ νŒŒμ•…ν•˜μ—¬μ„œ 비속어 단어 λͺ©λ‘μ„ κ΅¬μ„±ν•©λ‹ˆλ‹€. ν•΄λ‹Ή λ‚΄μš©μ€ ν•˜λ‹¨μ— Bias κ΅¬μ„±λž€ μ—μ„œ μžμ„Ένžˆ μ„€λͺ…ν•©λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ 상 탐지 μ•Œκ³ λ¦¬μ¦˜ ꡬ성

Tetrapod.js μ—μ„œ μ‚¬μš©ν•˜λŠ” 비속어 탐지 μ•Œκ³ λ¦¬μ¦˜μ˜ 진행과정은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

정상 단어 탐색 ν›„ 배제

  • λ©”μ‹œμ§€μ—μ„œ 정상단어λ₯Ό μ°Ύμ•„μ„œ ν•΄λ‹Ή λ¬Έμžμ—΄μ˜ μ‹œμž‘ μœ„μΉ˜μ™€ λλ‚˜λŠ” μœ„μΉ˜λ₯Ό κΈ°λ‘ν•©λ‹ˆλ‹€. ν•΄λ‹Ή λ¬Έμžμ—΄ λ²”μœ„λŠ” 이후 μ•Œκ³ λ¦¬μ¦˜ νƒμ§€μ‹œ λ²”μœ„μ—μ„œ λ°°μ œλ©λ‹ˆλ‹€.

λ©”μ‹œμ§€μ˜ 15μžλ‹¨μœ„ 뢄리

  • λͺ¨λ“  λ¬Έμžμ—΄μ€ 15자 λ‹¨μœ„μ˜ 청크 λ©”μ‹œμ§€ 둜 λΆ„λ¦¬λ©λ‹ˆλ‹€.

ν•œ κΈ€μžμ”© 비속어 단어 탐색

  • κ°–μΆ”κ³  μžˆλŠ” λͺ¨λ“  비속어 문자λ₯Ό κΈ€μžλ‹¨μœ„λ‘œ λͺ¨λ‘ λΆ„λ¦¬ν•©λ‹ˆλ‹€. κ·Έ ν›„ 청크 λ©”μ‹œμ§€μ— ν•΄λ‹Ή 비속어 문자의 κΈ€μžκ°€ μ‘΄μž¬ν•˜λŠ”μ§€, λͺ‡λ²ˆμ§Έ μœ„μΉ˜μ— μ‘΄μž¬ν•˜λŠ”μ§€λ₯Ό νŒŒμ•…ν•©λ‹ˆλ‹€.
  • λ§Œμ•½ λ¬Έμžλ“€μ΄ λͺ¨λ‘ μ‘΄μž¬ν•  경우 ν•΄λ‹Ή λ¬Έμžλ“€μ˜ μœ„μΉ˜λ₯Ό ν•΄λ‹Ή 비속어 λ‹¨μ–΄μ˜ κΈ€μžμˆœμ„œλŒ€λ‘œ μ •λ ¬ν•©λ‹ˆλ‹€. μ΄λ•Œ λ§Œμ•½ μˆœμ„œκ°€ μΌκ΄€λ˜μ§€ μ•Šλ‹€λ©΄ κΈ€μžκ°€ μ„žμ—¬μžˆλŠ” κ²ƒμœΌλ‘œ κ°„μ£Όν•©λ‹ˆλ‹€.
  • λ§Œμ•½ κΈ€μžκ°€ μ„žμ—¬μžˆλŠ” 경우 비속어 λ‹¨μ–΄μ˜ 사이에 μ™„μ„±λœ ν•œκΈ€ λ¬Έμžκ°€ μ‘΄μž¬ν•˜λŠ”μ§€λ₯Ό ν™•μΈν•˜κ³  μ‘΄μž¬ν•œλ‹€λ©΄ 이λ₯Ό 비속어 λͺ©λ‘μ—μ„œ μ œμ™Έν•©λ‹ˆλ‹€. (γ„±, γ…™ λŠ” μ™„μ„±λœ ν•œκΈ€μ΄ μ•„λ‹ˆλ©° μ™„μ„±λœ ν•œκΈ€μ€ μœ λ‹ˆμ½”λ“œλ‘œ κ°€(0xAC00) ~ 힣(0xD7A3) μ‚¬μ΄μ˜ κΈ€μžλ₯Ό λœ»ν•©λ‹ˆλ‹€.) λ˜ν•œ μ™„μ„±ν˜• κΈ€μžμ΄λ”λΌλ„ 자음이 γ…‡ μΈκ²½μš°μ—λŠ” 비속어 μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 예: λ°”μ•„μ•„λ³΄μ˜€ 와 같이 μ΄μ–΄μ£ΌλŠ” 음의 경우 비속어 μ²˜λ¦¬κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

Bias 데이터 포멧

  • 비속어 λ‹¨μ–΄λŠ” μŒμš΄λ§ˆλ‹€ 발음이 μ•½κ°„μ”© λ‹¬λΌμ§€κ±°λ‚˜ λͺ¨μ–‘이 μ•½κ°„μ”© λ‹¬λΌμ§€λŠ” λ³€ν˜• 단어가 νŒŒμƒλ  수 μžˆμœΌλ―€λ‘œ, 각 μŒμš΄λ³„λ‘œ λͺ¨λ“  λ³€ν˜• κ°€λŠ₯ν•œ 쑰합을 μ•Œμ•„λ‚΄μ•Όν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό λͺ…ν™•ν•˜κ²Œ νŒŒμ•…ν•˜κΈ° μœ„ν•΄μ„œ λͺ¨λ“  음운과 음절, μ–΄μ ˆμ— 쓰일 수 μžˆλŠ” ꡬ쑰λ₯Ό 1차원 λ°°μ—΄ λ˜λŠ” 2차원 λ°°μ—΄λ‘œ ν‘œν˜„ν•˜μ—¬μ„œ λ³€ν˜•κ΅¬μ‘°λ₯Ό μ–΄μ ˆλ‹¨κ³„μ—μ„œ νŒŒμ•…ν•  수 μžˆλŠ” μ–΄λ– ν•œ 데이터 ꡬ쑰가 ν•„μš”ν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄μ„œ 개발된 데이터 ꡬ쑰가 Bias 데이터 ν¬λ©§μž…λ‹ˆλ‹€.

RecursiveList

  • Bias 데이터 포멧은 필터에 μ‚¬μš©λ  비속어λ₯Ό 2차원 배열을 μ€‘μ²©ν•΄λ‚˜κ°€λ©΄μ„œ 쑰합될 λ‹¨μ–΄μ˜ λͺ©λ‘μ„ ꡬ성할 수 있게 λ•μŠ΅λ‹ˆλ‹€. 2차원 배열은 before+after ꡬ쑰둜, 각 차원 데이터가 ν•©μ³μ Έμ„œ 단어λ₯Ό κ΅¬μ„±ν•˜κ²Œ λ©λ‹ˆλ‹€. 이λ₯Ό RecursiveList 라고 ν•˜λ©° λ‹€μŒκ³Ό 같은 μ˜ˆμ‹œν˜•νƒœλ‘œ ꡬ성될 수 μžˆμŠ΅λ‹ˆλ‹€.
2차원 λ°°μ—΄ μ˜ˆμ‹œ
let data = [[
    "λ°”",
    "ba"
],[
    "보",
    "bo"
]]
let result = Bias.recursiveList(data)
let resultCheck = [
    "바보",
    "λ°”bo",
    "ba보",
    "babo"
]
console.log(result == resultCheck)
// true
μ€‘μ²©λœ 2차원 λ°°μ—΄ μ˜ˆμ‹œ

RecursiveList λ‘œλŠ” 자음과 λͺ¨μŒμ˜ λ³€ν˜•κ³Όμ •μ„ μ„ΈλΆ„ν™”ν•΄μ„œ λͺ…μ‹œν•˜λŠ”λ° μ ν•©ν•œ ꡬ쑰λ₯Ό κ°–μΆ”κ³  μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 자음 λͺ¨μŒμ„ ν•©μ„±ν•΄μ„œ μ™„μ„±λœ ν•œκΈ€λ¬Έμžλ‘œ ν•©μΉœλ‹€λ˜μ§€, 자음과 λͺ¨μŒμ„ μž¬ν™œμš©ν•  수 μžˆλŠ” μ–΄λ– ν•œ κ΅¬μ‘°λŠ” RecursiveComponent μ—μ„œ λ‹€λ£Ήλ‹ˆλ‹€.

let data = [[
    [[
        'γ…‚',
        'γ…ƒ'
    ],[
        'ㅏ',
        'γ…‘'
    ]],
    "ba"
],[
    "보",
    "bo"
]]
let result = Bias.recursiveList(data)
let resultCheck = [
    "ㅂㅏ보",
    "ㅂㅑ보",
    "ㅃㅏ보",
    "ㅃㅑ보",
    "ㅂㅏbo",
    "γ…‚γ…‘bo",
    "ㅃㅏbo",
    "γ…ƒγ…‘bo",
    "ba보",
    "babo"
]
console.log(result == resultCheck)
// true

RecursiveComponent

RecursiveComponent λŠ” RecursiveList 의 μž¬μ‚¬μš©μ„±μ„ 높이고 λ°°μ—΄ μƒμ—μ„œ μ‚¬μš©κ°€λŠ₯ν•œ 뢀가적인 ν•¨μˆ˜κ°œλ…μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

λ³€μˆ˜ 및 μ½”λ“œ 뢄리

RecursiveComponent λŠ” λ³€μˆ˜μ™€ μ½”λ“œκ°€ μ‘΄μž¬ν•˜λ©°, 자음과 λͺ¨μŒ 같이 ν•œκΈ€λ¬Έμžμ˜ μ΅œμ†Œ λ‹¨μœ„μΈ 음운 을 RecursiveList 둜 ν‘œν˜„ν•  λ•Œ μž¬ν™œμš©μ„±μ„ 높이기 μœ„ν•΄μ„œ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©°, ν•΄λ‹Ή μŒμš΄λ“€λ‘œ μ–΄λ– ν•œ μ΅œμ’…μ μΈ μŒμ ˆμ„ ꡬ성할 λ•Œ μ½”λ“œ λ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€.

자유둜운 JSON νŒŒμΌκ΅¬μ„±

RecursiveComponent λ₯Ό ꡬ성할 λ•Œ ν•œκ΅­μ–΄μ˜ 경우 음운, 음절, μ–΄μ ˆ 의 ν˜•νƒœλ‘œ ꡬ성될 수 μžˆμ§€λ§Œ, ν–₯ν›„ 개발 κ³Όμ •μ—μ„œ μƒˆλ‘œμš΄κ΅¬μ‘°κ°€ ν•„μš”ν•˜κ±°λ‚˜, μ°¨ν›„ λ‹€λ₯Έ 언어에 ν™•μž₯ν˜•νƒœλ‘œ λ‹€λ₯Έ ꡬ쑰λ₯Ό μ·¨ν•΄μ•Όν•  κ°€λŠ₯성이 μžˆκΈ°μ—, 보닀 μœ μ—°ν•˜κ²Œ 데이터λ₯Ό 뢄리해야할 ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄μ„œ JSON ν˜•νƒœλ‘œ 데이터λ₯Ό ν‘œν˜„ν•  수 있게 ν—ˆμš©ν•˜κ³  있으며, JSON λ°μ΄ν„°λŠ” ν•΄λ‹Ή μ†ŒμŠ€ν΄λ” μ•ˆμ—λ§Œ μžˆλ‹€λ©΄ 내뢀에 μ–Όλ§ˆλ‚˜ μ€‘μ²©λœ ν΄λ”μ•„λž˜μ— JSON파일이 μ‘΄μž¬ν•˜λ˜, μ–΄λ–€ μ΄λ¦„μœΌλ‘œ 폴더가 μ‘΄μž¬ν•˜λ˜, μ–΄λ–€ μ΄λ¦„μœΌλ‘œ JSON 파일이 μ‘΄μž¬ν•˜λ˜ 이λ₯Ό λͺ¨λ‘ μˆ˜μ§‘ν•΄μ„œ ꡬ성할 수 μžˆκ²Œλ” RecursiveComponent λ₯Ό κ΅¬μ„±ν•˜μ˜€κ³ , 이λ₯Ό ν†΅ν•΄μ„œ 자유둭게 데이터 λͺ…μΉ­ λΆ€μ—¬λ₯Ό ν•˜κ³  자유둜운 데이터 μΉ΄ν…Œκ³ λ¦¬ λΆ€μ—¬κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

JSONλ‚΄μ—μ„œμ˜ λ³€μˆ˜ ꡬ성 예

JSON μ—μ„œ 객체λ₯Ό ν•˜λ‚˜ 생성후 κ·Έ μ•ˆμ— var λΌλŠ” μ΄λ¦„μ˜ 객체λ₯Ό ν•˜λ‚˜ λ‹΄μœΌλ©΄, κ·Έ var 객체 μ•ˆμ— λ³€μˆ˜λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. ν•œκ΅­μ–΄ λ°μ΄ν„°μ˜ κ²½μš°μ—” 이λ₯Ό ν†΅ν•΄μ„œ 음운 데이터λ₯Ό κ΅¬μ„±ν•˜λ©°, 이 κ³Όμ •μ—μ„œ ν•œ 음운의 λ°œμŒλ³€ν˜• κ³Ό λͺ¨μ–‘λ³€ν˜• 데이터λ₯Ό RecursiveComponent 둜 λͺ¨λ‘ κ΅¬μ„±ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ κ΅¬μ„±λœ γ…‚ 의 음운 데이터화 μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

{
    "var": {
        "γ…‚_λ°œμŒλ³€ν˜•": [
            "γ…‚",
            "γ…ƒ",
            "ㅍ"
        ],
        "γ…‚_λͺ¨μ–‘λ³€ν˜•": [
            "γ…‚",
            "γ…ƒ",
            "ㅍ",
            "b",
            "f"
        ]
    }
}
JSONλ‚΄μ—μ„œ λ³€μˆ˜ κ°„ μ°Έμ‘°

JSON ν˜•νƒœλ‘œ Bias 데이터λ₯Ό ꡬ성할 λ•Œ λ³€μˆ˜λ₯Ό ꡬ성할 수 μžˆλŠ”λ°, 이 λ³€μˆ˜ λ‚΄μ—μ„œ λ‹€λ₯Έ λ³€μˆ˜λ₯Ό μ¨μ•Όν•˜λŠ” 상황이 생길 수 μžˆμŠ΅λ‹ˆλ‹€. ν•œκ΅­μ–΄λŠ” 주둜 음절 데이터 κ΅¬μ„±μ‹œ 음운 λ³€μˆ˜λ₯Ό λΆˆλŸ¬μ™€μ•Όν•¨κ³Ό λ™μ‹œμ— μžμ‹ λ„ λ³€μˆ˜μ—¬μ•Όν•˜λŠ” 상황이 λ°œμƒν•˜λŠ”λ°, 이런 상황을 μœ„ν•΄μ„œ λ³€μˆ˜κ°€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλ„λ‘ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. λ³€μˆ˜λŠ” RecursiveList λ₯Ό μ‚¬μš©ν• λ•Œ μš”μ†Œ μ•žμ— *λ₯Ό λΆ™μ—¬μ„œ μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή μœ„μΉ˜μ— λ³€μˆ˜ 데이터가 μ°Έμ‘°λ©λ‹ˆλ‹€. 음절 데이터 ꡬ성 μ‹œ

λ³€μˆ˜κ°„ μ°Έμ‘° 및 ν•¨μˆ˜ μ‚¬μš© μ˜ˆμ‹œ
{
    "var": {
        "μ‹œ": [
            {
                "type": "단어병합",
                "data": [[
                    "*γ……_λͺ¨μ–‘λ³€ν˜•"
                ], [
                    ""
                ]]
            },

            {
                "type": "자λͺ¨ν•©μ„±",
                "data": [
                    [
                        "γ……",
                        "γ…†"
                    ], [
                        "*γ…£_λ°œμŒλ³€ν˜•"
                    ]
                ],
                "exclude": ["μ‡ "]
            }
        ]
    }
}

ν•΄λ‹Ή 비속어 탐지 μ²΄κ³„μ˜ ν•œκ³„

ν•΄λ‹Ή ν”„λ‘œμ νŠΈλŠ” λ¬Έλ§₯을 μ΄ν•΄ν•˜κ³  λ¬Έλ§₯μƒμ—μ„œ μ–΄λ– ν•œ 단어가 λΆ€μ μ ˆν•œ μ˜λ„λ‘œ μ‚¬μš©λ˜μ—ˆλŠ”μ§€, ν‘œν˜„μ˜λ„ λ₯Ό νŒλ‹¨ν•˜μ§€λŠ” λͺ»ν•©λ‹ˆλ‹€.

  • 단어상 λ™μŒμ΄μ˜μ–΄λ‘œ ν‘œν˜„ 상 ꡬ별점이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우
    • 2016λ…„ 병신년(δΈ™η”³εΉ΄)μ—λŠ” μ΄λŸ¬ν•œ 일이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
  • 정상단어λ₯Ό μ˜λ„κ°€ λΆˆμˆœν•˜κ²Œ μ‚¬μš©ν•˜λŠ” 경우
    • λ„ˆλŠ” μ–΄λ¨Έλ‹ˆκ°€ μ—†κ΅¬λ‚˜
  • λΉ„μ†μ–΄λ‘œ μ˜€ν•΄κ°€λŠ₯ν•œ 정상단어λ₯Ό μ˜λ„κ°€ λΆˆμˆœν•˜κ²Œ μ‚¬μš©ν•˜λŠ” 경우
    • λ„ˆκ°€ μ‹œλ°œμ μ΄μ•Ό 이 μ‹œλ°œμ μ•„!

개발 λͺ©ν‘œ

  • [x] κ΅­λ¦½κ΅­μ–΄μ›μ—μ„œμ˜ ν•œκ΅­μ–΄ 정상 단어 λͺ©λ‘ 확보
  • [x] 인터넷 μƒμ—μ„œ μ“°μ΄λŠ” 비속어 데이터 1μ°¨ μˆ˜μ§‘
  • [x] λ¬Έμžμ—΄ μƒμ—μ„œ 정상단어λ₯Ό μ°Ύμ•„μ„œ λͺ¨λ“  정상단어 μœ„μΉ˜λ₯Ό νŒŒμ•…ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜
  • [x] κΈ€μžλ‹¨μœ„ 비속어 단어 탐지 μ•Œκ³ λ¦¬μ¦˜
  • [x] λ’€μ§‘νžˆκ±°λ‚˜ λ’€μ„žμΈ 비속어 단어 ν‘œν˜„μ˜ 경우 μ‚¬λžŒμ΄ 인지 κ°€λŠ₯ν•œ μˆ˜μ€€λ§Œμ„ λΉ„μ†μ–΄λ‘œ μ„ μ •ν•΄μ„œ μ°¨λ‹¨ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ μΆ”κ°€
  • [x] 비속어단어 λ§Œμ„ μ‚­μ œν•˜κ±°λ‚˜ νŠΉμ • 특수문자둜 λŒ€μΉ˜ν•˜λŠ” ν‘œν˜„ μ •μ • ν•¨μˆ˜
  • [x] 비속어 λ‹¨μ–΄μ˜ λ³€ν˜• 예λ₯Ό 음운, 음절, μ–΄μ ˆ 3λ‹¨κ³„λ‘œ λ‚˜λˆ„μ–΄μ„œ μ •λ¦¬ν•΄λ‚˜κ°ˆ 수 μžˆλŠ” λΆ„ν• λœ JSON 기반 파일 데이터 병합 체계
  • [x] λ°°μ—΄ν˜•νƒœλ‘œ 단어λ₯Ό μ „/ν›„ κ°’μœΌλ‘œ λ‚˜λˆ μ„œ ꡬ성할 수 μžˆλŠ” Bias 데이터 포멧 (예: λ°”λ₯Ό γ…‚/ㅏ 둜 λ‚˜λˆ„μ–΄μ„œ ν‘œν˜„ν•  수 있게 ν•˜λŠ” 체계λ₯Ό λœ»ν•©λ‹ˆλ‹€.)
  • [x] n차원 ν˜•νƒœλ‘œ μ€‘μ²©μ‹œν‚¬ 수 μžˆλŠ” Bias 데이터 포멧 ꡬ성 (λ°”/보 λΌλŠ” λ‹¨μ–΄μ˜ λ³€ν˜• 예λ₯Ό λͺ¨λ‘ κ΅¬ν• λ•Œ, λ³„λ„λ‘œ μ‘΄μž¬ν•˜λŠ” γ…‚/ㅏ 와 γ…‚/γ…— 데이터λ₯Ό μ—°κ²°μ‹œμΌœμ„œ κ΅¬μ„±μ‹œν‚¬ 수 μžˆλŠ” 체계λ₯Ό λœ»ν•©λ‹ˆλ‹€.)
  • [x] nμ°¨μ›μ˜ 데이터λ₯Ό 병합할 수 μžˆλŠ” Bias 데이터 포멧
  • [x] Bias 데이터 ν¬λ©§μ—μ„œμ˜ 음절 λ³€μˆ˜
  • [x] Bias 데이터 ν¬λ©§μ—μ„œμ˜ μ‘μš© ν•¨μˆ˜
  • [x] Bias 데이터 ν¬λ©§μ—μ„œμ˜ 자λͺ¨ν•©μ„± ν•¨μˆ˜
  • [x] Bias 데이터 ν¬λ©§μ—μ„œμ˜ 결과배제 ν•¨μˆ˜
  • [x] Bias 데이터 ν¬λ©§μ—μ„œ ν…ŒμŠ€νŠΈ 쀑 μ€‘λ³΅μƒμ„ λœ 단어 탐지 및 μ‚­μ œ ν•„ν„°
  • [ ] 1μ°¨ μˆ˜μ§‘λœ 비속어 λ°μ΄ν„°μ˜ Bias μž¬ν•΄μ„
  • [ ] LZString 을 ν†΅ν•œ Bias λ°μ΄ν„°μ˜ minify ν™” 및 μ••μΆ• μΆ”μΆœ 및 λ©”λͺ¨λ¦¬ λ‘œλ“œ 체계
  • [ ] 전체 비속어 단어 λͺ©λ‘μ„ 사전에 μ €μž₯ν•˜λŠ” ν˜•νƒœκ°€ μ•„λ‹Œ, 비속어 단어 탐지가 λ°œμƒν• λ•Œ ν•΄λ‹Ή 단어 λͺ©λ‘μ„ μ‹€μ‹œκ°„μœΌλ‘œ κ΅¬μ„±ν•˜μ—¬μ„œ μ“°λ‹€κ°€, 이λ₯Ό λ©”λͺ¨λ¦¬μƒμ— LRU 캐싱 해놓고 μ”€μœΌλ‘œ 전체 데이터 μš©λŸ‰μ„ μ€„μ΄λŠ” 동적인 Bias 데이터 해석 체계
  • [ ] 청크 λ©”μ‹œμ§€μ˜ 15자->30자 ν™•λŒ€ 및, 청크 λ©”μ‹œμ§€κ°€ 연속될 경우, μ€‘κ°„μ˜ 15자끼리 μ΄μ–΄μ„œ μƒˆλ‘œμš΄ μ²­ν¬λ©”μ‹œμ§€λ₯Ό μž„μ˜λ‘œ λ§Œλ“€μ–΄μ„œ 검사λ₯Ό λŒλ¦¬λŠ” 보완체계 (청크 λ©”μ‹œμ§€ 사이에 κ±Έλ €μ„œ 필터링 λ˜μ§€ μ•ŠλŠ” μ˜ˆμ™Έ 상황 ν•΄κ²°)
  • [ ] 청크 λ©”μ‹œμ§€μ—μ„œ 비속어 λ‹¨μ–΄μ˜ κΈ€μžκ°€ λ©”μ‹œμ§€ 상에 μžˆλŠ”μ§€ 확인할 λ•Œ μ€‘μ²©μ μœΌλ‘œ μ‘΄μž¬ν•˜λŠ” κΈ€μžκ°€ μ‘΄μž¬ν•˜λŠ” 경우, 이λ₯Ό λͺ¨λ‘ μˆ˜μ§‘ν•œ ν›„ λͺ¨λ“  경우수λ₯Ό λ‹€ κ³„μ‚°ν•΄μ„œ 비속어 κ²€μ‚°ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„
  • [ ] 검색엔진 기반 μ›Ή 크둀링을 ν†΅ν•œ 비속어 νƒμ§€μ‹œλ„ 및 λ³€ν˜•λ‹¨μ–΄ μˆ˜μ§‘μ‹œλ„
  • [ ] ν…ŒμŠ€νŠΈ νŽ˜μ΄μ§€ 및 ν…ŒμŠ€νŠΈ μ„œλ²„ ꡬ성
  • [ ] gpu.js 쉐이더 기반의 GPU 병렬 μ—°μ‚° 가속화 κ΅¬ν˜„ (λͺ¨λ“  μ²­ν¬λ©”μ‹œμ§€λ₯Ό 숫자 λ°°μ—΄ν™” ν•œ ν›„ 코어단에 이λ₯Ό 곡유된 λ©”λͺ¨λ¦¬ ν˜•νƒœλ‘œ μ „λ‹¬ν•˜κ³ , 숫자 λ°°μ—΄ν™” 된 비속어 λ¬Έμžλ“€μ„ μ½”μ–΄μ—κ²Œ μ „λ‹¬ν•˜λ©΄ 이λ₯Ό λͺ¨λ“  μ½”μ–΄ ν•˜λ‚˜ν•˜λ‚˜κ°€ 각각의 μˆ«μžλ°°μ—΄ 일치 유무λ₯Ό νŒŒμ•…ν•˜λŠ” ꡬ쑰)