From 2e10060465c43377c25af8e7038001a485fe0a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=B3=B4=EC=9B=90?= Date: Thu, 23 Jan 2025 04:18:43 +0900 Subject: [PATCH] normalization --- .github/workflows/go.yml | 28 + .idea/.gitignore | 8 + .idea/material_theme_project_new.xml | 12 + LICENSE | 202 ++++++ README.md | 95 +++ better.go | 87 +++ cache/blacklist.go | 330 +++++++++ cmd/korcen/korcen_test.go | 19 + docs/README.EN.md | 95 +++ docs/asset/Apache-2.0.png | Bin 0 -> 18047 bytes docs/asset/go_version.svg | 11 + docs/asset/module_version.svg | 11 + example/example.go | 29 + example/go.mod | 7 + example/go.sum | 6 + go.mod | 7 + go.sum | 4 + korcen.go | 128 ++++ replace.go | 961 +++++++++++++++++++++++++++ v2/LICENSE | 202 ++++++ v2/cache/blacklist.go | 41 ++ v2/cache/detect.go | 15 + v2/go.mod | 7 + v2/go.sum | 6 + v2/korcen.go | 18 + 25 files changed, 2329 insertions(+) create mode 100644 .github/workflows/go.yml create mode 100644 .idea/.gitignore create mode 100644 .idea/material_theme_project_new.xml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 better.go create mode 100644 cache/blacklist.go create mode 100644 cmd/korcen/korcen_test.go create mode 100644 docs/README.EN.md create mode 100644 docs/asset/Apache-2.0.png create mode 100644 docs/asset/go_version.svg create mode 100644 docs/asset/module_version.svg create mode 100644 example/example.go create mode 100644 example/go.mod create mode 100644 example/go.sum create mode 100644 go.mod create mode 100644 go.sum create mode 100644 korcen.go create mode 100644 replace.go create mode 100644 v2/LICENSE create mode 100644 v2/cache/blacklist.go create mode 100644 v2/cache/detect.go create mode 100644 v2/go.mod create mode 100644 v2/go.sum create mode 100644 v2/korcen.go diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 0000000..9dfac38 --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,28 @@ +# This workflow will build a golang project +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go + +name: Go + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: '1.23.4' + + - name: Build + run: go build -v ./... + + - name: Test + run: go test -v ./cmd/korcen/korcen_test.go -run Test0 diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..c3f502a --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 디폴트 무시된 파일 +/shelf/ +/workspace.xml +# 에디터 기반 HTTP 클라이언트 요청 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml new file mode 100644 index 0000000..335fc31 --- /dev/null +++ b/.idea/material_theme_project_new.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..183a196 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2025 fluffy-melli + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ff480c8 --- /dev/null +++ b/README.md @@ -0,0 +1,95 @@ +
+

Korcen.go

