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-klleon

v1.0.7

Published

😊 Improved swear word detection module, made by hmmhmmhmm, arranged by utolee90

Downloads

19

Readme

Tetrapod.js var1

이 ν”„λ‘œμ νŠΈλŠ” λ³€ν˜•λœ μš•μ„€ 단어λ₯Ό νŒŒμ•…ν•˜κ³  νƒμ§€ν•˜λŠ” 것을 λͺ©μ μœΌλ‘œ ν•˜λŠ” λͺ¨λ“ˆλ‘œ, Github μœ μ € hmmhmmhmm의 Tetrapod ν”„λ‘œμ νŠΈλ₯Ό ν¬ν¬ν•œ 뒀에 μˆ˜μ •ν•œ λͺ¨λ“ˆμž…λ‹ˆλ‹€. μ‚¬μš©μž Utolee90이 일뢀 λ‚΄μš©μ„ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

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

ν”„λ‘œμ νŠΈ μš©λ„

이 ν”„λ‘œμ νŠΈλŠ” (μ£Ό)ν΄λ ˆμ˜¨μ—μ„œ μ œκ³΅ν•˜λŠ” μ˜μƒ 곡유 SNS Kamelo μ—μ„œ ν™œμš©ν•  μ˜ˆμ •μž…λ‹ˆλ‹€.

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

핡심 λͺ¨λ“ˆμ€ MIT Licensed. μ›λ³Έμ˜ λΌμ΄μ„ μŠ€λ₯Ό κ·ΈλŒ€λ‘œ λ”°λ¦…λ‹ˆλ‹€. λ‹€λ§Œ μš•μ„€ 감지 λ°μ΄ν„°λŠ” λ³΄μ•ˆμ‚¬ν•­μœΌλ‘œ κ³΅κ°œλ˜μ§€ μ•Šμ„ μ˜ˆμ •μž…λ‹ˆλ‹€.

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

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

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

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

μš•μ„€λ‹¨μ–΄ λͺ©λ‘ ꡬ성

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

(μΆ”κ°€) μ €μ†ν•œ 단어 λͺ©λ‘ ꡬ성

  • μš•μ„€λ‘œ λΆ„λ₯˜ν•˜κΈ° μ• λ§€ν•˜μ§€λ§Œ μ €μ†ν•œ ν‘œν˜„μ„ κ²€μΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. μš•μ„€λ‹¨μ–΄μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ λ‹¨μˆœνžˆ 리슀트만 μ“Έ 뿐 μ•„λ‹ˆλΌ 이차원 배열을 ν†΅ν•œ μ‘°ν•©μœΌλ‘œλ„ μœ λ„ κ°€λŠ₯ν•©λ‹ˆλ‹€.

(μΆ”κ°€) νŠΉμ •ν•œ 받침을 μ•…μš©ν•œ 단어 검색

  • γ…‚γ……, ㄹㅁ, γ„Ήγ„± 받침을 λ‚¨μš©ν•œ ν‘œν˜„μ„ μž‘μ•„λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

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

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

정상 단어 탐색 ν›„ 배제

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

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

  • λͺ¨λ“  λ¬Έμžμ—΄μ„ μž„μ˜μ˜ κΈ€μž λ‹¨μœ„μ˜ 청크 λ©”μ‹œμ§€ 둜 λΆ„λ¦¬ν•΄μ„œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κΈ°λ³Έ λ‹¨μœ„λŠ” 15자이며, μžμ„Έν•œ 것은 μ•„λž˜ APIλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

ν•œ κΈ€μžμ”© μš•μ„€ 단어 탐색

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

ν•œμ˜μžλ‘œ 된 μš•μ„€ 탐지 (자체 μΆ”κ°€κΈ°λŠ₯)

  • 자체적인 ν•œμ˜λ³€ν™˜ 맡을 μ΄μš©ν•΄μ„œ ν•œ/영 λ³€ν™˜μ„ μ΄μš©ν•œ λ©”μ‹œμ§€μ—λ„ μš•μ„€μ„ 탐지할 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ wlfkfμ΄λΌλŠ” λ©”μ‹œμ§€λŠ” QWERTY μ˜μžνŒμ— λŒ€μ‘λ˜λŠ” ν•œκΈ€ λ‘λ²Œμ‹ 자판의 ν‚€λ₯Ό μž…λ ₯ν•˜λ©΄ μ§€λž„μ΄λΌλŠ” λ©”μ‹œμ§€κ°€ λ‚˜νƒ€λŠ”λ°, μ΄λŸ¬ν•œ μš•μ„€μ„ 감지할 수 μžˆμŠ΅λ‹ˆλ‹€.

개발 μ„±κ³Ό

원 ν”„λ‘œμ νŠΈμ—μ„œ κ΅¬ν˜„λœ λͺ©ν‘œλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.

  • [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 데이터 ν¬λ©§μ—μ„œ ν…ŒμŠ€νŠΈ 쀑 μ€‘λ³΅μƒμ„ λœ 단어 탐지 및 μ‚­μ œ ν•„ν„°
  • [ ] Bias 데이터 포멧의 단어 μžλ™ λ³€ν˜• νŒŒμ•… κ°œλ… μΆ”κ°€ (만λŠ₯λ³€ν˜•μΈμž)
  • [ ] 1μ°¨ μˆ˜μ§‘λœ μš•μ„€ λ°μ΄ν„°μ˜ Bias μž¬ν•΄μ„
  • [ ] Bias 데이터 포멧의 νŒ¨ν‚€μ§€ κ°œλ… μΆ”κ°€ (μš•μ„€λ‹¨μ–΄ / 성적단어 / 폭λ ₯성단어 / 약물성단어)
  • [ ] LZString 을 ν†΅ν•œ Bias λ°μ΄ν„°μ˜ minify ν™” 및 μ••μΆ• μΆ”μΆœ 및 λ©”λͺ¨λ¦¬ λ‘œλ“œ 체계
  • [ ] 전체 μš•μ„€ 단어 λͺ©λ‘μ„ 사전에 μ €μž₯ν•˜λŠ” ν˜•νƒœκ°€ μ•„λ‹Œ, μš•μ„€ 단어 탐지가 λ°œμƒν• λ•Œ ν•΄λ‹Ή 단어 λͺ©λ‘μ„ μ‹€μ‹œκ°„μœΌλ‘œ κ΅¬μ„±ν•˜μ—¬μ„œ μ“°λ‹€κ°€, 이λ₯Ό λ©”λͺ¨λ¦¬μƒμ— LRU 캐싱 해놓고 μ”€μœΌλ‘œ 전체 데이터 μš©λŸ‰μ„ μ€„μ΄λŠ” 동적인 Bias 데이터 해석 체계
  • [x] 청크 λ©”μ‹œμ§€μ—μ„œ 청크 쀑간에 μš•μ„€μ΄ 걸릴 λ•Œ 감지 보완. (Half-nodeλ₯Ό μ΄μš©ν•΄ 쀑간에 λ…ΈνŠΈ 끊기둜 λ³΄μ™„ν–ˆμŒ.)
  • [x] 청크 λ©”μ‹œμ§€μ—μ„œ μš•μ„€ λ‹¨μ–΄μ˜ κΈ€μžκ°€ λ©”μ‹œμ§€ 상에 μžˆλŠ”μ§€ 확인할 λ•Œ μ€‘μ²©μ μœΌλ‘œ μ‘΄μž¬ν•˜λŠ” κΈ€μžκ°€ μ‘΄μž¬ν•˜λŠ” 경우, 이λ₯Ό λͺ¨λ‘ μˆ˜μ§‘ν•œ ν›„ λͺ¨λ“  경우수λ₯Ό λ‹€ κ³„μ‚°ν•΄μ„œ μš•μ„€ κ²€μ‚°ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„ (λΆ€λΆ„μ μœΌλ‘œ κ΅¬ν˜„)
  • [ ] 검색엔진 기반 μ›Ή 크둀링을 ν†΅ν•œ μš•μ„€ νƒμ§€μ‹œλ„ 및 λ³€ν˜•λ‹¨μ–΄ μˆ˜μ§‘μ‹œλ„
  • [ ] ν…ŒμŠ€νŠΈ νŽ˜μ΄μ§€ 및 ν…ŒμŠ€νŠΈ μ„œλ²„ ꡬ성
  • [ ] gpu.js 쉐이더 기반의 GPU 병렬 μ—°μ‚° 가속화 κ΅¬ν˜„ (λͺ¨λ“  μ²­ν¬λ©”μ‹œμ§€λ₯Ό 숫자 λ°°μ—΄ν™” ν•œ ν›„ 코어단에 이λ₯Ό 곡유된 λ©”λͺ¨λ¦¬ ν˜•νƒœλ‘œ μ „λ‹¬ν•˜κ³ , 숫자 λ°°μ—΄ν™” 된 μš•μ„€ λ¬Έμžλ“€μ„ μ½”μ–΄μ—κ²Œ μ „λ‹¬ν•˜λ©΄ 이λ₯Ό λͺ¨λ“  μ½”μ–΄ ν•˜λ‚˜ν•˜λ‚˜κ°€ 각각의 μˆ«μžλ°°μ—΄ 일치 유무λ₯Ό νŒŒμ•…ν•˜λŠ” ꡬ쑰)

μ‚¬μš©κ°€λŠ₯ν•œ ν•¨μˆ˜

Tetrapod.js

find.js νŒŒμΌμ— import Tetrapod from '../tetrapod';라고 μž…λ ₯ν•˜μ‹  뒀에 λ‹€μŒκ³Ό 같은 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. νŽΈμ˜μƒ 클래슀 λͺ…인 Tetrapod.(ν•¨μˆ˜λͺ…) ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

  • 비속어 쑴재 μ—¬λΆ€ νŒλ‹¨ : Tetrapod.isBad(message, includeSoft=false)

    1. message ν•­μ—λŠ” λ¬Έμžμ—΄μ„ μž…λ ₯ν•΄μ„œ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€. 결과값은 μ°Έ/거짓 쀑 ν•˜λ‚˜.
    2. includeSoft 뢀뢄에 trueλ₯Ό μž…λ ₯ν•˜λ©΄ 비속어뿐 μ•„λ‹ˆλΌ μ €μ†ν•œ ν‘œν˜„, λΆ€μ μ ˆν•œ 받침을 λ‚¨μš©ν•˜λŠ” ν‘œν˜„κΉŒμ§€ μ‘΄μž¬ν•˜λŠ”μ§€ 체크할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 비속어 갯수 μ„ΈκΈ° : Tetrapod.countBad(message, isStrong=false)

    1. message ν•­μ—λŠ” λ¬Έμžμ—΄μ„ μž…λ ₯ν•΄μ„œ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.
    2. 결과값은 {bad:(비속어 갯수),soft:(μ €μ†ν•œ ν‘œν˜„ 갯수),end:(λΆ€μ μ ˆν•œ λ°›μΉ¨ 갯수)} ν˜•μ‹μœΌλ‘œ 좜λ ₯λ©λ‹ˆλ‹€.
    3. isStrong값을 참으둜 μ§€μ •ν•˜λ©΄ λ‹€λ₯Έ 문자λ₯Ό ν•œκΈ€μžλͺ¨μ²˜λŸΌ μ΄μš©ν•΄μ„œ 우회적 ν‘œν˜„μ΄λ‚˜ (예: γ„±Hμƒˆ77|) 첫 자음 γ…‡, λ¬΄μ˜λ―Έν•œ λͺ¨μŒ γ…‘μ‚½μž… 및 λœμ†Œλ¦¬λ₯Ό μ΄μš©ν•œ μš°νšŒν‘œν˜„(λΈŒμ•„λ³΄ 썌끼)도 μž‘μ•„λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 비속어 ν‘œν˜„ 직접 μ°ΎκΈ° : Tetrapod.find(message, needMultipleCheck=false, splitCheck=15, qwertyToDubeol=false, stronger=false)

    1. message ν•­μ—λŠ” λ¬Έμžμ—΄μ„ 직접 μž…λ ₯ν•΄μ„œ μ‚¬μš©κ°€λŠ₯ν•©λ‹ˆλ‹€.
    2. 결과값은 {totalResult:[(비속어 단어 λͺ©λ‘)], softResult:[(μ €μ†ν•œ ν‘œν˜„ 단어 λͺ©λ‘)], endResult:[(λ°›μΉ¨ μ•…μš©ν•œ ν‘œν˜„ λͺ©λ‘)]} ν˜•μ‹μ˜ 였브젝트둜 좜λ ₯λ©λ‹ˆλ‹€.
    3. needMultiplecheckλ₯Ό true둜 μ§€μ •ν•˜λ©΄ 필터에 κ±Έλ¦¬λŠ” λͺ¨λ“  ν‘œν˜„μ„ μž‘μ•„λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
    4. splitCheckλ₯Ό μž„μ˜μ˜ 숫자(예 20)둜 μ§€μ •ν•˜λ©΄ μ§€μ •ν•œ 숫자만큼 λ¬Έμžμ—΄μ„ λ‚˜λˆˆ λ’€ λ‚˜λˆˆ μ‘°κ°λ“€λ§Œ μ‘°μ‚¬ν•©λ‹ˆλ‹€. 기본값은 15이며, 0을 μ§€μ •ν•˜λ©΄ λ¬Έμžμ—΄μ„ λ‚˜λˆ„μ§€ μ•Šκ³  전체 λ¬Έμžμ—΄μ„ κ²€μ‚¬ν•©λ‹ˆλ‹€. isStrong을 μ§€μ •ν•˜λ©΄ ν™œμ„±ν™”λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    5. qwertyToDubeolλ₯Ό true둜 μ§€μ •ν•˜λ©΄ ν•œ/μ˜μ „ν™˜λœ ν‘œν˜„μ„ μž‘μ•„λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ μ‹œλ°œμ˜ QWERTY에 λŒ€μ‘λ˜λŠ” ν‘œν˜„μΈ tlqkf을 μž‘μ•„λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
    6. isStrong을 true둜 μ§€μ •ν•˜λ©΄ λ‹€λ₯Έ 문자λ₯Ό ν•œκΈ€μžλͺ¨μ²˜λŸΌ μ΄μš©ν•˜λŠ” 우회적 ν‘œν˜„μ΄λ‚˜ 첫자음 γ…‡, λ¬΄μ˜λ―Έν•œ λͺ¨μŒ γ…‘μ‚½μž… 및 λœμ†Œλ¦¬λ₯Ό μ΄μš©ν•œ 우회 ν‘œν˜„λ„ μž‘μ•„λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 영자λ₯Ό ν•œκΈ€λ‘œ λ³€ν™”ν•΄μ„œ κ²€μ‚¬ν•˜λŠ” νŠΉμ„±μƒ μœ„μ˜ qwertyToDubeol와 같이 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • 비속어 ν‘œν˜„ 숨기기 : Tetrapod.fix(message, replaceCharacter, condition) ν˜•νƒœλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

    1. message ν•­μ—λŠ” μš•μ„€μ΄ λ“€μ–΄κ°„ λ¬Έμžμ—΄μ„ 직접 μž…λ ₯ν•΄μ„œ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.
    2. replaceCharacter ν•­μ—λŠ” μš•μ„€μ„ 숨길 λ•Œ μ‚¬μš©ν•˜λŠ” 문자λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. 기본값은 "*"μž…λ‹ˆλ‹€.
    3. condition ν•­μ—λŠ” qwertyToDubeol, antispoof, dropDouble μ˜΅μ…˜ 쀑 ν•˜λ‚˜λ₯Ό μΌ€ 수 μžˆμŠ΅λ‹ˆλ‹€. 기본은 {qwertyToDubeol:false, antispoof:false, dropDouble:false, fixSoft:false}으둜 λͺ¨λ‘ λΉ„ν™œμ„±ν™”λœ μƒνƒœμž…λ‹ˆλ‹€.
    4. ν˜„μž¬λŠ” condition에 μ˜΅μ…˜μ„ μΌ€ 경우 qwertyToDubeol(qwerty자판->λ‘λ²Œμ‹ 자판으둜 ν•œμ˜λ³€ν™˜ ν›„ ν…ŒμŠ€νŠΈ), antispoof(μœ μ‚¬μžμŒ, μœ μ‚¬λͺ¨μŒ μ „λΆ€ 자λͺ¨λ‘œ λ°”κΎΌ ν›„ ν…ŒμŠ€νŠΈ), dropDouble(γ…‡ λ“€μ–΄κ°€μ„œ 음 늘리기 λ“± μž‘μ•„λƒ„)으둜 바뀐 후에 μž‘μ•„λ‚Έ λ©”μ‹œμ§€λ§Œ 체크 κ°€λŠ₯ν•©λ‹ˆλ‹€. μ›λ¬Έμ—μ„œ κ΅μ •ν•˜λŠ” μ˜΅μ…˜μ€ ν˜„μž¬ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.
    5. condition 쑰건에 {fixSoft:true}라고 지정할 경우 비속어 뿐 μ•„λ‹ˆλΌ μ €μ†ν•œ ν‘œν˜„κ³Ό κ³Όλ„ν•œ κ²Ήλ°›μΉ¨ ν‘œν˜„λ„ μˆ¨κΉ€μ²˜λ¦¬κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • 비속어 ν‘œν˜„ 리슀트 뢈러였기 : Tetrapod.defaultLoadλ₯Ό μ‚¬μš©ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

  • νŒŒμ‹±ν•œ 비속어 ν‘œν˜„ 리슀트 μ €μž₯ν•˜κΈ° : Tetrapod.defaultSaveAllDataλ₯Ό μ‚¬μš©ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

JSON 파일 μž‘μ„±λ°©λ²•

기본적으둜 ./resource/dictionary 디렉토리에 μžˆλŠ” bad-words.json, normal-words.json, soft-search-words.json 이 μ„Έ νŒŒμΌμ„ κ²€μ‚¬ν•©λ‹ˆλ‹€.

  • bad-words.json - μ˜ˆμƒλ˜λŠ” 비속어λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. νŒŒμ‹±ν•  λ•Œ recursiveComponenent λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜κΈ°μ— [['λ°”','ba'],['보','bo']]처럼 μ•žλ‹¨μ–΄/λ’·λ‹¨μ–΄λ‘œ κ΅¬μ„±λœ κ΅¬μ„±μš”μ†Œλ„ μž‘μ„± κ°€λŠ₯ν•©λ‹ˆλ‹€.
    • badword : κΈ°λ³Έ 비속어 λͺ©λ‘
    • drug : μ•½λ¬Ό κ΄€λ ¨ 비속어 λͺ©λ‘
    • insult : λͺ¨μš•μ μΈ ν‘œν˜„ κ΄€λ ¨ 비속어 λͺ©λ‘
    • sexuality : 성적인 ν‘œν˜„ κ΄€λ ¨ 비속어 λͺ©λ‘
    • violence : 폭λ ₯적 ν‘œν˜„ κ΄€λ ¨ 비속어 λͺ©λ‘
    • macro : νŠΉμ • λ°˜λ³΅λ˜λŠ” νŒ¨ν„΄λ“€μ„ μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ €μž₯ν•  λ•ŒλŠ” "맀크둜λͺ…":[(λ§€ν¬λ‘œμ— ν¬ν•¨λœ 리슀트)] ν˜•μ‹μœΌλ‘œ μ‚¬μš©ν•˜μ‹œλ©΄ 되며, 맀크둜λ₯Ό μ‚¬μš©ν•  λ•Œμ—λŠ” 맀크둜 이름 μ•žμ— "*"ν‘œμ‹œλ₯Ό 뢙이면 λ©λ‹ˆλ‹€.
      • 맀크둜 μ˜ˆμ‹œ : {λ†ˆ:["λ†ˆ", "λ‡Έ", "λ„˜", "둬", "룜", "럼"]}
      • badword μž…λ ₯ν•  λ•Œ [[["개", "λ©μ²­ν•œ"], ["*λ†ˆ"]]]
      • νŒŒμ‹± κ²°κ³Ό :
    [
      "κ°œλ†ˆ",
      "κ°œλ‡Έ",
      "κ°œλ„˜",
      "개둬",
      "개룜",
      "개럼",
      "λ©μ²­ν•œλ†ˆ",
      "λ©μ²­ν•œλ‡Έ",
      "λ©μ²­ν•œλ„˜",
      "λ©μ²­ν•œλ‘¬",
      "λ©μ²­ν•œλ£œ",
      "λ©μ²­ν•œλŸΌ"
    ]
    
  • normal-words.json - μ˜ˆμƒλ˜λŠ” 정상 단어λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. tetrapod ν”„λ‘œμ νŠΈλŠ” λ©”μ‹œμ§€μ—μ„œ μ •μƒλ‹¨μ–΄λ‘œ μ˜ˆμƒλ˜λŠ” μœ„μΉ˜μ—μ„œλŠ” κ²€μ‚¬ν•˜μ§€ μ•ŠλŠ” λ°©μ‹μž…λ‹ˆλ‹€. 정상단어에 λͺ¨μš•μ  ν‘œν˜„μ΄ 뢙은 경우 이 뢀뢄을 κ°μ§€ν•˜μ§€ μ•ŠκΈ° μœ„ν•œ μ˜ˆμ™Έ λͺ©λ‘μ„ μΆ”κ°€ν•˜λ €λ©΄ exception 뢀뢄에 리슀트λ₯Ό μΆ”κ°€ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.
  • soft-search-words.json - μ˜ˆμƒλ˜λŠ” μ €μ†ν•œ ν‘œν˜„μ„ μ €μž₯ν•©λ‹ˆλ‹€. 단어λͺ©λ‘μ„ νŒŒμ‹±ν•  λ•Œ recursiveComponent λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. λΉ„μ†μ–΄λ‘œ 보기 μ• λ§€ν•˜μ§€λ§Œ μ €μ†ν•œ ν‘œν˜„μ΄λΌ μ—¬κΈ°λŠ” ν‘œν˜„μ„ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 기본적으둜 μ €μ†ν•œ ν‘œν˜„μ€ μž‘μ§€ μ•Šμ§€λ§Œ μ˜΅μ…˜μ„ μ£Όμ–΄μ„œ μ €μ†ν•œ ν‘œν˜„λ„ μž‘μ•„λ‚Ό 수 있게 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μž‘μ„±μš© 기호

ν•œκΈ€ 단어 이외에 *, !, ?등을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • 맀크둜용 문자. μ•žμ—μ„œ 뢙일 λ•Œμ—λ§Œ μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • * 맀크둜 μ‚¬μš©ν•  λ•Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ£Όμ˜ν•  점은 맀크둜 이름은 띄어쓰기λ₯Ό ν•΄μ„œλŠ” μ•ˆ 되며, λ¦¬μŠ€νŠΈμ— λ…λ¦½λœ 단어 ν˜•μ‹μœΌλ‘œ λ“€μ–΄κ°€μ•Ό ν•©λ‹ˆλ‹€.
  • λŒ€μ²΄ 문자 - κΈ€μž 뒀에 문자λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. κΈ€μž ν•˜λ‚˜λ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • ! μ•žμ— μ˜€λŠ” κΈ€μžμ— λŒ€ν•΄ λ³€ν˜•νŒ¨ν„΄λ“€μ„ λͺ¨λ‘ κ°μ§€ν•©λ‹ˆλ‹€. Tetrapod.isKindChar ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ λ³€ν˜• νŒ¨ν„΄μ„ μž‘μ•„λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ μ‹œ!의 경우 γ……μ˜ λœμ†Œλ¦¬μΈ γ…†μ΄λ‚˜ ㅣ와 발음이 μœ μ‚¬ν•œ 이쀑λͺ¨μŒμΈ γ…Ÿ, γ…’λ‘œ λ³€ν˜•λœ κΈ€μžλ„ μž‘μ•„λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
    • + μž„μ˜μ˜ 받침을 ν‘œν˜„ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ "μ‹œ+"λŠ” "μ‹œ,식,μ‹Ÿ,..."등을 λͺ¨λ‘ ν¬ν•¨ν•©λ‹ˆλ‹€.
  • μ•„λ¬΄κ°œ 문자 - κΈ€μž 뒀에 문자λ₯Ό μ•„λ¬΄κ±°λ‚˜ ν‘œν˜„ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. λ¬΄μ œν•œμœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • ? μ•žμ— μ˜€λŠ” κΈ€μžμ— λŒ€ν•΄ 뒀에 아무 ν•œκΈ€ ν•œ 자λ₯Ό λͺ¨λ‘ κ°μ§€ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ 멍?청이라고 μž…λ ₯ν•  경우, λ©κ°œμ²­μ„ 감지할 수 μžˆμŠ΅λ‹ˆλ‹€. 기본적으둜 TetrapodλŠ” μ–΄λŠ 정도 κΈ€μž 사이가 λ²Œμ–΄μ§„ 것을 κ°μ§€ν•˜μ§€λ§Œ 이 문자λ₯Ό μ΄μš©ν•˜λ©΄ 문자 뒀에 μ–΄λ–€ ν•œκΈ€μ΄ 와도 λ¬΄μ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ΄μŠ€μΌ€μ΄ν”„ 문자 - 특수 기호λ₯Ό λ”°λ‘œ ν‘œν˜„ν•˜κ³ μž ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
    • , TetrapodλŠ” ν•œκΈ€μžλͺ¨κ°€ λ”°λ‘œ λ–¨μ–΄μ Έ 있으면 μžλ™μœΌλ‘œ 합성을 ν•΄μ„œ μ²˜λ¦¬ν•©λ‹ˆλ‹€. 즉, 비속어 λ¦¬μŠ€νŠΈμ— ["γ„±γ…£λ ˆγ„±γ…£"]라고 μž…λ ₯ν•˜λ©΄ "기레기"λ₯Ό λΉ„μ†μ–΄λ‘œ μΈμ‹ν•©λ‹ˆλ‹€. κ΅¬νƒœμ—¬ μ›λž˜μ˜ ν‘œν˜„μΈ "γ„±γ…£λ ˆγ„±γ…£"λ₯Ό μΈμ‹ν•˜κΈ° μœ„ν•΄μ„œλŠ” "γ„±,γ…£λ ˆγ„±,γ…£"라고 μž…λ ₯ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.
    • . μœ„μ˜ νŠΉμˆ˜λ¬Έμžκ°€ ν¬ν•¨λœ 리슀트λ₯Ό μž‘μ„±ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•˜λŠ” μ΄μŠ€μΌ€μ΄ν”„ λ¬Έμžμž…λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ "κΈ°!" 자체λ₯Ό λΉ„μ†μ–΄λ‘œ μΈμ‹ν•˜κ³  싢을 λ•ŒλŠ” "κΈ°.!"이라고 μž…λ ₯ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

Bias.js

find.js νŒŒμΌμ— import Bias from '../bias/bias';λ₯Ό μž…λ ₯ν•˜μ‹  뒀에 Bias.buildHelper('(νŒ¨ν‚€μ§€λͺ…)', '(원본 단어λͺ…)', false)λ₯Ό μž…λ ₯ν•˜μ‹œλ©΄ μ‚¬μš©κ°€λŠ₯ν•©λ‹ˆλ‹€. JSON νŒŒμΌμ€ bias/build에 μ €μž₯λ©λ‹ˆλ‹€.

νŒ¨ν‚€μ§€ μ œμž‘ 및 μ‚¬μš© 방법

Tetrapod ν”„λ‘œμ νŠΈλŠ” 기본적으둜 kr-badword νŒ¨ν‚€μ§€λ₯Ό μ§€μ›ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ Bias.js νŒŒμΌμ„ μ΄μš©ν•˜λ©΄ μ‚¬μš©μžκ°€ μ›ν•˜λŠ” λŒ€λ‘œ λ³€ν˜• νŒ¨ν„΄μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. μš°μ„  bias/source 디렉토리에 νŒ¨ν‚€μ§€λͺ…μœΌλ‘œ 디렉토리λ₯Ό μ œμž‘ν•©λ‹ˆλ‹€.
  2. κ·Έ λ‹€μŒ μ•„λž˜ 포맷 κ·œμΉ™μ„ μ΄μš©ν•΄μ„œ JSON νŒŒμΌμ„ μž‘μ„±ν•©λ‹ˆλ‹€.

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 λ₯Ό μ‚¬μš©ν• λ•Œ μš”μ†Œ μ•žμ— *λ₯Ό λΆ™μ—¬μ„œ μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή μœ„μΉ˜μ— λ³€μˆ˜ 데이터가 μ°Έμ‘°λ©λ‹ˆλ‹€. 음절 데이터 ꡬ성 μ‹œ 자음과 λͺ¨μŒμ„ ν•©μ³μ„œ μ™„μ„±λœ ν•œκΈ€ κΈ€μžλ₯Ό λ§Œλ“€μ–΄μ•Όν•˜λŠ” κ²½μš°κ°€ μƒκΈ°λŠ”λ°, 이럴 λ•Œλ₯Ό μœ„ν•œ 자λͺ¨ν•©μ„± ν•¨μˆ˜κΈ°λŠ₯ λ˜ν•œ κ΅¬ν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 자λͺ¨λ₯Ό ν•©μ„±ν•΄μ„œ μ™„μ„±λœ ν•œκΈ€ κΈ€μžλ₯Ό λ§Œλ“€μ§€ μ•Šκ³  자λͺ¨λ₯Ό 각각 λΆ„λ¦¬λœ κΈ€μžμ²˜λŸΌ μ·¨κΈ‰ν•˜λŠ” 것은 단어병합 ν•¨μˆ˜ 라고 ν•©λ‹ˆλ‹€. 기본적으둜 RecursiveList λŠ” 단어병합 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μž‘λ™λ˜μ§€λ§Œ, 자λͺ¨ν•©μ„±κ³Ό 차이λ₯Ό λͺ…ν™•ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄μ„œ ν•¨μˆ˜λͺ…을 ν‘œκΈ°ν•΄μ„œ ꡬ뢄할 수 μžˆμŠ΅λ‹ˆλ‹€.

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

            {
                "type": "자λͺ¨ν•©μ„±",
                "data": [
                    [
                        "γ……",
                        "γ…†"
                    ], [
                        "*γ…£_λ°œμŒλ³€ν˜•"
                    ]
                ],
                "exclude": ["μ‡ "]
            }
        ]
    }
}
단어병합 ν•¨μˆ˜ 및 μ½”λ“œ ꡬ성 예