+ + [![Go Version](https://github.com/fluffy-melli/korcen-go/blob/main/docs/asset/go_version.svg)](https://go.dev/) + [![Module Version](https://github.com/fluffy-melli/korcen-go/blob/main/docs/asset/module_version.svg)](https://pkg.go.dev/github.com/fluffy-melli/korcen-go) +
+
+

+ KR / + EN +

+
+ +![131_20220604170616](https://user-images.githubusercontent.com/85154556/171998341-9a7439c8-122f-4a9f-beb6-0e0b3aad05ed.png) + +# 🛠 제작자 + +>[Tanat05](https://github.com/Tanat05) / [korcen](https://github.com/Tanat05/korcen) +``` +https://github.com/Tanat05/korcen +--------------------------------- +이 프로젝트는 원본 `korcen` 프로젝트를 수정하여 배포한 것입니다. +원본 프로젝트는 `https://github.com/Tanat05/korcen`에서 확인할 수 있습니다. + +이 프로젝트의 라이센스 또한 Apache-2.0 을 따르고 있습니다 +``` + +>[gyarang](https://github.com/gyarang) / [gohangul](https://github.com/gyarang/gohangul) +``` +https://github.com/gyarang/gohangul +----------------------------------- +이 프로젝트는 `gohangul` 을 사용해서 배포한 것입니다. +해당 프로젝트는 `https://github.com/gyarang/gohangul`에서 확인할 수 있습니다. + +해당 프로젝트의 라이센스인 MIT License 또한 따르고 있습니다 +``` + +![Apache-2.0](https://github.com/fluffy-melli/korcen-go/blob/main/docs/asset/Apache-2.0.png) + +`korcen-go`는 `Apache-2.0` & `MIT License` 라이선스를 `모두` 따르고 있습니다. +코드를 사용할 경우 라이선스 내용을 준수해주세요. + +Copyright© All rights reserved. + +--- + +# ❓ 주요 기능 + +```diff +[부적절한 언어 감지] +- 일반적인 부적절한 언어 +- 경미한 부적절한 언어 +- 성적 언어나 표현 +- 비하하는 표현 +- 인종 차별적인 부적절한 표현 +- 부모를 비하하거나 공격하는 언어 +- 정치적 부적절한 언어나 표현 +- 영어에서 부적절한 표현 +- 일본에서 부적절한 표현 +- 중국에서 부적절한 표현 +- 기타 특수한 부적절한 표현 +``` + +--- + +# ⬇️ 설치 방법 + +>mod +```sh +$ go get github.com/fluffy-melli/korcen-go +L v0.7.0 버전 이후로 함수 출력이 달라졌으므로 사용시에 유의해주시기 바랍니다 +``` + +>golang 코드 예제 +```go +package main + +import ( + "fmt" + + "github.com/fluffy-melli/korcen-go" +) + +func main() { + // Discord Message Event Logic + ck := korcen.Check("MESSAGE") + if ck.Detect { + dtif := ck.Swear[0] + message := ck.NewText[:dtif.Start] + "\x1b[1m\x1b[41m\"" + ck.NewText[dtif.Start:dtif.End] + "\"\x1b[0m" + ck.NewText[dtif.End:] + discord_ansi := "```ansi\n" + message + "\n```" + fmt.Println(discord_ansi) + } + // Discord Send Logic +} +``` \ No newline at end of file diff --git a/better.go b/better.go new file mode 100644 index 0000000..3b46fff --- /dev/null +++ b/better.go @@ -0,0 +1,87 @@ +package korcen + +import ( + "strings" +) + +type Profanity struct { + CensorWords map[string]bool + CharMapping map[rune][]rune + AllowedChars map[rune]bool + MaxCombinations int +} + +func NewProfanity(words *[]string) *Profanity { + censorWords := make(map[string]bool) + for _, word := range *words { + censorWords[strings.ToLower(word)] = true + } + charMapping := map[rune][]rune{ + 'a': {'a', '@', '*', '4'}, + 'i': {'i', '*', 'l', '1'}, + 'o': {'o', '*', '0', '@'}, + 'u': {'u', '*', 'v'}, + } + + allowedChars := make(map[rune]bool) + for _, r := range "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" { + allowedChars[r] = true + } + + return &Profanity{ + CensorWords: censorWords, + CharMapping: charMapping, + AllowedChars: allowedChars, + MaxCombinations: 3, + } +} + +func (p *Profanity) Censor(text string) (bool, string) { + words := strings.Fields(text) + for _, word := range words { + if p.ContainsProfanity(word) { + return true, word + } + } + return false, "" +} + +func (p *Profanity) ContainsProfanity(word string) bool { + word = p.cleanWord(word) + for _, processedWord := range p.generateCombinations(word) { + if p.CensorWords[strings.ToLower(processedWord)] { + return true + } + } + return false +} + +func (p *Profanity) cleanWord(word string) string { + var cleanedWord strings.Builder + for _, r := range word { + if _, exists := p.AllowedChars[r]; exists { + cleanedWord.WriteRune(r) + } + } + return cleanedWord.String() +} + +func (p *Profanity) generateCombinations(word string) []string { + var combinations []string + combinations = append(combinations, word) + for i := 0; i < p.MaxCombinations; i++ { + var newCombinations []string + for _, comb := range combinations { + for i, r := range comb { + if replacements, exists := p.CharMapping[r]; exists { + for _, repl := range replacements { + newComb := comb[:i] + string(repl) + comb[i+1:] + newCombinations = append(newCombinations, newComb) + } + } + } + } + combinations = append(combinations, newCombinations...) + } + return combinations +} diff --git a/cache/blacklist.go b/cache/blacklist.go new file mode 100644 index 0000000..814d986 --- /dev/null +++ b/cache/blacklist.go @@ -0,0 +1,330 @@ +package cache + +import ( + "sync" + + "github.com/google/btree" +) + +var BlacklistMu = sync.RWMutex{} +var Blacklist = map[string]string{} + +var General = &[]string{ + "닥쳐", "닭쳐", "닥치라", "아가리해", "dog새", "개ㅐ색", "개같", "개가튼", "개쉑", "개스키", "개세끼", "개색히", "개가뇬", "개새기", "개쌔기", "개쌔끼", + "쌖", "쎆", "새긔", "개소리", "개년", "개소리", "뻑유", "뻐킹", "뻐큐", "빡큐", "뿩큐", "뻑큐", "빡유", "뻒큐", + "개드립", "개돼지", "개씹창", "개간나", "개스끼", "개섹기", "개자식", "개때꺄", "개때끼", "개발남아", "개샛끼", "개가든", "개가뜬", "개가턴", "개가툰", "개가튼", + "개갇은", "개갈보", "개걸레", "개너마", "개너므", "개넌", "개넘", "개녀나", "개년", "개노마", "개노무새끼", "개논", "개놈", "개뇨나", "개뇬", "개뇸", "개뇽", "개눔", + "개느마", "개늠", "개때꺄", "개때끼", "개떼끼", "개랙기", "개련", "개발남아", "개발뇬", "개색", "개색끼", "개샊", "개샛끼", "개샛키", "개샛킹", "개샛히", "개샜끼", + "개생키", "개샠", "개샤끼", "개샤킥", "개샥", "개샹늠", "개세끼", "개세리", "개세키", "개섹히", "개섺", "개셃", "개셋키", "개셐", "개셰리", "개솩", "개쇄끼", "개쇅", + "개쇅끼", "개쇅키", "개쇗", "개쇠리", "개쉐끼", "개쉐리", "개쉐키", "개쉑", "개쉑갸", "개쉑기", "개쉑꺄", "개쉑끼", "개쉑캬", "개쉑키", "개쉑히", "개쉢", "개쉨", + "개쉬끼", "개쉬리", "개쉽", "개스끼", "개스키", "개습", "개습세", "개습쌔", "개싀기", "개싀끼", "개싀밸", "개싀킈", "개싀키", "개싏", "개싑창", "개싘", + "개시끼", "개시퀴", "개시키", "개식기", "개식끼", "개식히", "개십새", "개십팔", "개싯기", "개싯끼", "개싯키", "개싴", "개쌍넘", "개쌍년", "개쌍놈", "개쌍눔", + "개쌍늠", "개쌍연", "개쌍영", "개쌔꺄", "개쌔끼", "개쌕", "개쌕끼", "개쌰깨", "개썅", "개쎄", "개쎅", "개쎼키", "개쐐리", "개쒜", "개쒝", "개쒯", "개쒸", "개쒸빨놈", + "개쒹기", "개쓉", "개쒹기", "개쓉", "개씀", "개씁", "개씌끼", "개씨끼", "개씨팕", "개씨팔", "개잡것", "개잡년", "개잡놈", "개잡뇬", "개젓", "개젖", "개젗", "개졋", + "개졎", "개조또", "개조옷", "개족", "개좃", "개좆", "개좇", "개지랄", "개지럴", "개창년", "개허러", "개허벌년", "개호러", "개호로", "개후랄", "개후레", "개후로", + "개후장", "걔섀끼", "걔잡넘", "걔잡년", "걔잡뇬", "게가튼", "게같은", "게너마", "게년", "게노마", "게놈", "게뇨나", "게뇬", "게뇸", "게뇽", "게눔", "게늠", + "게띠발넘", "게부랄", "게부알", "게새끼", "게새리", "게새키", "게색", "게색기", "게색끼", "게샛키", "게세꺄", "게자지", "게잡넘", "게잡년", "게잡뇬", "게젓", + "게좆", "계같은뇬", "계뇬", "계뇽", "쉬댕", "쉬뎅", "개생끼", "ㅄ", "썅", "씨앙", "씨양", "샤앙", "쌰앙", "좆", "촟", "조까", "좈", "쫒", "졷", "좃", "줮", + "좋같", "좃같", "좃물", "좃밥", "줫", "좋밥", "좋물", "좇", "ㅈ같", "ㅈ망", "ㅈ까", "ㅈ경", "ㅈ가튼", + "새끼", "쉐리", "쌔끼", "썌끼", "쎼끼", "쌬끼", "샠끼", "세끼", "샊", "쌖", "섺", "쎆", "십새", "새키", "씹색", "새까", "새꺄", "샛끼", + "새뀌", "새끠", "새캬", "색꺄", "색끼", "섹히", "셁기", "셁끼", "셐기", "셰끼", "셰리", "쉐꺄", "십색꺄", "십떼끼", "십데꺄", "십때끼", + "십새꺄", "십새캬", "쉑히", "씹새기", "고아새기", "샠기", "애새기", "이새기", "느그새기", "장애새기", "w같은", + "ㅅㄲ", "ㅅ끼", "ㅆ끼", "색ㄲㅣ", "ㅆㅐㄲㅑ", "ㅆㅐㄲㅣ", "rotorl", "rotprl", "sib새", "AH끼", "sㅐ끼", "x끼", + "엿같", "엿가튼", "엿먹어", "뭣같은", "꺼져", "염병", "엠병", "옘병", "염병", "얨병", "옘뼝", + "병신", "병딱", "벼신", "붱신", "뼝신", "뿽신", "삥신", "병시니", "병형신", "뵹신", "병긴", "비응신", + "ㅄ", "ㅂㅅ", "병ㅅ", "ㅂ신", "ㅕㅇ신", "ㅂㅇ신", "뷰신", "지랄", "찌랄", "지럴", "지롤", "랄지", "쥐랄", "쮜랄", "지뢀", "띄랄", + "ㅈㄹ", "지ㄹ", "ㅈ랄", "ㅈ라", "wlfkf", "g랄", "g럴", "g롤", "g뢀", "giral", "zi랄", "ji랄", "18것", "18놈", "18럼", "18롬", "18새끼", + "18세끼", "18세리", "18섹", "18쉑", "10쉑", "ㅗ", "┻", "┴", "┹", "_ㅣ_", + "_/_", "⊥", "_ |\\_", "_|\\_", "_ㅣ\\_", "_I_", "丄", + "시발", "씨발", "시봘", "씨봘", "씨바", "시바", "샤발", "씌발", "씹발", "시벌", "시팔", "싯팔", + "씨빨", "씨랼", "씨파", "띠발", "띡발", "띸발", "싸발", "십발", "슈발", "야발", "씨불", "씨랄", + "쉬발", "쓰발", "쓔발", "쌰발", "쉬발", "쒸발", "씨팔", "씨밝", "씨밯", "쑤발", "치발", "샤발", + "발씨", "리발", "씨볼", "찌발", "씨비바라랄", "시바랄", "씨바라", "쒸팔", "쉬팔", "씨밮", "쒸밮", "시밮", + "씨삐라", "씨벌", "슈벌", "시불", "시부렝", "씨부렝", "시부랭", "씨부랭", "시부랭", "발놈시", "뛰발", + "뛰봘", "뜨발", "뜨벌", "띄발", "씨바알", "샤빨", "샤발", "스벌", "쓰벌", "신발련", "신발년", "신발놈", "띠발", + "띠바랄", "시방", "씨방", "씨부련", "시부련", "씨잇발", "씨잇파알", "씨잇바알", "시잇발", "시잇바알", "쒸이발", + "쉬이빨", "씹팔", "쉬바", "시병발신", "씱빩", "쉬바난", "쉬바놈", "쉬바녀", "쉬바년", "쉬바노마", "쉬바새", "쉬불", "쉬이바", + "시벨놈", "시뱅놈", "시봉새", "씻뻘", "씌벌", "ㅈ밥", + "시ㅂ", "시ㅏㄹ", "씨ㅂ", "씨ㅏㄹ", "ㅣ발", "ㅆ발", "ㅅ발", "ㅅㅂ", "ㅆㅂ", "ㅆ바", "ㅅ바", + "시ㅂㅏ", "ㅅㅂㅏ", "시ㅏㄹ", "씨ㅏㄹ", "ㅅ불", "ㅆ불", "ㅅ쁠", "ㅆ뿔", "ㅆㅣ발", "ㅅㅟ발", "ㅅㅣㅂㅏ", + "ㅣ바알", "ㅅ벌", "^^ㅣ벌", "ㅆ삐라", "씨ㅃ", "^^/발", + "씨8", "18아", "18놈", "tㅂ", "t발", "ㅆㅍ", + "sibal", "sival", "sibar", "sibak", "sipal", "siqk", "tlbal", "tlval", "tlbar", "tlbak", "tlpal", "tlqk", + "시bal", "시val", "시bar", "시bak", "시pal", "시qk", "시bal", "시val", "시bar", "시bak", "시pal", "시qk", + "si바", "si발", "si불", "si빨", "si팔", "tl바", "tl발", "tl불", "tl빨", "tl팔", + "siba", "tlba", "siva", "tlva", "tlqkf", "10발놈", "10발년", "tlqkd", "si8", "10R놈", "시8", "십8", "s1bal", "sib알", "씨x", "siㅂ", + "tq", "qt", +} + +var Minor = &[]string{ + "뒤져", "뒈져", "뒈진", "뒈질", "디져라", "디진다", "디질래", "뒤질", "꼽냐", "꼽니", "꼽나", "미친놈", "미친새끼", "ㅁㅊ", "ㅁ친", "ㅁ쳤", "aㅣ친", "me친", "미ㅊ", "DI친", +} + +var Sexual = &[]string{ + "ㅈㅈ빨", "자ㅈ", "ㅈ지빨", "자지", "자짓", "잦이", "쟈지", "보지", "버지물", "버짓물", "보짓", "ⓑⓞⓩⓘ", + "bozi", "개보즤", "개보지", "버지벌렁벌렁", "보짖", "뵤즤", "봊이", "ja지", + "ㅅㅔㄱ스", "섹ㅅ", "ㅅ스", "세ㄱㅅ", "ㅅㅔㄱㅅ", "sex", "s스", "x스", "se스", "se스", "s스", "ㅅㅅ", "s하고e싶다x", "ㅅㅔㅅㄱ", "이=스", "ㅇl=스", + "섹스", "섻", "쉑스", "섿스", "섹그", "야스", "색스", "셱스", "섁스", "세엑스", "썩스", "섹수", "섹파", "섹하자", "쉐스", "쉑스", "쉐엑스", "색수", "세엑수우", "섹하고", + "섹하구", "섹하자", "섹하장", "섹하쟈", "섹한번", "쌕스", "불알", "부랄", "뽕알", "뿅알", "뿌랄", "뿔알", "개부달", + "개부랄", "개부러럴", "개부럴", "개부뢀", "개부알", "개불알", "똘추", "똥구멍", "부라랄", "오나홍", "오나홀", "ㅇㄴ홀", "텐가", "바이브레이터", "오ㄴ홀", "ㅇ나홀", + "모유물", "로리물", "근친상간", "룸섹스", "원조교재", "속박플레이", "야외플레이", "자궁문신", "매춘부", "성노예", "씹하다", "꼬3", "꼬툭튀", "꼬톡튀", + "g스팟", "지스팟", "딸딸이", "질싸", "안에사정", "자위남", "자위녀", "폰섹", "포르노", "폰세엑", "폰쉑", "폰쎅", "질내사정", "그룹섹", "남창", "男色", "누워라이년아", + "누웠냐씨방새", "다리벌려", "대줄년", "뒤로너어줘", "딸따뤼", "딸쳐", "떡쳐라", "막대쑤셔줘", "막대핥아줘", "먹고보니내딸", "먹고보니누나", "먹고보니딸", + "먹고보니똥개", "먹고보니엄마", "먹고보니응아", "먹고보니재수", "먹고보니처제", "먹고보니형수", "몸뚱이줄께", "몸안에사정", "밖에다쌀께", "박고빼고", + "배위에싸죠", "몸의대화", "섹할", "섹해", "크리토리스", "클리토리스", "페니스", "애널", "젖까", "젖가튼", "젖나", "젖만", "ja위", "자위", "고자새끼", "고츄", + "꺼추", "꼬추", "헤으응", "헤응", "헤윾", "헤으윾", "헤윽", "헤으윽", "하앙", "하ㅏ앙", "하아ㅏㅏ앙", "하윾", "하으윾", "하윽", "하으윽", "흐윽", "흐으으윽", "흐윾", "흐으윾", "흐읏", + "흐으읏", "하읏", "하으읏", "하아앙", "흐으앙", "흐앙", "꼬츄", "쥬지", "하으앙", "흐으윽", "흐읏", "페도", "강간", "세엑스", "6974", "성관계", "교미", "교오미", "소추", + "쥬우지", "쥬우ㅜ지", "쀼릇", "뷰릇", "jaji", "hㅏ으응", "hㅔ응", +} + +var Belittle = &[]string{ + "10련", "따까리", "장애년", "찐따년", "싸가지", "창년", "썅년", "버러지", "고아년", "고아년", "개간년", "종간나", "도구년", "걸래년", "썅년", "씹년", "개걸레", + "창녀", "머저리", "씹쓰래기", "씹쓰레기", "씹장생", "씹자식", "운지", "급식충", "틀딱충", "조센징", "매국노", "똥꼬충", "진지충", "듣보잡", "개찐따", + "한남충", "정신병자", "중생아", "돌팔이", "김치녀", "폰팔이", "틀딱년", "같은년", "개돼중", "쓰글년", "썩을년", "썩글년", "씹할", "거지새끼", "거지쉐뀌", + "거지쉑이", "거지쎄끼", "거지쒜리", "걸래가튼", "걸래넘", "걸래년", "걸래놈", "걸레가튼", "걸레년", "그지새끼", "그지새키", "그지색", "기집년", "까진년", + "깔보", "난잡년", "빡대가리", "더러운년", "돌아이", "또라이", "장애려", "샹놈", "김치남", "김치녀", "혜지련", "한유남충", "페미나치", "페미년", "꼴페미", "페미", + "한남유충", "딸배", "딸피", +} + +var Race = &[]string{ + "깜둥이", "흑형", "조센진", "짱개", "짱깨", "조선족", "니거", + "짱께", "짱게", "쪽바리", "쪽파리", "빨갱이", "쪽바리", "니그로", "코쟁이", "칭총", "칭챙총", "섬숭이", "왜놈", "짱꼴라", "짱깨", "섬짱깨", +} + +var Parent = &[]string{ + "ㄴ1ㄱ", "ㄴ1ㅁ", "느금ㅁ", "ㄴㄱ마", "ㄴㄱ빠", "ㄴ금빠", "ㅇH미", "ㄴ1에미", "늬애미", "@ㅐ미", "@ㅐ비", + "ㄴㄱㅁ", "ㄴ금마", "느금ㅁ", "ㄴㄱ마", "ㄴㄱ빠", "ㄴ금빠", "ㄴ미", "늬금마", + "느금마", "느그엄마", "늑엄마", "늑금마", "느그애미", "넉엄마", "느그부모", "느그애비", "느금빠", "느그메", "느그빠", "니미씨", "니미씹", + "느그마", "니엄마", "엄창", "엠창", "니미럴", "누굼마", "느금", "내미랄", "내미럴", "엄마없는", "아빠없는", "노에미", + "니애미", "노애미", "노앰", "앰뒤련", "애믿쥐", + "아버지없는게", "애미없는게", "애비없는게", "어머니없는게", "엄마없네", "니애비", "노애비", "애미없", "애비없", "애미뒤", "애비뒤", + "니아빠", "너에미", "눼기미", "뉘귀미", "뉘기미", "뉘김이", "뉘뮈", "뉘미랄", "뉘미럴", "뉘미롤", "뉘밀얼", "뉘밀할", "뉘어미", "뉘에미", + "느검마", "늬긔미", "늬기미", "니기미", "니믜창", "니미랄", "니미럴", "니미쒸블", "니미씨펄넘", "니미좃", "니밀할", "니부랑", "니뽕좃", + "애미죽", "애미디진", +} + +var Politics = &[]string{ + "노시개", "노알라", "뇌사모", "뇌물현", "응디시티", "귀걸이아빠", "달창", "대깨문", "문재앙", "문죄앙", "문죄인", "문크예거", "훠훠훠", "문빠", + "근혜어", "길라임", "나대블츠", "닭근혜", "댓통령", "레이디가카", "바쁜벌꿀", "수첩공주", "유신공주", "유체이탈화법", "칠푼이", "쿼터갓", + "반인반신", "데미갓", "박정희", "간철수", "가카", "이명박근혜", "다스는누구겁니까", "국민의 힘", "국힘", "국민의힘", +} + +var English = &[]string{ + "2 girls 1 cup", "4r5e", "anal", "anus", "areole", "arian", "arrse", "arse", "arsehole", "aryan", "aSanchez", "ass", "ass-fucker", "assbang", + "assbanged", "asses", "assfuck", "assfucker", "assfukka", "asshole", "assmunch", "asswhole", "auto erotic", "autoerotic", "ballsack", "bastard", + "bdsm", "beastial", "beastiality", "bellend", "bestial", "bestiality", "bimbo", "bimbos", "bitch", "bitches", "bitchin", "bitching", "blow job", + "blowjob", "blowjobs", "blue waffle", "bondage", "boner", "boob", "boobs", "booobs", "boooobs", "booooobs", "booooooobs", "booty call", "breasts", + "brown shower", "brown showers", "buceta", "bukake", "bukkake", "bull shit", "bullshit", "busty", "butthole", "carpet muncher", "cawk", "chink", + "cipa", "clit", "clitoris", "clits", "cnut", "cock", "cockface", "cockhead", "cockmunch", "cockmuncher", "cocks", "cocksuck", "cocksucked", "cocksucker", + "cocksucking", "cocksucks", "cokmuncher", "coon", "cow girl", "cow girls", "cowgirl", "cowgirls", "crap", "crotch", "cum", "cuming", "cummer", "cumming", + "cums", "cumshot", "cunilingus", "cunillingus", "cunnilingus", "cunt", "cuntlicker", "cuntlicking", "cunts", "damn", "deep throat", "deepthroat", "dick", + "dickhead", "dildo", "dildos", "dink", "dinks", "dlck", "dog style", "dog-fucker", "doggie style", "doggie-style", "doggiestyle", "doggin", "dogging", + "doggy style", "doggy-style", "doggystyle", "dong", "donkeyribber", "doofus", "doosh", "dopey", "douch3", "douche", "douchebag", "douchebags", "douchey", + "drunk", "duche", "dumass", "dumbass", "dumbasses", "dummy", "dyke", "dykes", "eatadick", "eathairpie", "ejaculate", "ejaculated", "ejaculates", "ejaculating", + "ejaculatings", "ejaculation", "ejakulate", "enlargement", "erect", "erection", "erotic", "erotism", "essohbee", "extacy", "extasy", "f_u_c_k", "f-u-c-k", "f.u.c.k", + "f4nny", "facial", "fack", "fag", "fagg", "fagged", "fagging", "faggit", "faggitt", "faggot", "faggs", "fagot", "fagots", "fags", "faig", "faigt", "fanny", "fannybandit", + "fannyflaps", "fannyfucker", "fanyy", "fart", "fartknocker", "fat", "fatass", "fcuk", "fcuker", "fcuking", "feck", "fecker", "felch", "felcher", "felching", "fellate", + "fellatio", "feltch", "feltcher", "femdom", "fingerfuck", "fingerfucked", "fingerfucker", "fingerfuckers", "fingerfucking", "fingerfucks", "fingering", "fisted", + "fistfuck", "fistfucked", "fistfucker", "fistfuckers", "fistfucking", "fistfuckings", "fistfucks", "fisting", "fisty", "flange", "flogthelog", "floozy", "foad", + "fondle", "foobar", "fook", "fooker", "foot job", "footjob", "foreskin", "freex", "frigg", "frigga", "fubar", "fuck", "fuck-ass", "fuck-bitch", "fuck-tard", "fucka", + "fuckass", "fucked", "fucker", "fuckers", "fuckface", "fuckhead", "fuckheads", "fuckhole", "fuckin", "fucking", "fuckings", "fuckingshitmotherfucker", "fuckme", + "fuckmeat", "fucknugget", "fucknut", "fuckoff", "fuckpuppet", "fucks", "fucktard", "fucktoy", "fucktrophy", "fuckup", "fuckwad", "fuckwhit", "fuckwit", "fuckyomama", + "fudgepacker", "fuk", "fuker", "fukker", "fukkin", "fukking", "fuks", "fukwhit", "fukwit", "futanari", "futanary", "fux", "fux0r", "fvck", "fxck", "g-spot", "gae", "gai", + "gang bang", "gang-bang", "gangbang", "gangbanged", "gangbangs", "ganja", "gassyass", "gay", "gaylord", "gays", "gaysex", "gey", "gfy", "ghay", "ghey", "gigolo", "glans", + "goatse", "god", "god-dam", "god-damned", "godamn", "godamnit", "goddam", "goddammit", "goddamn", "goddamned", "gokkun", "golden shower", "goldenshower", "gonad", "gonads", + "gook", "gooks", "gringo", "gspot", "gtfo", "guido", "h0m0", "h0mo", "hamflap", "hand job", "handjob", "hardcoresex", "hardon", "he11", "hebe", "heeb", "hell", "hemp", "hentai", + "heroin", "herp", "herpes", "herpy", "heshe", "hitler", "hiv", "hoar", "hoare", "hobag", "hoer", "hom0", "homey", "homo", "homoerotic", "homoey", "honky", "hooch", "hookah", "hooker", + "hoor", "hootch", "hooter", "hooters", "hore", "horniest", "horny", "hotsex", "howtokill", "howtomurdep", "hump", "humped", "humping", "hussy", "hymen", "inbred", "incest", "injun", + "j3rk0ff", "jack off", "jack-off", "jackass", "jackhole", "jackoff", "jap", "japs", "jerk", "jerk off", "jerk-off", "jerk0ff", "jerked", "jerkoff", "jism", "jiz", "jizm", "jizz", "jizzed", + "junkie", "junky", "kawk", "kike", "kikes", "kill", "kinbaku", "kinky", "kinkyJesus", "kkk", "klan", "knob", "knobead", "knobed", "knobend", "knobhead", "knobjocky", "knobjokey", "kock", + "kondum", "kondums", "kooch", "kooches", "kootch", "kraut", "kum", "kummer", "kumming", "kums", "kunilingus", "kwif", "kyke", "l3i+ch", "l3itch", "labia", "lech", "LEN", "leper", "lesbians", + "lesbo", "lesbos", "lez", "lezbian", "lezbians", "lezbo", "lezbos", "lezzie", "lezzies", "lezzy", "lmao", "lmfao", "loin", "loins", "lube", "lust", "lusting", "lusty", "m-fucking", "m0f0", + "m0fo", "m45terbate", "ma5terb8", "ma5terbate", "mafugly", "mams", "masochist", "massa", "master-bate", "masterb8", "masterbat*", "masterbat3", "masterbate", "masterbating", + "masterbation", "masterbations", "masturbate", "masturbating", "masturbation", "maxi", "menses", "menstruate", "menstruation", "meth", "milf", "mo-fo", "mof0", "mofo", "molest", + "moolie", "moron", "mothafuck", "mothafucka", "mothafuckas", "mothafuckaz", "mothafucked", "mothafucker", "mothafuckers", "mothafuckin", "mothafucking", "mothafuckings", + "mothafucks", "mother fucker", "motherfuck", "motherfucka", "motherfucked", "motherfucker", "motherfuckers", "motherfuckin", "motherfucking", "motherfuckings", "motherfuckka", + "motherfucks", "mtherfucker", "mthrfucker", "mthrfucking", "muff", "muffdiver", "muffpuff", "murder", "mutha", "muthafecker", "muthafuckaz", "muthafucker", "muthafuckker", "muther", + "mutherfucker", "mutherfucking", "muthrfucking", "n1g", "n1gg", "n1gga", "n1gger", "nad", "nads", "naked", "napalm", "nappy", "nazi", "nazism", "needthedick", "negro", "nig", "nigg", + "nigg3r", "nigg4h", "nigga", "niggah", "niggas", "niggaz", "nigger", "niggers", "niggle", "niglet", "nimrod", "ninny", "nipple", "nipples", "nob", "nob jokey", "nobhead", "nobjocky", + "nobjokey", "nooky", "nude", "nudes", "numbnuts", "nutbutter", "nutsack", "nympho", "omg", "opiate", "opium", "oral", "orally", "organ", "orgasim", "orgasims", "orgasm", "orgasmic", + "orgasms", "orgies", "orgy", "ovary", "ovum", "ovums", "p.u.s.s.y.", "p0rn", "paddy", "paki", "pantie", "panties", "panty", "pastie", "pasty", "pawn", "pcp", "pecker", "pedo", "pedophile", + "pedophilia", "pedophiliac", "pee", "peepee", "penetrate", "penetration", "penial", "penile", "penis", "penisfucker", "perversion", "peyote", "phalli", "phallic", "phonesex", "phuck", + "phuk", "phuked", "phuking", "phukked", "phukking", "phuks", "phuq", "pigfucker", "pillowbiter", "pimp", "pimpis", "pinko", "piss", "piss-off", "pissed", "pisser", "pissers", "pisses", + "pissflaps", "pissin", "pissing", "pissoff", "playboy", "pms", "polack", "pollock", "poon", "poontang", "poop", "porn", "porno", "pornography", "pornos", "pot", "potty", "prick", "pricks", + "prig", "pron", "prostitute", "prude", "pube", "pubic", "pubis", "punkass", "punky", "puss", "pusse", "pussi", "pussies", "pussy", "pussyfart", "pussypalace", "pussypounder", "pussys", + "puto", "queaf", "queef", "queer", "queero", "queers", "quicky", "quim", "r-tard", "racy", "rape", "raped", "raper", "raping", "rapist", "raunch", "rectal", "rectum", "rectus", "reefer", + "reetard", "reich", "retard", "retarded", "revue", "rimjaw", "rimjob", "rimming", "ritard", "rtard", "rum", "rump", "rumprammer", "ruski", "s_h_i_t", "s-h-1-t", "s-h-i-t", "s-o-b", "s.h.i.t.", + "s.o.b.", "s0b", "sadism", "sadist", "sandbar", "sausagequeen", "scag", "scantily", "schizo", "schlong", "screw", "screwed", "screwing", "scroat", "scrog", "scrot", "scrote", "scrotum", + "scrud", "scum", "seaman", "seamen", "seduce", "semen", "sex", "sexual", "sh!+", "sh!t", "sh1t", "shag", "shagger", "shaggin", "shagging", "shamedame", "she male", "shemale", "shi+", + "shibari", "shibary", "shit", "shitdick", "shite", "shiteater", "shited", "shitey", "shitface", "shitfuck", "shitfucker", "shitfull", "shithead", "shithole", "shithouse", "shiting", + "shitings", "shits", "shitt", "shitted", "shitter", "shitters", "shitting", "shittings", "shitty", "shiz", "shota", "sissy", "skag", "skank", "slave", "sleaze", "sleazy", "slope", + "slut", "slutbucket", "slutdumper", "slutkiss", "sluts", "smegma", "smut", "smutty", "snatch", "sniper", "snuff", "sodom", "son-of-a-bitch", "souse", "soused", "spac", "sperm", "spic", + "spick", "spik", "spiks", "spooge", "spunk", "steamy", "stfu", "stiffy", "stoned", "strip", "strip club", "stripclub", "stroke", "stupid", "suck", "sucked", "sucking", "sumofabiatch", + "t1t", "t1tt1e5", "t1tties", "tampon", "tard", "tawdry", "teabagging", "teat", "teets", "teez", "terd", "teste", "testee", "testes", "testical", "testicle", "testis", "three some", + "threesome", "throating", "thrust", "thug", "tinkle", "tit", "titfuck", "titi", "tits", "titt", "tittie5", "tittiefucker", "titties", "titty", "tittyfuck", "tittyfucker", "tittywank", + "titwank", "toke", "toots", "tosser", "tramp", "transsexual", "trashy", "tubgirl", "turd", "tush", "tw4t", "twat", "twathead", "twats", "twatty", "twunt", "twunter", "ugly", "undies", + "unwed", "urinal", "urine", "uterus", "uzi", "v14gra", "v1gra", "vag", "vagina", "valium", "viagra", "virgin", "vixen", "vodka", "vomit", "voyeur", "vulgar", "vulva", "w00se", "wad", "wang", + "wank", "wanker", "wanky", "wazoo", "wedgie", "weed", "weenie", "weewee", "weiner", "weirdo", "wench", "wetback", "wh0re", "wh0reface", "whitey", "whiz", "whoar", "whoralicious", "whore", + "whorealicious", "whored", "whoreface", "whorehopper", "whorehouse", "whores", "whoring", "wigger", "willies", "willy", "womb", "woody", "wop", "wtf", "x-rated2g1c", "xx", "xxx", "yaoi", "yury", +} + +var Japanese = &[]string{ + "肉便器", "糞野郎", "バカ野郎", "腐れ外道", "部落民", "中出し", "強姦", "ちん", "ちょうせんじん", "ざじ", + "特定アジア", "人非人", "鬼畜", "負け犬", "支那", "トルコ風呂", "淫売", "未開人", "クソゲー", "ばかやろ", "セックス", +} + +var Chinese = &[]string{ + "G巴", "G巴", "G叭", "G叭", "G芭", "G芭", "G掰", "G掰", "g點", "MM屄", "mm美圖", "qvod成人", "sex聊天室", "SM後庭器具", "SM援交", "SM舔穴", "sm調教", + "XIAAV論壇", "ㄊㄇㄉ", "一本道電影", "一夜性網", "一夜情論壇", "一夜情激情成人聊天室", "九九情色帝國", "九城情色", "二B", "二穴中出", "人人有色論壇", "人妻交換", "人妻色誘", "人妻做愛", + "人妻榨乳", "人性本色", "入穴一遊", "三唑侖", "三級激情片", "三陪", "上你幹妳", "上門按摩", "下賤", "口內爆射", "口交", "口含雞巴", "口活", "口射", "口淫", "口爆", "大b", "大力抽送", + "大奶美逼", "大奶騷女", "大母牛娛樂論壇", "大乳頭", "大波粉B", "大波騷婦", "大花逼", "大眾色情成人網", "大麻", "大雞巴", "大鶏巴", "女尻", "女屄", "女馬ㄉ", "女馬白勺", "女馬的", "女幹", + "小b", "小穴", "小姐上門全套", "小姐打飛機", "小姐裸聊", "小逼", "小嫩雞", "小騷BB", "阝月", "中文搜性網", "互淫", "互舔淫穴", "內射", "公媳亂", "勾魂少婦", "午夜天堂成人", "天天干貼圖", + "天天情色", "夫妻3p", "夫妻多p", "夫妻俱樂部", "夫妻亂交", "少女小姐上門", "少女被插", "手淫", "日本鬼子", "日死你", "日你", "日屄", "日逼", "欠日", "欠幹", "毛鮑", "王八", "他ㄇㄉ", + "他ㄇ的", "他嗎的", "他媽的", "凸他", "凸她", "凸肉優", "凸你", "凸我", "凸妳", "出售冰毒", "出售曲馬多", "出售苯基丙酮", "出售海豹M9", "出售迷幻藥", "出售迷情藥", "出售氫化可的松", + "出售麥角醇", "出售麻古", "出售麻果配方", "出售麻黃素", "出售氯胺酮", "出售腎", "出售間苯三酚", "出售黃牙籤", "出售黃白牙籤", "出售黃麻素", "出售黃體酮", "出售羥基環戊基", "出售槍支", + "出售監聽王", "出售蒙汗藥", "出售鄰氯苯晴", "出售磚石冰毒", "出售鎂粉", "出售鹽酸曲馬多", "出售鹽酸曲馬多片", "出售鹽酸羥亞胺", "出售鑽石冰毒", "包二奶", "去你媽的", "去氧麻黃堿製作方法", + "可卡因", "叼你媽", "失身粉", "奴隷調教", "奶大屄肥", "尻", "左旋黃麻素", "巨騷", "幼交", "幼妓", "幼逼", "扒穴", "扒屄", "打手槍", "打炮", "打飛機", "打野炮", "本土無碼", "母女雙飛", + "母子交歡", "母子姦情", "母奸", "玉穴", "玉乳", "生小孩沒屁眼", "生徒胸觸", "甲基苯丙", "甲基苯胺", "白虎小穴", "白虎少婦", "白虎美女貼圖", "白虎陰穴", "白虎嫩B", "白粉", "白液四濺", + "白嫩騷婦", "白漿四濺", "穴海", "穴淫", "穴爽", "穴圖", "交換夫妻", "先奸後殺", "全家死光光", "冰毒", "吃精", "吃雞巴", "合成氯胺酮", "合成鹽酸羥亞胺", "多人性愛", "多人輪", "奸幼", + "她馬的", "她媽的", "好色cc", "安非他命", "成人A片", "成人bt", "成人下載", "成人五月天", "成人午夜場", "成人百強", "成人自拍", "成人社區", "成人書庫", "成人情色", "成人情色網站", + "成人聊天室", "成人軟體", "成人黃色網站", "成人圖片", "成人圖片網站", "成人網站", "成人網站導航", "成人論壇", "成人導航", "成人激情小說", "成人激情電影", "成人激情圖片", + "成人激情網站", "死GM", "死全家", "江山如此多嬌txt下載", "江豬媳", "百性閣", "百鳳宮", "老少亂倫", "老師的小穴", "肉穴", "肉具", "肉便器", "肉洞", "肉唇", "肉淫器吞精", + "肉莖", "肉壺", "肉棍", "肉棍幹騷婦", "肉絲褲襪", "肉感炮友", "肉溝", "肉逼", "肉慾", "肉縫", "肉簫", "自拍美穴", "自拍寫真", "自插小穴", "自慰摳穴", "舌頭穴", "色97愛", + "色BB吧", "色色成人", "色狐狸網址", "色界論��", "色書庫", "色狼小說", "色狼論壇", "色迷城", "色情工廠", "色情倚天屠龍記", "色情論壇", "色窩窩", "西班牙蒼蠅水", "你他馬的", + "你他媽的", "你它馬的", "你它媽的", "你她馬的", "你老母", "你娘卡好", "你麻痹", "你媽比", "你媽的", "你媽逼", "吞精", "吞精騷妹", "含屌", "吸精", "吸精少女", "吹蕭", "妓女", + "妓女", "妖媚熟母", "完蛋操", "屁眼", "快樂AV", "我日", "我奸", "我的性啟蒙老師", "我要官人", "我要性交", "我要性交網", "我草", "我做騷妻", "我就去色", "我幹", "我愛我色網址", + "我操", "我操你", "杜冷丁", "狂乳激揺", "狂插", "狂插男根膠囊", "狂插性器具", "男女交歡", "男女蒲典", "男女激情淫亂", "肛交", "肛交吹喇叭", "肛屄", "肛門拳交", "肛門噴水", + "走光偷拍", "足腳交", "迅雷三級影片", "那娘錯比", "那嗎B", "那嗎老比", "那嗎逼", "那嗎瘟比", "那嗎錯比", "乳尻", "乳交", "乳此絲襪", "乳射", "乳爆", "乳霸", "亞洲有碼", + "亞洲性交電影", "亞洲性虐", "亞洲情色網", "亞洲淫娃", "亞洲插穴圖", "供應化學冰", "供應天然咖啡因", "供應可哥精", "供應四氫吡喃酮", "供應奶油冰", "供應甲基可哥堿", + "供應甲基苯丙胺", "供應白冰", "供應冰糖", "供應咖啡鹼", "供應咖啡鹼", "供應青蒿素", "供應胡椒基甲基", "供應氫化可的松", "供應麥角醇", "供應麻果丸子", "供應麻黃素", + "供應麻穀", "供應植物冰", "供應氯胺酮", "供應無水咖啡因", "供應黃冰", "供應黃體酮", "供應罌粟殼", "供應鹽酸氯", "供應鹽酸羥亞胺", "兩性淫亂地址", "制幻劑", "制服狩", + "制服美婦", "制服誘惑", "叔嫂肉慾", "夜色王朝", "夜色貴族", "奇淫寶鑒", "妹妹陰毛", "妹妹騷圖", "屄", "屄毛", "屄屄特寫", "性之站", "性奴", "性奴會", "性用品", "性交", + "性交自拍", "性交吞精", "性交易", "性交無碼", "性交圖", "性交課", "性免費電影", "性兩", "性具", "性服務", "性虎", "性虎色網", "性派對", "性虐", "性虐待", "性息", "性高潮", + "性聊", "性無能", "性視頻", "性傭", "性愛", "性愛韋小寶之玩女大王", "性愛淫圖", "性愛插穴", "性愛視頻下載", "性愛圖", "性愛擂臺", "性感肉絲", "性感妖嬈", "性感沙灘2", + "性感乳娘", "性感誘惑", "性感騷女", "性遊戲", "性夢", "性福", "性福源", "性戰擂臺", "性饑渴", "抽插", "拍肩迷藥", "拔屄", "拔屄自拍", "招妓", "招鶏", "放尿", "放蕩少婦", + "放蕩少婦賓館", "放蕩熟女", "明星淫圖", "明星裸體照", "東北xx網", "東京丸井買賣", "東洋屄", "松島楓迅雷下載", "波霸乳交器具", "狗b", "狗日", "狗卵子", "狗娘", "狗娘養的", + "狗狼養的", "狗養", "狗操", "玩穴", "玩逼", "肏", "肏屄", "肥逼", "花和尚導航", "花都逍遙鄉村春光", "花樣性交", "近親相奸", "近親相姦", "金毛穴", "金鱗豈是池中物全本", + "亮穴", "亮屄", "俏臀攝魄", "俗人島", "前凸後翹", "咪咪圖片", "咬著龜頭", "品穴", "品色堂", "品色堂網址", "品香堂", "哇嘎成人三級", "姦染", "姦情", "姦淫", "姦淫", + "姦淫電車", "姫辱", "屌人也", "屌女也", "屌他", "屌她", "屌你", "屌我", "屌妳", "帝國夜色", "挑情", "春光外瀉", "春藥", "柔陰術", "毒品出售", "毒龍舔腳", "洗腸射尿", + "流淫", "流蜜汁", "炮友之家", "相奸", "紅蜘蛛迷奸藥", "美女b毛圖", "美女成人", "美女吞精", "美女性交真圖", "美女面對面激情裸聊", "美女高潮", "美女淫穴", "美女聊天室", + "美女視頻聊天室", "美女祼聊", "美女激情視頻網", "美幼", "美穴", "美乳", "美乳美穴", "美乳鬥豔", "美臀夾陰", "美臀嫰穴", "美騷婦", "美體豔姿", "胡瘟", "虐奴", "虐戀花園", + "要色色", "訂購大冰磚", "訂購苯基丙酮", "訂購氯胺酮", "訂購鹽酸羥亞胺", "迫奸", "風騷欲女", "風��淫蕩", "風豔閣", "食精", "香水型迷奸藥", "香煙迷藥催眠迷幻藥", "原味絲襪", + "哭母", "哭爸", "唐僧和粉塵女子的性愛生活", "套弄花心", "射奶", "射爽", "射精", "射顏", "恥辱輪奸", "拳交", "捏你鶏巴", "捏弄", "桃園蜜洞", "浪女", "浪叫", "浪穴", + "浪婦", "浴尿", "浴室亂倫", "浴室幹騷女系列", "海洛因", "狼友", "神經病", "秘唇", "粉穴", "粉屄", "粉紅穴", "胯下呻吟", "胸濤乳浪", "草你娘", + "草你媽", "草你媽", "草擬媽", "迷幻藥", "迷失禦花園", "迷奸", "迷奸系列", "迷奸香水", "迷奸藥", "迷情水", "迷情藥製作方法", "迷魂藥", + "迷魂藥三唑侖", "迷藥", "迷藥迷情藥", "針孔偷拍", "馬白勺", "高效三唑侖", "高級逼", "高清性愛", "高潮白漿", "高潮集錦", "高麗棒子", + "鬼畜輪奸", "鬼輪姦", "假陽具插穴", "做愛", "做愛自拍", "做愛電影", "做愛圖片", "偷拍美穴", "偷窺圖片", "偷歡照片", "動漫色圖", "娼", + "婊子", "婬亂軍團", "寂寞自摸", "密穴", "密穴貼圖", "採花堂", "採花網", "梅花屄", "欲仙欲死", "欲仙欲浪", "欲海天龍傳", "殺你一家", + "殺你全家", "淩辱", "淫B", "淫女", "淫水", "淫叫", "淫奴", "淫母", "淫汁", "淫穴", "淫穴裡騷水", "淫穴騷水", "淫奸電影", "淫肉誘惑", + "淫色", "淫色貼圖", "淫告白", "淫妞", "淫妹", "淫妻", "淫妻交換", "淫姐", "淫店", "淫東方", "淫河", "淫娃", "淫流", "淫虐", + "淫師蕩母", "淫書", "淫浪", "淫婦", "淫情", "淫液", "淫貨", "淫絲蕩襪", "淫腔", "淫亂工作", "淫亂診所", "淫亂潮吹", "淫亂熟女", + "淫逼", "淫圖", "淫網", "淫蜜", "淫慾", "淫樣", "淫漿", "淫賤", "淫戰群P", "淫蕩迷情藥", "淫蕩貴婦", "淫糜", "淫聲浪語", "淫穢", + "淫穢", "淫穢bt電影", "淫穢圖片", "淫獸學園", "淫癡", "淫魔", "淫驢屯", "爽穴", "猖妓", "猛插", "猛操狂射", "現代情色小說", "羞恥母", + "聊色", "處女開包", "被幹", "被操", "販賣king粉", "販賣搖頭丸", "逍遙遊論壇", "速效迷奸藥", "造愛", "野外性交", "陰戶", "陰毛", "陰水", + "陰穴新玩法", "陰屄", "陰門", "陰阜", "陰阜高聳", "陰莖插小穴", "陰道圖片", "雪腿玉胯", "麻古製作工藝", "婷婷激情聊天室", "媚藥少年", + "就去日", "廁奴", "廁所偷拍", "廁所盜攝", "扉之陰", "掰穴", "掰穴打洞", "掰穴皮卡丘", "提供K粉", "提供冰毒", "提供氯胺酮", "提供鹽酸羥亞胺", + "插b", "插比", "插穴", "插穴手淫", "插穴止癢", "插穴圖", "插老師穴", "插你媽", "插姐姐嫩穴", "插後庭", "插陰莖", "插進", "插逼", "插暴", + "換妻", "朝天穴", "氯胺酮出貨", "氯胺酮技術轉讓", "氯胺酮到貨", "氯胺酮訂購", "氯胺酮電話", "無毛穴", "無毛美少女", "無套自拍", "無碼長片", + "無碼炮圖", "無碼做愛", "無碼淫女", "無碼淫漫", "無碼無套", "無碼精選", "無碼體驗", "發浪", "發騷", "硝酸甘油炸藥製造", "童顏巨乳", "絲襪足交", + "絲襪高跟", "絲襪淫婦", "腚", "菅野亞梨沙迅雷下載", "菊花洞", "街頭扒衣", "買胡椒基甲基酮", "買賣小冰磚", "買賣四氫吡喃酮", "買賣黃麻素", "買賣鹽酸羥亞胺", + "超毛大鮑", "酥穴", "酥胸誘惑", "酥癢", "開苞", "陽具", "陽痿", "集體性愛", "集體淫", "黃牙籤出售", "黃色成人網站", "黃色妹妹a級大片", "黃色妹妹a級大片", + "黑毛屄", "黑屄", "黑逼", "亂交", "亂倫", "亂輪", "傻比", "塞你公", "塞你母", "塞你老母", "塞你老師", "塞你爸", "塞你娘", "媽B", "媽比", "媽白勺", "媽批", + "媽的", "媽媽色", "媽逼", "嫐屄", "幹78", "幹78", "幹GY", "幹GY", "幹一家", "幹七八", "幹人也", "幹入", "幹女也", "幹他", "幹他媽", "幹它", "幹尼", + "幹穴", "幹全家", "幹她", "幹她媽", "幹死", "幹死你", "幹汝", "幹你", "幹你老比", "幹你老母", "幹你良", "幹你娘", "幹你媽", "幹你媽b", "幹你媽逼", "幹我", + "幹牠", "幹妳", "幹妳老母", "幹妳娘", "幹妳馬", "幹妳媽", "幹拎娘", "幹林", "幹炮", "幹砲", "幹勒", "幹啦", "幹您", "幹您娘", "幹逼", "幹機", "幹機掰", + "幹雞", "幹爆", "微型袖珍手狗", "想上你", "惹火自拍", "愛幼閣", "愛色cc", "愛妻淫穴", "愛液", "愛液橫流", "愛愛", "搖頭丸", "搖頭丸", "新金瓶梅", "極品奶妹", + "極品白虎", "極品波神", "極品波霸", "極品金髮美女美穴圖", "歇逼", "經典炮圖", "群P", "群交", "群交亂舞", "群奸", "群奸亂交", "群奸輪射", "群陰會", "群魔色舞", + "聖泉學淫", "萬淫堂", "裙下風光", "裙內偷拍", "跨下呻吟", "農夫電影", "逼毛", "逼奸", "逼樣", "逼癢", "嫖妓指南", "嫖娼", "嫩b", "嫩BB", "嫩女", "嫩奶", "嫩穴", + "嫩屄", "嫩逼", "嫩鮑", "嫩鮑魚", "嫩縫", "對準桃源洞口", "摳穴", "摸你鶏巴", "摸陰蒂", "漏逼", "瑪雅網", "瘋狂抽送", "瘋狗", "監禁陵辱", "碧香亭", "精液", + "精液浴", "精液榨取", "緄", "緊穴", "緊縛淩辱", "舔B", "舔奶", "舔穴", "舔屁眼", "舔弄大陰唇", "舔弄小雞雞", "舔屄", "舔腳", "舔逼", "舔雞巴", "蒙汗藥", + "蜜穴", "蜜洞", "蜜桃成熟時", "裸聊網站", "裸陪", "裸照圖片", "裸露自拍", "裸體少婦", "裹本", "製作氯胺酮", "製作鹽酸羥亞胺", "製造緬古合成", "製造緬古合成", + "誘色uu", "誘姦", "誘惑視頻", "豪乳", "銀民吧", "劌", "噴精", "噴霧蒙汗藥", "墮淫", "嫵媚挑逗", "慰春情", "撅起大白腚", "暴力虐待", "暴奸", "暴乳", "暴淫", + "暴幹", "歐美大乳", "歐美無套", "潮噴", "熟女亂倫", "熟女顏射", "熟婦騷器", "窮逼", "線上激情電影", "蓮花逼", "蝴蝶逼", "調教性奴", "調教虐待", "豬操", + "賣手槍", "賣比", "賣海洛因", "賣淫", "賣騷", "賤", "賤B", "賤bi", "賤人", "賤比", "賤貨", "賤逼", "賤種", "賫", "輪奸", "輪暴", "輪操", "銷售king粉", + "銷售乙醚", "銷售天然咖啡因", "銷售水晶冰", "銷售北朝鮮冰", "銷售可哥精", "銷售左旋麻黃素", "銷售甲基苯丙", "銷售冰古", "銷售苯基丙酮", "銷售純古", + "銷售麻古果子", "銷售麻黃素", "銷售間苯三酚", "銷售黃綠牙籤", "銷售羥基環戊基", "銷售趙氏弓弩", "銷售鄰氯苯晴", "銷售鹽酸氯胺酮", "銷售鹽酸羥亞胺", + "銷魂洞", "鋝", "靠北", "靠母", "靠爸", "魅惑巨乳", "懆您娘", "懆您媽", "操b", "操B指南", "操人也", "操女也", "操比", "操他", "操母狗", "操穴", + "操穴噴水", "操她", "操死", "操你", "操你媽", "操我", "操妳", "操妻", "操屄", "操射", "操爽", "操蛋", "操腫", "操逼", "操機掰", "操爛騷婦", + "操爛騷貨", "機8", "機Y", "機Y", "機八", "機巴", "機叭", "機芭", "機掰", "激凸走光", "激情打炮", "激情交友", "激情聊天", "激情圖片", "激情裸體", + "激情潮噴", "激插", "蕆", "蕩女", "蕩妹", "蕩婦", "閶", "龜公", "龜兒子", "龜孫子", "龜頭對準陰道", "濕穴", "濕身誘惑", "濫B", "濫比", "濫交", "濫貨", + "濫逼", "縱情兵團", "賽你老母", "賽妳阿母", "闃", "鴻圖記", "點色論壇", "翹臀嫩穴", "翹臀嫩逼", "豐唇豔姬", "雙管獵槍買賣", "雙龍入洞", "雜交", "雜種", + "雞8", "雞Y", "雞Y", "雞八", "雞巴", "雞巴暴脹", "雞叭", "雞奸", "雞吧", "雞芭", "雞掰", "顏射", "顏射自拍", "顏騎", "懶叫", "懶教", "爆乳人妻", + "爆乳娘", "爆操", "獸交", "獸奸", "癟三", "癡乳", "鶏8", "鶏八", "鶏女", "鶏巴", "鶏奸", "鶏吧", "鶏院", "麗春苑", "罌粟", "騷B", "騷女", "騷女叫春", + "騷水", "騷包", "騷母", "騷穴", "騷卵", "騷乳", "騷妹", "騷妻", "騷姐姐", "騷屄", "騷姨媽", "騷洞", "騷浪", "騷浪美女", "騷婦掰B", "騷婦露逼", "騷貨", + "騷棍", "騷棒", "騷逼", "騷逼噴水", "騷鶏", "灌滿精液", "爛b", "爛比", "爛袋", "爛貨", "爛逼", "蘚鮑", "覽叫", "露B", "露穴", "露屄", "露陰照", "露逼", + "鷄巴", "囅", "鹽酸氯胺酮", "鹽酸羥亞胺", "豔母淫臀", "豔乳", "豔婦淫女", "豔情小說", "豔舞淫業", "死ね", "ばかやろ", "クソゲー", "死ね", +} + +var Emoji = &[]string{ + "🖕🏻", "👌🏻👈🏻", "👉🏻👌🏻", "🤏🏻", "🖕", "🖕🏼", "🖕🏽", "🖕🏾", "🖕🏿", ":middle_finger:", +} + +const ( + DGeneral int = iota + 1 + DMinor + DSexual + DBelittle + DRace + DParent + DPolitics + DEnglish + DJapanese + DChinese + DSpecial +) + +type TrieNode struct { + children map[rune]*TrieNode + isEnd bool +} + +type Trie struct { + Root *TrieNode +} + +func NewTrie() *Trie { + return &Trie{ + Root: &TrieNode{ + children: make(map[rune]*TrieNode), + }, + } +} + +func (t *Trie) Insert(word string) { + node := t.Root + for _, ch := range word { + if _, ok := node.children[ch]; !ok { + node.children[ch] = &TrieNode{children: make(map[rune]*TrieNode)} + } + node = node.children[ch] + } + node.isEnd = true +} + +func (t *Trie) Search(word string) bool { + node := t.Root + for _, ch := range word { + if _, ok := node.children[ch]; !ok { + return false + } + node = node.children[ch] + } + return node.isEnd +} + +type WordEntry struct { + Word string + WType int +} + +func (w WordEntry) Less(than btree.Item) bool { + return w.Word < than.(WordEntry).Word +} + +var ( + ProfanityTrie = NewTrie() + + BTree = btree.New(8) + + Mu sync.RWMutex +) diff --git a/cmd/korcen/korcen_test.go b/cmd/korcen/korcen_test.go new file mode 100644 index 0000000..b29b372 --- /dev/null +++ b/cmd/korcen/korcen_test.go @@ -0,0 +1,19 @@ +package korcen + +import ( + "fmt" + "testing" + + "github.com/fluffy-melli/korcen-go" +) + +func Benchmark0(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + korcen.Check("") + } +} + +func Test0(t *testing.T) { + fmt.Println(korcen.Check("")) +} diff --git a/docs/README.EN.md b/docs/README.EN.md new file mode 100644 index 0000000..40bf014 --- /dev/null +++ b/docs/README.EN.md @@ -0,0 +1,95 @@ +
+

Korcen.go

+ + [![Go Version](https://github.com/fluffy-melli/korcen-go/blob/main/docs/asset/go_version.svg)](https://go.dev/) + [![Module Version](https://github.com/fluffy-melli/korcen-go/blob/main/docs/asset/module_version.svg)](https://pkg.go.dev/github.com/fluffy-melli/korcen-go) +
+
+

+ KR / + EN +

+
+ +![131_20220604170616](https://user-images.githubusercontent.com/85154556/171998341-9a7439c8-122f-4a9f-beb6-0e0b3aad05ed.png) + +# 🛠 Maker + +>[Tanat05](https://github.com/Tanat05) / [korcen](https://github.com/Tanat05/korcen) +``` +https://github.com/Tanat05/korcen +--------------------------------- +This project is a modified version of the original `korcen` +The original project can be found at `https://github.com/Tanat05/korcen` + +This project also follows the Apache-2.0 license. +``` + +>[gyarang](https://github.com/gyarang) / [gohangul](https://github.com/gyarang/gohangul) +``` +https://github.com/gyarang/gohangul +----------------------------------- +This project is distributed using `gohangul` +You can find the project at `https://github.com/gyarang/gohangul` + +It also follows the MIT License, which is the license for the respective project. +``` + +![Apache-2.0](https://github.com/fluffy-melli/korcen-go/blob/main/docs/asset/Apache-2.0.png) + +`korcen-go `follows both the `Apache-2.0` and `MIT License` licenses. +Please comply with the license terms when using the code. + +Copyright© All rights reserved. + +--- + +# ❓ Main Features + +```diff +[Inappropriate Language Detection] +- General inappropriate language +- Minor inappropriate language +- Sexual language or expressions +- Derogatory expressions +- Racially discriminatory inappropriate expressions +- Language that belittles or attacks parents +- Politically inappropriate language or expressions +- Inappropriate expressions in English +- Inappropriate expressions in Japan +- Inappropriate expressions in China +- Other special inappropriate expressions +``` + +--- + +# ⬇️ Installation + +>mod +```sh +$ go get github.com/fluffy-melli/korcen-go +L Since version 0.7.0, the function output has changed, so please be cautious when using it. +``` + +>golang code example +```go +package main + +import ( + "fmt" + + "github.com/fluffy-melli/korcen-go" +) + +func main() { + // Discord Message Event Logic + ck := korcen.Check("MESSAGE") + if ck.Detect { + dtif := ck.Swear[0] + message := ck.NewText[:dtif.Start] + "\x1b[1m\x1b[41m\"" + ck.NewText[dtif.Start:dtif.End] + "\"\x1b[0m" + ck.NewText[dtif.End:] + discord_ansi := "```ansi\n" + message + "\n```" + fmt.Println(discord_ansi) + } + // Discord Send Logic +} +``` \ No newline at end of file diff --git a/docs/asset/Apache-2.0.png b/docs/asset/Apache-2.0.png new file mode 100644 index 0000000000000000000000000000000000000000..b8c745a181634b6e07c497de3f2db74f1286c53b GIT binary patch literal 18047 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

lOb_6Ev(4MaF=mtE5Sd5kcB}AwIq{6P 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�TcO|y$+)Av)b7=T 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 literal 0 HcmV?d00001 diff --git a/docs/asset/go_version.svg b/docs/asset/go_version.svg new file mode 100644 index 0000000..d9fb783 --- /dev/null +++ b/docs/asset/go_version.svg @@ -0,0 +1,11 @@ + + go version: v+1.x + + + + + + go version + +1.0 + + \ No newline at end of file diff --git a/docs/asset/module_version.svg b/docs/asset/module_version.svg new file mode 100644 index 0000000..0b6f8c7 --- /dev/null +++ b/docs/asset/module_version.svg @@ -0,0 +1,11 @@ + + module version: + + + + + + version + v1.0.2 + + \ No newline at end of file diff --git a/example/example.go b/example/example.go new file mode 100644 index 0000000..c17e5db --- /dev/null +++ b/example/example.go @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + + "github.com/fluffy-melli/korcen-go" +) + +func main() { + korcen.InitProfanityData() + + sampleInput := "MESSAGE" + + ck := korcen.Check(sampleInput) + + if ck.Detect { + for _, dtif := range ck.Swear { + message := ck.NewText[:dtif.Start] + + "\x1b[1m\x1b[41m\"" + ck.NewText[dtif.Start:dtif.End] + "\"\x1b[0m" + + ck.NewText[dtif.End:] + + discord_ansi := "```ansi\n" + message + "\n```" + fmt.Println(discord_ansi) + } + } else { + fmt.Println("비속어가 감지되지 않았습니다.") + } + +} diff --git a/example/go.mod b/example/go.mod new file mode 100644 index 0000000..e8e958d --- /dev/null +++ b/example/go.mod @@ -0,0 +1,7 @@ +module example + +go 1.22.2 + +require github.com/fluffy-melli/korcen-go v0.7.0 + +require github.com/gyarang/gohangul v0.1.3 // indirect diff --git a/example/go.sum b/example/go.sum new file mode 100644 index 0000000..f95f7c4 --- /dev/null +++ b/example/go.sum @@ -0,0 +1,6 @@ +github.com/fluffy-melli/korcen-go v0.1.0 h1:TI3rStYX/nPWb1fNwUMcvchZWhtdxRFqTE5/zhJBl4Q= +github.com/fluffy-melli/korcen-go v0.1.0/go.mod h1:cclxwoGf9aauztGqW8gBVXnkRlHzXXG2TU9g2wZOhQ8= +github.com/fluffy-melli/korcen-go v0.7.0 h1:8MlfxR+e5/Y79XfagY6fZ1JyYievjBeBCkO6uQqfpoU= +github.com/fluffy-melli/korcen-go v0.7.0/go.mod h1:cL952GbuEyzsCAxsf7cZLUfPGR/hkTtsDyZePAXqdNw= +github.com/gyarang/gohangul v0.1.3 h1:UV5TCR2+XheNr+q79nJoHCzDyUow4Z/AmOqxZqm3SvQ= +github.com/gyarang/gohangul v0.1.3/go.mod h1:EzJMLXEkhFBcEgmMNklqj6vlZh+cBv4AzAcyz7KU2Mw= diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..85361d8 --- /dev/null +++ b/go.mod @@ -0,0 +1,7 @@ +module github.com/fluffy-melli/korcen-go + +go 1.20 + +require github.com/gyarang/gohangul v0.1.3 + +require github.com/google/btree v1.1.3 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..ae75ff0 --- /dev/null +++ b/go.sum @@ -0,0 +1,4 @@ +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/gyarang/gohangul v0.1.3 h1:UV5TCR2+XheNr+q79nJoHCzDyUow4Z/AmOqxZqm3SvQ= +github.com/gyarang/gohangul v0.1.3/go.mod h1:EzJMLXEkhFBcEgmMNklqj6vlZh+cBv4AzAcyz7KU2Mw= diff --git a/korcen.go b/korcen.go new file mode 100644 index 0000000..f1cd898 --- /dev/null +++ b/korcen.go @@ -0,0 +1,128 @@ +package korcen + +import ( + "strings" + "sync" + + "github.com/fluffy-melli/korcen-go/cache" +) + +type CheckInfo struct { + Detect bool + NewText string + Swear []IndexOF +} + +type IndexOF struct { + Swear string + Type int + Start int + End int +} + +func InitProfanityData() { + dataMap := map[*[]string]int{ + cache.General: cache.DGeneral, + cache.Minor: cache.DMinor, + cache.Sexual: cache.DSexual, + cache.Belittle: cache.DBelittle, + cache.Race: cache.DRace, + cache.Parent: cache.DParent, + cache.Politics: cache.DPolitics, + cache.English: cache.DEnglish, + cache.Japanese: cache.DJapanese, + cache.Chinese: cache.DChinese, + cache.Emoji: cache.DSpecial, + } + + var wg sync.WaitGroup + + for listPtr, wtype := range dataMap { + words := *listPtr + wg.Add(1) + go func(wordSlice []string, t int) { + defer wg.Done() + for _, w := range wordSlice { + word := strings.ToLower(strings.TrimSpace(w)) + if word == "" { + continue + } + cache.Mu.Lock() + cache.ProfanityTrie.Insert(word) + cache.BTree.ReplaceOrInsert(cache.WordEntry{Word: word, WType: t}) + cache.Mu.Unlock() + } + }(words, wtype) + } + + wg.Wait() +} + +func findCandidatesByTrie(input string) []string { + words := strings.Fields(input) + candidates := make([]string, 0) + + for _, w := range words { + wLower := strings.ToLower(w) + if cache.ProfanityTrie.Search(wLower) { + candidates = append(candidates, wLower) + } + } + return candidates +} + +func Check(input string) *CheckInfo { + newInput := strings.ToLower(input) + candidates := findCandidatesByTrie(newInput) + + if len(candidates) == 0 { + return &CheckInfo{ + Detect: false, + NewText: newInput, + Swear: nil, + } + } + + detected := false + indexList := make([]IndexOF, 0, len(candidates)) + + var wg sync.WaitGroup + resultChan := make(chan IndexOF, len(candidates)) + + for _, word := range candidates { + wg.Add(1) + go func(wd string) { + defer wg.Done() + cache.Mu.RLock() + defer cache.Mu.RUnlock() + + found := cache.BTree.Get(cache.WordEntry{Word: wd}) + if found != nil { + we := found.(cache.WordEntry) + pos := strings.Index(newInput, wd) + if pos != -1 { + resultChan <- IndexOF{ + Swear: wd, + Type: we.WType, + Start: pos, + End: pos + len(wd), + } + } + } + }(word) + } + + wg.Wait() + close(resultChan) + + for r := range resultChan { + indexList = append(indexList, r) + detected = true + } + + return &CheckInfo{ + Detect: detected, + NewText: newInput, + Swear: indexList, + } +} diff --git a/replace.go b/replace.go new file mode 100644 index 0000000..8d724ac --- /dev/null +++ b/replace.go @@ -0,0 +1,961 @@ +package korcen + +import ( + "strings" + "unicode" + + "github.com/fluffy-melli/korcen-go/cache" + "github.com/gyarang/gohangul" +) + +func ChangeUnicode(unicode string) string { + //unicode = strings.ToLower(unicode) + unicode = RemoveDomain(unicode) + unicode = strings.ReplaceAll(unicode, "ㅿ", "ㅅ") + unicode = strings.ReplaceAll(unicode, "^", "ㅅ") + unicode = strings.ReplaceAll(unicode, "^", "ㅅ") + unicode = strings.ReplaceAll(unicode, "ハ", "ㅅ") + unicode = strings.ReplaceAll(unicode, "人", "ㅅ") + unicode = strings.ReplaceAll(unicode, "∧", "ㅅ") + unicode = strings.ReplaceAll(unicode, "/\", "ㅅ") + unicode = strings.ReplaceAll(unicode, "/\", "ㅅ") + unicode = strings.ReplaceAll(unicode, "㉦", "ㅅ") + unicode = strings.ReplaceAll(unicode, "甘", "ㅂ") + unicode = strings.ReplaceAll(unicode, "廿", "ㅂ") + unicode = strings.ReplaceAll(unicode, "己", "ㄹ") + unicode = strings.ReplaceAll(unicode, "卜", "ㅏ") + //unicode = strings.ReplaceAll(unicode, "l", "ㅣ") + //unicode = strings.ReplaceAll(unicode, "r", "ㅏ") + unicode = strings.ReplaceAll(unicode, "ト", "ㅏ") + unicode = strings.ReplaceAll(unicode, "ᐲ", "ㅅ") + unicode = strings.ReplaceAll(unicode, "ᗨ", "ㅂ") + unicode = strings.ReplaceAll(unicode, "𝗌", "s") + unicode = strings.ReplaceAll(unicode, "𝗌", "s") + unicode = strings.ReplaceAll(unicode, "𝘴", "s") + unicode = strings.ReplaceAll(unicode, "𝙨", "s") + unicode = strings.ReplaceAll(unicode, "𝚜", "s") + unicode = strings.ReplaceAll(unicode, "𝐬", "s") + unicode = strings.ReplaceAll(unicode, "𝑠", "s") + unicode = strings.ReplaceAll(unicode, "𝒔", "s") + unicode = strings.ReplaceAll(unicode, "𝓈", "s") + unicode = strings.ReplaceAll(unicode, "𝓼", "s") + unicode = strings.ReplaceAll(unicode, "𝔰", "s") + unicode = strings.ReplaceAll(unicode, "𝖘", "s") + unicode = strings.ReplaceAll(unicode, "𝕤", "s") + unicode = strings.ReplaceAll(unicode, "s", "s") + unicode = strings.ReplaceAll(unicode, "ş", "s") + unicode = strings.ReplaceAll(unicode, "ⓢ", "s") + unicode = strings.ReplaceAll(unicode, "⒮", "s") + unicode = strings.ReplaceAll(unicode, "🅢", "s") + unicode = strings.ReplaceAll(unicode, "🆂", "s") + unicode = strings.ReplaceAll(unicode, "🅂", "s") + unicode = strings.ReplaceAll(unicode, "𝑺", "s") + unicode = strings.ReplaceAll(unicode, "𝖾", "e") + unicode = strings.ReplaceAll(unicode, "𝘦", "e") + unicode = strings.ReplaceAll(unicode, "𝙚", "e") + unicode = strings.ReplaceAll(unicode, "𝚎", "e") + unicode = strings.ReplaceAll(unicode, "𝐞", "e") + unicode = strings.ReplaceAll(unicode, "𝑒", "e") + unicode = strings.ReplaceAll(unicode, "𝒆", "e") + unicode = strings.ReplaceAll(unicode, "ℯ", "e") + unicode = strings.ReplaceAll(unicode, "𝓮", "e") + unicode = strings.ReplaceAll(unicode, "𝔢", "e") + unicode = strings.ReplaceAll(unicode, "𝖊", "e") + unicode = strings.ReplaceAll(unicode, "𝕖", "e") + unicode = strings.ReplaceAll(unicode, "e", "e") + unicode = strings.ReplaceAll(unicode, "ė", "e") + unicode = strings.ReplaceAll(unicode, "ⓔ", "e") + unicode = strings.ReplaceAll(unicode, "⒠", "e") + unicode = strings.ReplaceAll(unicode, "🅔", "e") + unicode = strings.ReplaceAll(unicode, "🅴", "e") + unicode = strings.ReplaceAll(unicode, "🄴", "e") + unicode = strings.ReplaceAll(unicode, "є", "e") + unicode = strings.ReplaceAll(unicode, "𝗑", "x") + unicode = strings.ReplaceAll(unicode, "𝘹", "x") + unicode = strings.ReplaceAll(unicode, "𝙭", "x") + unicode = strings.ReplaceAll(unicode, "𝚡", "x") + unicode = strings.ReplaceAll(unicode, "𝐱", "x") + unicode = strings.ReplaceAll(unicode, "𝑥", "x") + unicode = strings.ReplaceAll(unicode, "𝒙", "x") + unicode = strings.ReplaceAll(unicode, "𝓍", "x") + unicode = strings.ReplaceAll(unicode, "𝔁", "x") + unicode = strings.ReplaceAll(unicode, "𝔵", "x") + unicode = strings.ReplaceAll(unicode, "𝖝", "x") + unicode = strings.ReplaceAll(unicode, "𝕩", "x") + unicode = strings.ReplaceAll(unicode, "x", "x") + unicode = strings.ReplaceAll(unicode, "ⓧ", "x") + unicode = strings.ReplaceAll(unicode, "⒳", "x") + unicode = strings.ReplaceAll(unicode, "🅧", "x") + unicode = strings.ReplaceAll(unicode, "🆇", "x") + unicode = strings.ReplaceAll(unicode, "🅇", "x") + unicode = strings.ReplaceAll(unicode, "₨", "rs") + unicode = strings.ReplaceAll(unicode, "ų", "u") + unicode = strings.ReplaceAll(unicode, "ç", "c") + unicode = strings.ReplaceAll(unicode, "F", "F") + unicode = strings.ReplaceAll(unicode, "K", "K") + unicode = strings.ReplaceAll(unicode, "C", "C") + unicode = strings.ReplaceAll(unicode, "U", "U") + unicode = strings.ReplaceAll(unicode, "し ", "ㅣ") + //unicode = strings.ReplaceAll(unicode, "i ", "ㅣ") + //unicode = strings.ReplaceAll(unicode, "l ", "ㅣ") + unicode = strings.ReplaceAll(unicode, "の ", "ㅇ") + unicode = strings.ReplaceAll(unicode, "ㅁ ", "ㅁ") + unicode = strings.ReplaceAll(unicode, "口 ", "ㅁ") + unicode = strings.ReplaceAll(unicode, "曰 ", "ㅁ") + unicode = strings.ReplaceAll(unicode, "H", "ㅐ") + unicode = strings.ReplaceAll(unicode, "H", "ㅐ") + unicode = strings.ReplaceAll(unicode, "ス", "ㅈ") + unicode = strings.ReplaceAll(unicode, "へ", "ㅅ") + unicode = strings.ReplaceAll(unicode, "旦", "므") + unicode = strings.ReplaceAll(unicode, "畀", "뷰") + unicode = strings.ReplaceAll(unicode, "%", "응") + unicode = strings.ReplaceAll(unicode, "_", "ㅡ") + unicode = strings.ReplaceAll(unicode, "-", "ㅡ") + unicode = strings.ReplaceAll(unicode, "/", "ㅣ") + unicode = strings.ReplaceAll(unicode, "人", "ㅅ") + unicode = strings.ReplaceAll(unicode, "ŭ", "ㅐ") + unicode = strings.ReplaceAll(unicode, "Ð", "ㅇ") + //unicode = strings.ReplaceAll(unicode, "o", "ㅇ") + //unicode = strings.ReplaceAll(unicode, "c", "ㄷ") + //unicode = strings.ReplaceAll(unicode, "b", "ㅂ") + //unicode = strings.ReplaceAll(unicode, "u", "ㅂ") + //unicode = strings.ReplaceAll(unicode, "v", "ㅂ") + unicode = RemoveDuplicate(unicode) + unicode = RemoveNumber(unicode) + unicode = RemoveEnglish(unicode) + dism := gohangul.Disassemble(unicode) + unicode = gohangul.Assemble(dism) + unicode = After(unicode) + unicode = PreGeneral(unicode) + unicode = PreMinor(unicode) + unicode = PreSexual(unicode) + unicode = PreBelittle(unicode) + unicode = PrePolitics(unicode) + unicode = RemoveJ(unicode) + return unicode +} + +func After(input string) string { + input = strings.ReplaceAll(input, "자아", "자") + input = strings.ReplaceAll(input, "가아", "가") + input = strings.ReplaceAll(input, "나아", "나") + input = strings.ReplaceAll(input, "세엑", "섹") + input = strings.ReplaceAll(input, "세에", "섹") + return input +} + +func RemoveDomain(input string) string { + input = strings.ReplaceAll(input, "http://", "") + input = strings.ReplaceAll(input, "https://", "") + input = strings.ReplaceAll(input, "youtu.be", "") + input = strings.ReplaceAll(input, "youtube.com", "") + input = strings.ReplaceAll(input, "google.com", "") + input = strings.ReplaceAll(input, "facebook.com", "") + input = strings.ReplaceAll(input, "amazon.com", "") + input = strings.ReplaceAll(input, "apple.com", "") + input = strings.ReplaceAll(input, "microsoft.com", "") + input = strings.ReplaceAll(input, "twitter.com", "") + input = strings.ReplaceAll(input, "instagram.com", "") + input = strings.ReplaceAll(input, "wikipedia.org", "") + input = strings.ReplaceAll(input, "yahoo.com", "") + input = strings.ReplaceAll(input, "linkedin.com", "") + input = strings.ReplaceAll(input, "x.com", "") + input = strings.ReplaceAll(input, ".us", "") + input = strings.ReplaceAll(input, ".uk", "") + input = strings.ReplaceAll(input, ".ca", "") + input = strings.ReplaceAll(input, ".de", "") + input = strings.ReplaceAll(input, ".fr", "") + input = strings.ReplaceAll(input, ".jp", "") + input = strings.ReplaceAll(input, ".co.kr", "") + input = strings.ReplaceAll(input, ".kr", "") + input = strings.ReplaceAll(input, ".cn", "") + input = strings.ReplaceAll(input, ".in", "") + input = strings.ReplaceAll(input, ".au", "") + input = strings.ReplaceAll(input, ".com", "") + input = strings.ReplaceAll(input, ".org", "") + input = strings.ReplaceAll(input, ".net", "") + input = strings.ReplaceAll(input, ".edu", "") + input = strings.ReplaceAll(input, ".gov", "") + input = strings.ReplaceAll(input, ".mil", "") + input = strings.ReplaceAll(input, ".co", "") + input = strings.ReplaceAll(input, ".int", "") + input = strings.ReplaceAll(input, ".tech", "") + input = strings.ReplaceAll(input, ".ai", "") + input = strings.ReplaceAll(input, ".io", "") + input = strings.ReplaceAll(input, ".app", "") + input = strings.ReplaceAll(input, ".tv", "") + input = strings.ReplaceAll(input, ".store", "") + input = strings.ReplaceAll(input, ".club", "") + input = strings.ReplaceAll(input, ".me", "") + input = strings.ReplaceAll(input, ".xyz", "") + input = strings.ReplaceAll(input, ".online", "") + input = strings.ReplaceAll(input, "?v=", "") + input = strings.ReplaceAll(input, "?si=", "") + return input +} + +func RemoveDuplicate(input string) string { + var result strings.Builder + var prevRune rune + for i, currentRune := range input { + if (i == 0 || currentRune != prevRune) && (unicode.IsLetter(currentRune) || unicode.IsDigit(currentRune) || unicode.IsSpace(currentRune)) { + result.WriteRune(currentRune) + } + prevRune = currentRune + } + return result.String() +} + +func RemoveJ(input string) string { + input = strings.ReplaceAll(input, "ㅏ", "") + input = strings.ReplaceAll(input, "ㅑ", "") + input = strings.ReplaceAll(input, "ㅓ", "") + input = strings.ReplaceAll(input, "ㅕ", "") + input = strings.ReplaceAll(input, "ㅛ", "") + input = strings.ReplaceAll(input, "ㅜ", "") + input = strings.ReplaceAll(input, "ㅠ", "") + input = strings.ReplaceAll(input, "ㅡ", "") + input = strings.ReplaceAll(input, "ㅣ", "") + input = strings.ReplaceAll(input, "ㅐ", "") + input = strings.ReplaceAll(input, "ㅔ", "") + input = strings.ReplaceAll(input, "ㅘ", "") + input = strings.ReplaceAll(input, "ㅙ", "") + input = strings.ReplaceAll(input, "ㅚ", "") + input = strings.ReplaceAll(input, "ㅝ", "") + input = strings.ReplaceAll(input, "ㅞ", "") + input = strings.ReplaceAll(input, "ㅟ", "") + input = strings.ReplaceAll(input, "ㅢ", "") + input = strings.ReplaceAll(input, "ㆎ", "") + return input +} + +func RemoveEnglish(input string) string { + input = strings.ReplaceAll(input, "ha", "") + input = strings.ReplaceAll(input, "hi", "") + input = strings.ReplaceAll(input, "hag", "") + input = strings.ReplaceAll(input, "ham", "") + input = strings.ReplaceAll(input, "hat", "") + input = strings.ReplaceAll(input, "hem", "") + input = strings.ReplaceAll(input, "her", "") + input = strings.ReplaceAll(input, "hex", "") + input = strings.ReplaceAll(input, "hic", "") + input = strings.ReplaceAll(input, "him", "") + input = strings.ReplaceAll(input, "his", "") + input = strings.ReplaceAll(input, "hiv", "") + input = strings.ReplaceAll(input, "hmo", "") + input = strings.ReplaceAll(input, "hod", "") + input = strings.ReplaceAll(input, "hog", "") + input = strings.ReplaceAll(input, "hot", "") + input = strings.ReplaceAll(input, "hub", "") + input = strings.ReplaceAll(input, "hug", "") + input = strings.ReplaceAll(input, "hum", "") + input = strings.ReplaceAll(input, "ssh", "") + input = strings.ReplaceAll(input, "cat", "") + input = strings.ReplaceAll(input, "watch", "") + input = strings.ReplaceAll(input, "status", "") + return input +} + +func KoToEnglish(input string) string { + cache.BlacklistMu.Lock() + van := input + val, ex := cache.Blacklist[input] + cache.BlacklistMu.Unlock() + if ex { + return val + } + dism := gohangul.Disassemble(input) + input = string(dism) + input = strings.ReplaceAll(input, "ㅁ", "a") + input = strings.ReplaceAll(input, "ㅠ", "b") + input = strings.ReplaceAll(input, "ㅊ", "c") + input = strings.ReplaceAll(input, "ㅇ", "d") + input = strings.ReplaceAll(input, "ㄷ", "e") + input = strings.ReplaceAll(input, "ㄹ", "f") + input = strings.ReplaceAll(input, "ㅎ", "g") + input = strings.ReplaceAll(input, "ㅗ", "h") + input = strings.ReplaceAll(input, "ㅑ", "i") + input = strings.ReplaceAll(input, "ㅓ", "j") + input = strings.ReplaceAll(input, "ㅏ", "k") + input = strings.ReplaceAll(input, "ㅣ", "l") + input = strings.ReplaceAll(input, "ㅡ", "m") + input = strings.ReplaceAll(input, "ㅜ", "n") + input = strings.ReplaceAll(input, "ㅐ", "o") + input = strings.ReplaceAll(input, "ㅔ", "p") + input = strings.ReplaceAll(input, "ㅂ", "q") + input = strings.ReplaceAll(input, "ㄱ", "r") + input = strings.ReplaceAll(input, "ㄴ", "s") + input = strings.ReplaceAll(input, "ㅅ", "t") + input = strings.ReplaceAll(input, "ㅕ", "u") + input = strings.ReplaceAll(input, "ㅍ", "v") + input = strings.ReplaceAll(input, "ㅈ", "w") + input = strings.ReplaceAll(input, "ㅌ", "x") + input = strings.ReplaceAll(input, "ㅛ", "y") + input = strings.ReplaceAll(input, "ㅋ", "z") + cache.BlacklistMu.Lock() + cache.Blacklist[van] = input + cache.BlacklistMu.Unlock() + return input +} + +func EnglishToKo(input string) string { + input = strings.ReplaceAll(input, "a", "ㅁ") + input = strings.ReplaceAll(input, "b", "ㅠㅠ") + input = strings.ReplaceAll(input, "c", "ㅊ") + input = strings.ReplaceAll(input, "d", "ㅇ") + input = strings.ReplaceAll(input, "e", "ㄷ") + input = strings.ReplaceAll(input, "f", "ㄹ") + input = strings.ReplaceAll(input, "g", "ㅎ") + input = strings.ReplaceAll(input, "h", "ㅗ") + input = strings.ReplaceAll(input, "i", "ㅑ") + input = strings.ReplaceAll(input, "j", "ㅓ") + input = strings.ReplaceAll(input, "k", "ㅏ") + input = strings.ReplaceAll(input, "l", "ㅣ") + input = strings.ReplaceAll(input, "m", "ㅡ") + input = strings.ReplaceAll(input, "n", "ㅜ") + input = strings.ReplaceAll(input, "o", "ㅐ") + input = strings.ReplaceAll(input, "p", "ㅔ") + input = strings.ReplaceAll(input, "q", "ㅂ") + input = strings.ReplaceAll(input, "r", "ㄱ") + input = strings.ReplaceAll(input, "s", "ㄴ") + input = strings.ReplaceAll(input, "t", "ㅅ") + input = strings.ReplaceAll(input, "u", "ㅕ") + input = strings.ReplaceAll(input, "v", "ㅍ") + input = strings.ReplaceAll(input, "w", "ㅈ") + input = strings.ReplaceAll(input, "x", "ㅌ") + input = strings.ReplaceAll(input, "y", "ㅛ") + input = strings.ReplaceAll(input, "z", "ㅋ") + dism := gohangul.Disassemble(input) + input = gohangul.Assemble(dism) + return input +} + +func RemoveNumber(input string) string { + input = strings.ReplaceAll(input, "0", "") + input = strings.ReplaceAll(input, "1", "") + input = strings.ReplaceAll(input, "2", "") + input = strings.ReplaceAll(input, "3", "") + input = strings.ReplaceAll(input, "4", "") + input = strings.ReplaceAll(input, "5", "") + input = strings.ReplaceAll(input, "6", "") + input = strings.ReplaceAll(input, "7", "") + input = strings.ReplaceAll(input, "8", "") + input = strings.ReplaceAll(input, "9", "") + return input +} + +func PreGeneral(input string) string { + input = strings.ReplaceAll(input, "丨발", "시발") + input = strings.ReplaceAll(input, "丨벌", "시발") + input = strings.ReplaceAll(input, "丨바", "시발") + input = strings.ReplaceAll(input, "ㅗ먹어", "ㅗ") + input = strings.ReplaceAll(input, "오ㅗㅗ", "") + input = strings.ReplaceAll(input, "오ㅗ", "") + input = strings.ReplaceAll(input, "해ㅗㅗ", "") + input = strings.ReplaceAll(input, "해ㅗ", "") + input = strings.ReplaceAll(input, "호ㅗㅗ", "") + input = strings.ReplaceAll(input, "호ㅗ", "") + input = strings.ReplaceAll(input, "로ㅗㅗ", "") + input = strings.ReplaceAll(input, "로ㅗ", "") + input = strings.ReplaceAll(input, "옹ㅗㅗ", "") + input = strings.ReplaceAll(input, "옹ㅗ", "") + input = strings.ReplaceAll(input, "롤ㅗㅗ", "") + input = strings.ReplaceAll(input, "롤ㅗ", "") + input = strings.ReplaceAll(input, "요ㅗ", "") + input = strings.ReplaceAll(input, "우ㅗ", "") + input = strings.ReplaceAll(input, "하ㅗ", "") + input = strings.ReplaceAll(input, "ㅗㅗ오", "") + input = strings.ReplaceAll(input, "ㅗ오", "") + input = strings.ReplaceAll(input, "ㅗㅗ호", "") + input = strings.ReplaceAll(input, "ㅗ호", "") + input = strings.ReplaceAll(input, "ㅗㅗ로", "") + input = strings.ReplaceAll(input, "ㅗ로", "") + input = strings.ReplaceAll(input, "ㅗㅗ옹", "") + input = strings.ReplaceAll(input, "ㅗ옹", "") + input = strings.ReplaceAll(input, "ㅗㅗ롤", "") + input = strings.ReplaceAll(input, "ㅗ롤", "") + input = strings.ReplaceAll(input, "ㅗ요", "") + input = strings.ReplaceAll(input, "ㅗ우", "") + input = strings.ReplaceAll(input, "ㅗ하", "") + input = strings.ReplaceAll(input, "오ㅗㅗㅗㅗ", "") + input = strings.ReplaceAll(input, "오ㅗㅗㅗ", "") + input = strings.ReplaceAll(input, "호ㅗㅗㅗㅗ", "") + input = strings.ReplaceAll(input, "호ㅗㅗㅗ", "") + input = strings.ReplaceAll(input, "로ㅗㅗㅗㅗ", "") + input = strings.ReplaceAll(input, "로ㅗㅗㅗ", "") + input = strings.ReplaceAll(input, "옹ㅗㅗㅗㅗ", "") + input = strings.ReplaceAll(input, "옹ㅗㅗㅗ", "") + input = strings.ReplaceAll(input, "롤ㅗㅗㅗㅗ", "") + input = strings.ReplaceAll(input, "롤ㅗㅗㅗ", "") + input = strings.ReplaceAll(input, "요ㅗㅗㅗ", "") + input = strings.ReplaceAll(input, "우ㅗㅗㅗ", "") + input = strings.ReplaceAll(input, "하ㅗㅗㅗ", "") + input = strings.ReplaceAll(input, "ㅇㅗ", "") + input = strings.ReplaceAll(input, "ㅗㄷ", "") + input = strings.ReplaceAll(input, "ㅗㅜ", "") + input = strings.ReplaceAll(input, "rㅗ", "") + input = strings.ReplaceAll(input, "ㅗr", "") + input = strings.ReplaceAll(input, "sㅗ", "") + input = strings.ReplaceAll(input, "ㅗs", "") + input = strings.ReplaceAll(input, "eㅗ", "") + input = strings.ReplaceAll(input, "ㅗe", "") + input = strings.ReplaceAll(input, "fㅗ", "") + input = strings.ReplaceAll(input, "ㅗf", "") + input = strings.ReplaceAll(input, "aㅗ", "") + input = strings.ReplaceAll(input, "ㅗa", "") + input = strings.ReplaceAll(input, "qㅗ", "") + input = strings.ReplaceAll(input, "ㅗq", "") + input = strings.ReplaceAll(input, "ㅗw", "") + input = strings.ReplaceAll(input, "wㅗ", "") + input = strings.ReplaceAll(input, "ㅗd", "") + input = strings.ReplaceAll(input, "dㅗ", "") + input = strings.ReplaceAll(input, "ㅗg", "") + input = strings.ReplaceAll(input, "gㅗ", "") + input = strings.ReplaceAll(input, "dㅗ", "") + input = strings.ReplaceAll(input, "118", "") + input = strings.ReplaceAll(input, "218", "") + input = strings.ReplaceAll(input, "318", "") + input = strings.ReplaceAll(input, "418", "") + input = strings.ReplaceAll(input, "518", "") + input = strings.ReplaceAll(input, "618", "") + input = strings.ReplaceAll(input, "718", "") + input = strings.ReplaceAll(input, "818", "") + input = strings.ReplaceAll(input, "918", "") + input = strings.ReplaceAll(input, "018", "") + input = strings.ReplaceAll(input, "련", "놈") + input = strings.ReplaceAll(input, "뇬", "놈") + input = strings.ReplaceAll(input, "놈", "놈") + input = strings.ReplaceAll(input, "넘", "놈") + input = strings.ReplaceAll(input, "8분", "") + input = strings.ReplaceAll(input, "시ㅣ", "시") + input = strings.ReplaceAll(input, "씨ㅣ", "씨") + input = strings.ReplaceAll(input, "ㅅ1", "시") + input = strings.ReplaceAll(input, "ㅍㅅㅍ", "") + input = strings.ReplaceAll(input, "발 닦", "") + input = strings.ReplaceAll(input, "동시 8", "") + input = strings.ReplaceAll(input, "8시발", "시발") + input = strings.ReplaceAll(input, "8시 ", "") + input = strings.ReplaceAll(input, "!wt ㅂㅇ", "") + input = strings.ReplaceAll(input, "!ㅈㅅ ㅂㅇ", "") + input = strings.ReplaceAll(input, "다시 방", "") + input = strings.ReplaceAll(input, "시 불이익", "") + input = strings.ReplaceAll(input, "다시 바꿀", "") + input = strings.ReplaceAll(input, "다시 바꿔", "") + input = strings.ReplaceAll(input, "다시 불러", "") + input = strings.ReplaceAll(input, "다시 불안", "") + input = strings.ReplaceAll(input, "하시바라 이노스케", "") + input = strings.ReplaceAll(input, "할 시", "") + input = strings.ReplaceAll(input, "불러드", "") + input = strings.ReplaceAll(input, "시발음", "") + input = strings.ReplaceAll(input, "시발택시", "") + input = strings.ReplaceAll(input, "시발자동차", "") + input = strings.ReplaceAll(input, "정치발", "") + input = strings.ReplaceAll(input, "시발점", "") + input = strings.ReplaceAll(input, "시발유", "") + input = strings.ReplaceAll(input, "시발역", "") + input = strings.ReplaceAll(input, "시발수뢰", "") + input = strings.ReplaceAll(input, "아저씨바", "") + input = strings.ReplaceAll(input, "아저씨발", "") + input = strings.ReplaceAll(input, "시바견", "") + input = strings.ReplaceAll(input, "벌어", "") + input = strings.ReplaceAll(input, "시바이누", "") + input = strings.ReplaceAll(input, "시바스리갈", "") + input = strings.ReplaceAll(input, "시바산", "") + input = strings.ReplaceAll(input, "시바신", "") + input = strings.ReplaceAll(input, "오리발", "") + input = strings.ReplaceAll(input, "발끝", "") + input = strings.ReplaceAll(input, "다시바", "") + input = strings.ReplaceAll(input, "다시팔", "") + input = strings.ReplaceAll(input, "비슈누시바", "") + input = strings.ReplaceAll(input, "시바핫카이", "") + input = strings.ReplaceAll(input, "시바타이쥬", "") + input = strings.ReplaceAll(input, "데스티니시바", "") + input = strings.ReplaceAll(input, "시바루", "") + input = strings.ReplaceAll(input, "시바료타로", "") + input = strings.ReplaceAll(input, "시바라스시", "") + input = strings.ReplaceAll(input, "임시방편", "") + input = strings.ReplaceAll(input, "젤리", "") + input = strings.ReplaceAll(input, "발사", "") + input = strings.ReplaceAll(input, "크시야", "") + input = strings.ReplaceAll(input, "크시", "") + input = strings.ReplaceAll(input, "어찌", "") + input = strings.ReplaceAll(input, "가시방석", "") + input = strings.ReplaceAll(input, "발로란트방", "") + input = strings.ReplaceAll(input, "발로란트", "") + input = strings.ReplaceAll(input, "발로", "") + input = strings.ReplaceAll(input, "씨발라", "") + input = strings.ReplaceAll(input, "무시발언", "") + input = strings.ReplaceAll(input, "일시불", "") + input = strings.ReplaceAll(input, "우리", "") + input = strings.ReplaceAll(input, "혹시", "") + input = strings.ReplaceAll(input, "아조씨", "") + input = strings.ReplaceAll(input, "아저씨", "") + input = strings.ReplaceAll(input, "바로", "") + input = strings.ReplaceAll(input, "저거시", "") + input = strings.ReplaceAll(input, "우리발", "") + input = strings.ReplaceAll(input, "피시방", "") + input = strings.ReplaceAll(input, "피씨방", "") + input = strings.ReplaceAll(input, "방장", "") + input = strings.ReplaceAll(input, "시바사키", "") + input = strings.ReplaceAll(input, "시발차", "") + input = strings.ReplaceAll(input, "구로역 시발", "") + input = strings.ReplaceAll(input, "로벅스", "") + input = strings.ReplaceAll(input, "쉬바나", "") + input = strings.ReplaceAll(input, "벌었는데", "") + input = strings.ReplaceAll(input, "엠씨방", "") + input = strings.ReplaceAll(input, "빨리", "") + input = strings.ReplaceAll(input, "파엠", "") + input = strings.ReplaceAll(input, "벌금", "") + input = strings.ReplaceAll(input, "시방향", "") + input = strings.ReplaceAll(input, "불법", "") + input = strings.ReplaceAll(input, "발릴", "") + input = strings.ReplaceAll(input, "발표", "") + input = strings.ReplaceAll(input, "방송", "") + input = strings.ReplaceAll(input, "역시", "") + input = strings.ReplaceAll(input, "바보", "") + input = strings.ReplaceAll(input, "쿨리발리", "") + input = strings.ReplaceAll(input, "슈발리에", "") + input = strings.ReplaceAll(input, "방탄", "") + input = strings.ReplaceAll(input, "방어", "") + input = strings.ReplaceAll(input, "발표", "") + input = strings.ReplaceAll(input, "상시", "") + input = strings.ReplaceAll(input, "슈발리에", "") + input = strings.ReplaceAll(input, "아", "") + input = strings.ReplaceAll(input, "이", "") + input = strings.ReplaceAll(input, "일", "") + input = strings.ReplaceAll(input, "의", "") + input = strings.ReplaceAll(input, "즉시발급", "") + input = strings.ReplaceAll(input, "련", "놈") + input = strings.ReplaceAll(input, "뇬", "놈") + input = strings.ReplaceAll(input, "놈", "놈") + input = strings.ReplaceAll(input, "넘", "놈") + input = strings.ReplaceAll(input, "련", "놈") + input = strings.ReplaceAll(input, "뇬", "놈") + input = strings.ReplaceAll(input, "놈", "놈") + input = strings.ReplaceAll(input, "넘", "놈") + input = strings.ReplaceAll(input, "opgg", "") + input = strings.ReplaceAll(input, "op.gg", "") + input = strings.ReplaceAll(input, "g랄", "지랄") + input = strings.ReplaceAll(input, "ji랄", "지랄") + input = strings.ReplaceAll(input, "己", "ㄹ") + input = strings.ReplaceAll(input, "있지", "") + input = strings.ReplaceAll(input, "없지", "") + input = strings.ReplaceAll(input, "하지", "") + input = strings.ReplaceAll(input, "알았지", "") + input = strings.ReplaceAll(input, "몰랐지", "") + input = strings.ReplaceAll(input, "근데", "") + input = strings.ReplaceAll(input, "지근거", "") + input = strings.ReplaceAll(input, "지근하", "") + input = strings.ReplaceAll(input, "지근지근", "") + input = strings.ReplaceAll(input, "지근속근", "") + input = strings.ReplaceAll(input, "속든지근", "") + input = strings.ReplaceAll(input, "미지근", "") + input = strings.ReplaceAll(input, "근", "ㄹ") + input = strings.ReplaceAll(input, "ㄹㅇ", "") + input = strings.ReplaceAll(input, "있지", "") + input = strings.ReplaceAll(input, "없지", "") + input = strings.ReplaceAll(input, "하지", "") + input = strings.ReplaceAll(input, "지랄탄", "") + input = strings.ReplaceAll(input, "지랄버릇", "") + input = strings.ReplaceAll(input, "이", "") + input = strings.ReplaceAll(input, "알았지", "") + input = strings.ReplaceAll(input, "몰랐지", "") + input = strings.ReplaceAll(input, "근데", "") + input = strings.ReplaceAll(input, "0등신", "") + input = strings.ReplaceAll(input, "1등신", "") + input = strings.ReplaceAll(input, "2등신", "") + input = strings.ReplaceAll(input, "3등신", "") + input = strings.ReplaceAll(input, "4등신", "") + input = strings.ReplaceAll(input, "5등신", "") + input = strings.ReplaceAll(input, "6등신", "") + input = strings.ReplaceAll(input, "7등신", "") + input = strings.ReplaceAll(input, "8등신", "") + input = strings.ReplaceAll(input, "9등신", "") + input = strings.ReplaceAll(input, "빙", "병") + input = strings.ReplaceAll(input, "븅", "병") + input = strings.ReplaceAll(input, "등", "병") + input = strings.ReplaceAll(input, "붱", "병") + input = strings.ReplaceAll(input, "뵝", "병") + input = strings.ReplaceAll(input, "뼝", "병") + input = strings.ReplaceAll(input, "싄", "신") + input = strings.ReplaceAll(input, "씬", "신") + input = strings.ReplaceAll(input, "우", "") + input = strings.ReplaceAll(input, "웅", "") + input = strings.ReplaceAll(input, "융", "") + input = strings.ReplaceAll(input, "유", "") + input = strings.ReplaceAll(input, "영", "") + input = strings.ReplaceAll(input, "엉", "") + input = strings.ReplaceAll(input, "전염병", "") + input = strings.ReplaceAll(input, "감염병", "") + input = strings.ReplaceAll(input, "화염병", "") + input = strings.ReplaceAll(input, "왜꺼져", "") + input = strings.ReplaceAll(input, "꺼져요", "") + input = strings.ReplaceAll(input, "이꺼져", "") + input = strings.ReplaceAll(input, "꺼져서", "") + input = strings.ReplaceAll(input, "내꺼져", "") + input = strings.ReplaceAll(input, "제꺼져", "") + input = strings.ReplaceAll(input, "꺼져있", "") + input = strings.ReplaceAll(input, "꺼져잇", "") + input = strings.ReplaceAll(input, "꺼져도", "") + input = strings.ReplaceAll(input, "계속꺼져", "") + input = strings.ReplaceAll(input, "꺼져가", "") + input = strings.ReplaceAll(input, "^", "ㅅ") + input = strings.ReplaceAll(input, "H", "ㅐ") + input = strings.ReplaceAll(input, "새로", "") + input = strings.ReplaceAll(input, "77", "ㄲ") + input = strings.ReplaceAll(input, "l", "ㅣ") + input = strings.ReplaceAll(input, "10새", "새끼") + input = strings.ReplaceAll(input, "10섹", "새끼") + input = strings.ReplaceAll(input, "10쌔", "새끼") + input = strings.ReplaceAll(input, "10쎄", "새끼") + input = strings.ReplaceAll(input, "10새", "새끼") + input = strings.ReplaceAll(input, "10쉑", "새끼") + input = strings.ReplaceAll(input, "의새끼", "") + input = strings.ReplaceAll(input, "애", "") + input = strings.ReplaceAll(input, "에", "") + input = strings.ReplaceAll(input, "루세끼", "") + input = strings.ReplaceAll(input, "시세끼", "") + input = strings.ReplaceAll(input, "세끼먹", "") + input = strings.ReplaceAll(input, "고양이새끼", "") + input = strings.ReplaceAll(input, "호랑이새끼", "") + input = strings.ReplaceAll(input, "용새끼", "") + input = strings.ReplaceAll(input, "말새끼", "") + input = strings.ReplaceAll(input, "사자새끼", "") + input = strings.ReplaceAll(input, "범새끼", "") + input = strings.ReplaceAll(input, "삵새끼", "") + input = strings.ReplaceAll(input, "키보드", "") + input = strings.ReplaceAll(input, "새끼손", "") + input = strings.ReplaceAll(input, "셰리프", "") + input = strings.ReplaceAll(input, "로쉐리", "") + input = strings.ReplaceAll(input, "丕", "조") + input = strings.ReplaceAll(input, "刀卜", "까") + input = strings.ReplaceAll(input, "줫습니다", "") + input = strings.ReplaceAll(input, "줫음", "") + input = strings.ReplaceAll(input, "줫잖아", "") + input = strings.ReplaceAll(input, "줫겠지", "") + input = strings.ReplaceAll(input, "쫒아", "") + input = strings.ReplaceAll(input, "쫒는", "") + input = strings.ReplaceAll(input, "쫒기다", "") + input = strings.ReplaceAll(input, "쫒기라", "") + input = strings.ReplaceAll(input, "쫒기로", "") + input = strings.ReplaceAll(input, "쫒기를", "") + input = strings.ReplaceAll(input, "쫒기며", "") + input = strings.ReplaceAll(input, "쫒기는", "") + input = strings.ReplaceAll(input, "쫒기나", "") + input = strings.ReplaceAll(input, "쫒겨", "") + input = strings.ReplaceAll(input, "쫒겻", "") + input = strings.ReplaceAll(input, "쫒겼", "") + input = strings.ReplaceAll(input, "쫒았", "") + input = strings.ReplaceAll(input, "쫒다", "") + input = strings.ReplaceAll(input, "쫒고", "") + input = strings.ReplaceAll(input, "줫는", "") + input = strings.ReplaceAll(input, "줫어", "") + input = strings.ReplaceAll(input, "줬는", "") + input = strings.ReplaceAll(input, "줫군", "") + input = strings.ReplaceAll(input, "줬다", "") + input = strings.ReplaceAll(input, "줬어", "") + input = strings.ReplaceAll(input, "천조", "") + input = strings.ReplaceAll(input, "쫒기", "") + input = strings.ReplaceAll(input, "해줫더니", "") + input = strings.ReplaceAll(input, "줫다", "") + input = strings.ReplaceAll(input, "내쫒은", "") + input = strings.ReplaceAll(input, "내쫒다", "") + input = strings.ReplaceAll(input, "좇아", "") + input = strings.ReplaceAll(input, "0개", "") + input = strings.ReplaceAll(input, "1개", "") + input = strings.ReplaceAll(input, "2개", "") + input = strings.ReplaceAll(input, "3개", "") + input = strings.ReplaceAll(input, "4개", "") + input = strings.ReplaceAll(input, "5개", "") + input = strings.ReplaceAll(input, "6개", "") + input = strings.ReplaceAll(input, "7개", "") + input = strings.ReplaceAll(input, "8개", "") + input = strings.ReplaceAll(input, "9개", "") + input = strings.ReplaceAll(input, "0개", "") + input = strings.ReplaceAll(input, "1년", "") + input = strings.ReplaceAll(input, "2년", "") + input = strings.ReplaceAll(input, "3년", "") + input = strings.ReplaceAll(input, "4년", "") + input = strings.ReplaceAll(input, "5년", "") + input = strings.ReplaceAll(input, "6년", "") + input = strings.ReplaceAll(input, "7년", "") + input = strings.ReplaceAll(input, "8년", "") + input = strings.ReplaceAll(input, "9년", "") + input = strings.ReplaceAll(input, "🐕", "개") + input = strings.ReplaceAll(input, "🐦", "새") + input = strings.ReplaceAll(input, "재밌게 놈", "") + input = strings.ReplaceAll(input, "있게", "") + input = strings.ReplaceAll(input, "년생", "") + input = strings.ReplaceAll(input, "무지개색", "") + input = strings.ReplaceAll(input, "떠돌이개", "") + input = strings.ReplaceAll(input, "에게", "") + input = strings.ReplaceAll(input, "넘는", "") + input = strings.ReplaceAll(input, "소개", "") + input = strings.ReplaceAll(input, "생긴게", "") + input = strings.ReplaceAll(input, "날개같다", "") + return input +} + +func PreMinor(input string) string { + input = strings.ReplaceAll(input, "년", "놈") + input = strings.ReplaceAll(input, "련", "놈") + input = strings.ReplaceAll(input, "거미", "") + input = strings.ReplaceAll(input, "친구", "") + input = strings.ReplaceAll(input, "개미", "") + input = strings.ReplaceAll(input, "이미친", "") + input = strings.ReplaceAll(input, "미친증", "") + input = strings.ReplaceAll(input, "동그라미", "") + input = strings.ReplaceAll(input, "미틴", "미친") + input = strings.ReplaceAll(input, "년", "놈") + input = strings.ReplaceAll(input, "련", "놈") + input = strings.ReplaceAll(input, "뒤져봐야", "") + input = strings.ReplaceAll(input, "뒤질뻔", "") + input = strings.ReplaceAll(input, "뒤져보다", "") + input = strings.ReplaceAll(input, "뒤져보는", "") + input = strings.ReplaceAll(input, "뒤져보고", "") + input = strings.ReplaceAll(input, "뒤져간다", "") + input = strings.ReplaceAll(input, "뒤져서", "") + input = strings.ReplaceAll(input, "뒤져본", "") + input = strings.ReplaceAll(input, "뒤져봄", "") + input = strings.ReplaceAll(input, "뒤져볼", "") + return input +} + +func PreSexual(input string) string { + input = strings.ReplaceAll(input, "보지도 못", "") + input = strings.ReplaceAll(input, "보지도 않", "") + input = strings.ReplaceAll(input, "인가 보지", "") + input = strings.ReplaceAll(input, "면접 보지", "") + input = strings.ReplaceAll(input, "영화 보지", "") + input = strings.ReplaceAll(input, "애니 보지", "") + input = strings.ReplaceAll(input, "만화 보지", "") + input = strings.ReplaceAll(input, "사진 보지", "") + input = strings.ReplaceAll(input, "그림 보지", "") + input = strings.ReplaceAll(input, "면접보지", "") + input = strings.ReplaceAll(input, "영화보지", "") + input = strings.ReplaceAll(input, "애니보지", "") + input = strings.ReplaceAll(input, "만화보지", "") + input = strings.ReplaceAll(input, "사진보지", "") + input = strings.ReplaceAll(input, "그림보지", "") + input = strings.ReplaceAll(input, "을 보지", "") + input = strings.ReplaceAll(input, "나 보지", "") + input = strings.ReplaceAll(input, "못 보지", "") + input = strings.ReplaceAll(input, "안 보지", "") + input = strings.ReplaceAll(input, "왜 보지", "") + input = strings.ReplaceAll(input, "뭐 보지", "") + input = strings.ReplaceAll(input, "다 보지", "") + input = strings.ReplaceAll(input, "빨리 보지", "") + input = strings.ReplaceAll(input, "보지도 마", "") + input = strings.ReplaceAll(input, "보지는 않", "") + input = strings.ReplaceAll(input, "보지안으", "") + input = strings.ReplaceAll(input, "보지안아", "") + input = strings.ReplaceAll(input, "게 보지", "") + input = strings.ReplaceAll(input, "어케 보지", "") + input = strings.ReplaceAll(input, "보g", "보지") + input = strings.ReplaceAll(input, "하나보지", "") + input = strings.ReplaceAll(input, "켜보지", "") + input = strings.ReplaceAll(input, "보지맙", "") + input = strings.ReplaceAll(input, "초보지", "") + input = strings.ReplaceAll(input, "로보지", "") + input = strings.ReplaceAll(input, "가보지", "") + input = strings.ReplaceAll(input, "홍보지", "") + input = strings.ReplaceAll(input, "서보지", "") + input = strings.ReplaceAll(input, "보지금", "") + input = strings.ReplaceAll(input, "보지못", "") + input = strings.ReplaceAll(input, "정지금", "") + input = strings.ReplaceAll(input, "걸보지", "") + input = strings.ReplaceAll(input, "보지는", "") + input = strings.ReplaceAll(input, "보지지", "") + input = strings.ReplaceAll(input, "보지않", "") + input = strings.ReplaceAll(input, "해보지", "") + input = strings.ReplaceAll(input, "보지마", "") + input = strings.ReplaceAll(input, "보지말", "") + input = strings.ReplaceAll(input, "안보지만", "") + input = strings.ReplaceAll(input, "정보", "") + input = strings.ReplaceAll(input, "지팡이", "") + input = strings.ReplaceAll(input, "행보", "") + input = strings.ReplaceAll(input, "바보지", "") + input = strings.ReplaceAll(input, "바보짓", "") + input = strings.ReplaceAll(input, "물어보지", "") + input = strings.ReplaceAll(input, "하시나보지", "") + input = strings.ReplaceAll(input, "언제 자지", "") + input = strings.ReplaceAll(input, "언제자지", "") + input = strings.ReplaceAll(input, "잠 자지", "") + input = strings.ReplaceAll(input, "자지 말자고", "") + input = strings.ReplaceAll(input, " 지급", "") + input = strings.ReplaceAll(input, "남자지", "") + input = strings.ReplaceAll(input, "여자지", "") + input = strings.ReplaceAll(input, "감자지", "") + input = strings.ReplaceAll(input, "왁자지", "") + input = strings.ReplaceAll(input, "자지러", "") + input = strings.ReplaceAll(input, "개발자", "") + input = strings.ReplaceAll(input, "관리자", "") + input = strings.ReplaceAll(input, "약탈자", "") + input = strings.ReplaceAll(input, "타자지", "") + input = strings.ReplaceAll(input, "혼자", "") + input = strings.ReplaceAll(input, "자지원", "") + input = strings.ReplaceAll(input, "사용자", "") + input = strings.ReplaceAll(input, "경력자", "") + input = strings.ReplaceAll(input, "지식", "") + input = strings.ReplaceAll(input, "자지마", "") + input = strings.ReplaceAll(input, "자지말", "") + input = strings.ReplaceAll(input, "지원자", "") + input = strings.ReplaceAll(input, "부자지", "") + input = strings.ReplaceAll(input, "혜자지", "") + input = strings.ReplaceAll(input, "잘 자지", "") + input = strings.ReplaceAll(input, "일자지", "") + input = strings.ReplaceAll(input, "일찍 자지", "") + input = strings.ReplaceAll(input, "지원", "") + input = strings.ReplaceAll(input, "자지금", "") + input = strings.ReplaceAll(input, "자지않", "") + input = strings.ReplaceAll(input, "어케자지", "") + input = strings.ReplaceAll(input, "자지도마", "") + input = strings.ReplaceAll(input, "자지는않", "") + input = strings.ReplaceAll(input, "자지좀마", "") + input = strings.ReplaceAll(input, "안자지", "") + input = strings.ReplaceAll(input, "못자지", "") + input = strings.ReplaceAll(input, "자지금", "") + input = strings.ReplaceAll(input, "지건", "") + input = strings.ReplaceAll(input, "감자", "") + input = strings.ReplaceAll(input, "아", "") + input = strings.ReplaceAll(input, "cess", "") + input = strings.ReplaceAll(input, "```css", "") + input = strings.ReplaceAll(input, "ex)", "") + input = strings.ReplaceAll(input, "exit", "") + input = strings.ReplaceAll(input, "ext", "") + input = strings.ReplaceAll(input, "images", "") + input = strings.ReplaceAll(input, "https", "") + input = strings.ReplaceAll(input, "(ex", "") + input = strings.ReplaceAll(input, ".ex", "") + input = strings.ReplaceAll(input, "physics", "") + input = strings.ReplaceAll(input, "features", "") + input = strings.ReplaceAll(input, "exam", "") + input = strings.ReplaceAll(input, "phase", "") + input = strings.ReplaceAll(input, "except", "") + input = strings.ReplaceAll(input, "sexual", "") + input = strings.ReplaceAll(input, "sexy", "") + //input = strings.ReplaceAll(input, "엑섹스", "") + //input = strings.ReplaceAll(input, "엑", "") + input = strings.ReplaceAll(input, "0ㅑ", "야") + input = strings.ReplaceAll(input, "야스오", "") + input = strings.ReplaceAll(input, "크시야", "") + input = strings.ReplaceAll(input, "카구야", "") + input = strings.ReplaceAll(input, "스파이", "") + input = strings.ReplaceAll(input, "말이야", "") + input = strings.ReplaceAll(input, "스티브", "") + input = strings.ReplaceAll(input, "스쿼드", "") + input = strings.ReplaceAll(input, "파랑색", "") + input = strings.ReplaceAll(input, "오야스미", "") + input = strings.ReplaceAll(input, "노란색", "") + input = strings.ReplaceAll(input, "빨간색", "") + input = strings.ReplaceAll(input, "초록색", "") + input = strings.ReplaceAll(input, "보라색", "") + input = strings.ReplaceAll(input, "청색", "") + input = strings.ReplaceAll(input, "보라색", "") + input = strings.ReplaceAll(input, "핑크색", "") + input = strings.ReplaceAll(input, "남색", "") + input = strings.ReplaceAll(input, "검은색", "") + input = strings.ReplaceAll(input, "하양색", "") + input = strings.ReplaceAll(input, "주황색", "") + input = strings.ReplaceAll(input, "연두색", "") + input = strings.ReplaceAll(input, "스공", "") + input = strings.ReplaceAll(input, "스시", "") + input = strings.ReplaceAll(input, "스키장", "") + input = strings.ReplaceAll(input, "스킨", "") + input = strings.ReplaceAll(input, "스킬", "") + input = strings.ReplaceAll(input, "스틸", "") + input = strings.ReplaceAll(input, "스탑", "") + input = strings.ReplaceAll(input, "스트레스", "") + input = strings.ReplaceAll(input, "해야", "") + input = strings.ReplaceAll(input, "카시야스", "") + input = strings.ReplaceAll(input, "야스톤", "") + input = strings.ReplaceAll(input, "유니섹스", "") + input = strings.ReplaceAll(input, "스튜디오", "") + input = strings.ReplaceAll(input, "스티커", "") + input = strings.ReplaceAll(input, "위대한", "") + input = strings.ReplaceAll(input, "소유자", "") + input = strings.ReplaceAll(input, "작업자", "") + input = strings.ReplaceAll(input, "자기위로", "자위") + input = strings.ReplaceAll(input, "위대하지", "") + input = strings.ReplaceAll(input, "암살자", "") + input = strings.ReplaceAll(input, "학자", "") + input = strings.ReplaceAll(input, "개발자", "") + input = strings.ReplaceAll(input, "관리자", "") + input = strings.ReplaceAll(input, "약탈자", "") + input = strings.ReplaceAll(input, "사용자", "") + input = strings.ReplaceAll(input, "지원자", "") + input = strings.ReplaceAll(input, "위대한", "") + input = strings.ReplaceAll(input, "소유자", "") + input = strings.ReplaceAll(input, "작업자", "") + input = strings.ReplaceAll(input, "자기위로", "자위") + return input +} + +func PreBelittle(input string) string { + input = strings.ReplaceAll(input, "뇬", "련") + input = strings.ReplaceAll(input, "놈", "련") + input = strings.ReplaceAll(input, "넘", "련") + input = strings.ReplaceAll(input, "련", "년") + input = strings.ReplaceAll(input, "뇬", "년") + input = strings.ReplaceAll(input, "놈", "년") + input = strings.ReplaceAll(input, "넘", "년") + input = strings.ReplaceAll(input, "러운지", "") + input = strings.ReplaceAll(input, "지킬 앤 하이드", "") + input = strings.ReplaceAll(input, "지킬앤하이드", "") + input = strings.ReplaceAll(input, "지킬 엔 하이드", "") + input = strings.ReplaceAll(input, "지킬엔하이드", "") + input = strings.ReplaceAll(input, "려운지", "") + input = strings.ReplaceAll(input, "무서운지", "") + input = strings.ReplaceAll(input, "라운지", "") + input = strings.ReplaceAll(input, "운지법", "") + input = strings.ReplaceAll(input, "싸운지", "") + input = strings.ReplaceAll(input, "운지버섯", "") + input = strings.ReplaceAll(input, "운 지린다", "") + input = strings.ReplaceAll(input, "깔보다", "") + input = strings.ReplaceAll(input, "깔보시", "") + input = strings.ReplaceAll(input, "1년", "") + input = strings.ReplaceAll(input, "2년", "") + input = strings.ReplaceAll(input, "3년", "") + input = strings.ReplaceAll(input, "4년", "") + input = strings.ReplaceAll(input, "5년", "") + input = strings.ReplaceAll(input, "6년", "") + input = strings.ReplaceAll(input, "7년", "") + input = strings.ReplaceAll(input, "8년", "") + input = strings.ReplaceAll(input, "9년", "") + input = strings.ReplaceAll(input, "0년", "") + input = strings.ReplaceAll(input, "더운지역", "") + input = strings.ReplaceAll(input, "나따까리", "") + return input +} + +func PreParent(input string) string { + input = strings.ReplaceAll(input, "ㄴㄴ", "") + input = strings.ReplaceAll(input, "미국", "") + input = strings.ReplaceAll(input, "엄창못", "") + input = strings.ReplaceAll(input, "도", "") + return input +} + +func PrePolitics(input string) string { + input = strings.ReplaceAll(input, "카카오톡", "") + input = strings.ReplaceAll(input, "카톡", "") + input = strings.ReplaceAll(input, "카페", "") + input = strings.ReplaceAll(input, "하다가", "") + input = strings.ReplaceAll(input, "먹다가", "") + input = strings.ReplaceAll(input, "카와이", "") + input = strings.ReplaceAll(input, "카츠", "") + input = strings.ReplaceAll(input, "카레", "") + input = strings.ReplaceAll(input, "니가", "") + input = strings.ReplaceAll(input, "내가", "") + input = strings.ReplaceAll(input, "너가", "") + input = strings.ReplaceAll(input, "우리가", "") + input = strings.ReplaceAll(input, "너희가", "") + input = strings.ReplaceAll(input, "카카오", "") + input = strings.ReplaceAll(input, "너희가", "") + input = strings.ReplaceAll(input, "카세트", "") + input = strings.ReplaceAll(input, "카플레이어", "") + input = strings.ReplaceAll(input, "카운터", "") + input = strings.ReplaceAll(input, "카정", "") + input = strings.ReplaceAll(input, "카드", "") + return input +} diff --git a/v2/LICENSE b/v2/LICENSE new file mode 100644 index 0000000..183a196 --- /dev/null +++ b/v2/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2025 fluffy-melli + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/v2/cache/blacklist.go b/v2/cache/blacklist.go new file mode 100644 index 0000000..86ff564 --- /dev/null +++ b/v2/cache/blacklist.go @@ -0,0 +1,41 @@ +package cache + +import "github.com/fluffy-melli/korcen-go/cache" + +func PreWord() map[string]int { + var cv map[string]int = make(map[string]int) + for _, s := range *cache.English { + cv[s] = len(cv) + } + for _, s := range *cache.General { + cv[s] = len(cv) + } + for _, s := range *cache.Minor { + cv[s] = len(cv) + } + for _, s := range *cache.Sexual { + cv[s] = len(cv) + } + for _, s := range *cache.Belittle { + cv[s] = len(cv) + } + for _, s := range *cache.Race { + cv[s] = len(cv) + } + for _, s := range *cache.Parent { + cv[s] = len(cv) + } + for _, s := range *cache.Politics { + cv[s] = len(cv) + } + for _, s := range *cache.Japanese { + cv[s] = len(cv) + } + for _, s := range *cache.Chinese { + cv[s] = len(cv) + } + for _, s := range *cache.Emoji { + cv[s] = len(cv) + } + return cv +} diff --git a/v2/cache/detect.go b/v2/cache/detect.go new file mode 100644 index 0000000..54dde3c --- /dev/null +++ b/v2/cache/detect.go @@ -0,0 +1,15 @@ +package cache + +var Detect = []string{} +var NotDetect = []string{} + +func PreText() map[string]float64 { + var cv = make(map[string]float64) + for _, s := range Detect { + cv[s] = 1 + } + for _, s := range NotDetect { + cv[s] = 0 + } + return cv +} diff --git a/v2/go.mod b/v2/go.mod new file mode 100644 index 0000000..0dc8562 --- /dev/null +++ b/v2/go.mod @@ -0,0 +1,7 @@ +module github.com/fluffy-melli/korcen-go/v2 + +go 1.22.2 + +require github.com/fluffy-melli/korcen-go v1.0.2 + +require github.com/fluffy-melli/GradFlow v0.0.2 diff --git a/v2/go.sum b/v2/go.sum new file mode 100644 index 0000000..b7c021e --- /dev/null +++ b/v2/go.sum @@ -0,0 +1,6 @@ +github.com/fluffy-melli/GradFlow v0.0.1 h1:seGe/ZADJIaisYzV+dm/W+7TnAz14YDxAejcme3mnYE= +github.com/fluffy-melli/GradFlow v0.0.1/go.mod h1:NpcL+1SgTUNNKF5cdIaTTSPFAyapVuzPG7O7Ag+wXUg= +github.com/fluffy-melli/GradFlow v0.0.2 h1:SPvJCtl0VZM0ynbTaNuVJQiCxw1huA0LzlQvFf+rhNQ= +github.com/fluffy-melli/GradFlow v0.0.2/go.mod h1:NpcL+1SgTUNNKF5cdIaTTSPFAyapVuzPG7O7Ag+wXUg= +github.com/fluffy-melli/korcen-go v1.0.2 h1:svrN7f1cUVxKgiP2jiDSrWr6skFMz3OlV7TbvzwwZTk= +github.com/fluffy-melli/korcen-go v1.0.2/go.mod h1:s6yddpCHLCtfuNohsvDaK7KM8Xk9EMRsRR6gYyajLmQ= diff --git a/v2/korcen.go b/v2/korcen.go new file mode 100644 index 0000000..e9870e7 --- /dev/null +++ b/v2/korcen.go @@ -0,0 +1,18 @@ +package main + +import ( + "github.com/fluffy-melli/GradFlow" + "github.com/fluffy-melli/korcen-go/v2/cache" +) + +// Copyright© All rights reserved. +// _____ _ +// |_ _|_ _ _ __ __ _| |_ +// | |/ _` | '_ \ / _` | __| +// | | (_| | | | | (_| | |_ +// |_|\__,_|_| |_|\__,_|\__| + +func main() { + GD := GradFlow.NewGradientDescent(cache.PreText(), cache.PreWord(), 0.01, 25) + GD.Predict("야옹") +}