code λŠ” λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ μ΅œμ’…μ μœΌλ‘œ μ •μ˜λ  데이터λ₯Ό μ •μ˜ν•˜λŠ” κ³΅κ°„μž…λ‹ˆλ‹€. ν•œκΈ€μ—μ„œλŠ” μ–΄μ ˆ 을 정리할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. μ΅œμ’…μ μœΌλ‘œ μ‚°μΆœλœ κ²°κ³Όλ¬Ό 쀑 λ°°μ œν•˜κ³  싢은 단어λ₯Ό exclude 뢀뢄에 μž…λ ₯ν•΄μ£Όλ©΄ ν•΄λ‹Ή λ‹¨μ–΄λŠ” κ²°κ³Όλ¬Όμ—μ„œ μ‚­μ œλœμ±„λ‘œ λ°˜ν™˜λ©λ‹ˆλ‹€.

{
    "code": [

        {
            "type": "단어병합",
            "data": [[
                "*λ°”"
            ],[
                "*보"
            ]],
            "exclude": [
                "babo"
            ]
        }

    ]
}

μ£Όμ˜μ‚¬ν•­

λ‹¨μ–΄λ³‘ν•©μ‹œ μ£Όμ˜μ‚¬ν•­
  • 단어병합 ν•¨μˆ˜λŠ” ν•œκΈ€ κΈ€μž 자λͺ¨μ— 각각 ν•œκΈ€μžμ”©μ„ ν• λ‹Ήν•΄μ„œ λ³‘ν•©ν•˜λŠ” ν•¨μˆ˜λ₯Ό λœ»ν•©λ‹ˆλ‹€. (예: ㅂㅏㅂㅗ-> ㅂㅏㅂㅗ)
  • 자음만으둜 μš•μ„€κ°€ 될 수 μžˆλŠ” μš•μ„€μ˜ κ²½μš°μ—” λ‹¨μ–΄λ³‘ν•©μ‹œ λͺ¨μŒμ„ μ ˆλŒ€ μΆ”κ°€λ‘œ ν‘œκΈ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • λΆˆν•„μš”ν•œ λͺ¨μŒμ„ μΆ”κ°€ν•˜λ©΄ λΆˆν•„μš”ν•œ μš©λŸ‰μ¦κ°€μ™€ μ²˜λ¦¬μ†λ„ 지연을 λΆˆλŸ¬μ˜΅λ‹ˆλ‹€.
자λͺ¨ν•©μ„±μ‹œ μ£Όμ˜μ‚¬ν•­
  • 자λͺ¨ν•©μ„± ν•¨μˆ˜λŠ” ν•œκΈ€ κΈ€μž 자λͺ¨λ₯Ό μ΅œλŒ€ν•œ ν•œκΈ€μžλ‘œ λͺ°μ•„μ„œ λ³‘ν•©ν•˜λŠ” ν•¨μˆ˜λ₯Ό λœ»ν•©λ‹ˆλ‹€. (예: ㅂㅏㅂㅗ-> 바보)
  • γ…‚γ…—γ…‘ 와 같이 ν•œκΈ€μžλ‘œ 합성될 수 μ—†λŠ” 단어 합성을 μ ˆλŒ€μ μœΌλ‘œ ν”Όν•΄μ•Όν•©λ‹ˆλ‹€.