{"id":26823920,"url":"https://github.com/romantech/syntax-analyzer","last_synced_at":"2025-07-20T11:33:32.022Z","repository":{"id":190005429,"uuid":"669812711","full_name":"romantech/syntax-analyzer","owner":"romantech","description":"OpenAI를 활용한 영어 구문 분석 / 편집기","archived":false,"fork":false,"pushed_at":"2025-06-12T13:06:31.000Z","size":1492,"stargazers_count":13,"open_issues_count":11,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-12T14:24:06.747Z","etag":null,"topics":["chakra-ui","chatgpt","jotai","openai-api","react","react-hook-form","react-query","typescript"],"latest_commit_sha":null,"homepage":"https://syntax-analyzer.romantech.net","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/romantech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-07-23T14:08:23.000Z","updated_at":"2025-06-12T13:06:33.000Z","dependencies_parsed_at":"2024-05-02T14:17:22.763Z","dependency_job_id":"480c1b9e-cff7-470d-b316-30f3d9ac3d23","html_url":"https://github.com/romantech/syntax-analyzer","commit_stats":null,"previous_names":["romantech/syntax-analyzer"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/romantech/syntax-analyzer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romantech%2Fsyntax-analyzer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romantech%2Fsyntax-analyzer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romantech%2Fsyntax-analyzer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romantech%2Fsyntax-analyzer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/romantech","download_url":"https://codeload.github.com/romantech/syntax-analyzer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romantech%2Fsyntax-analyzer/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266117842,"owners_count":23879126,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chakra-ui","chatgpt","jotai","openai-api","react","react-hook-form","react-query","typescript"],"created_at":"2025-03-30T09:17:09.222Z","updated_at":"2025-07-20T11:33:31.996Z","avatar_url":"https://github.com/romantech.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 영어 구문 분석 / 편집기\n\n![og-image](https://github.com/romantech/syntax-analyzer/assets/8604840/747803a5-7670-4c18-99b8-07c4245b5312)\n\nSyntax Analyzer는 영어 문장의 다양한 구문을 자동으로 분석해 주고, 원하는 형태로 구문을 편집할 수 있는 웹 어플리케이션입니다. 자주 사용하는 30여 가지의 문법 태그를 통해 복잡한 문장 구조를 한눈에 파악할 수 있도록 도와줍니다. 입력한 주제와 연관된 랜덤 문장 생성 기능도 제공합니다. 영어 구문 분석은 직접 파인튜닝한 OpenAI 모델을 활용했습니다.\n\n- 어플리케이션 링크: [https://syntax-analyzer.romantech.net](https://syntax-analyzer.romantech.net/)\n- 백엔드 레포지토리: [https://github.com/romantech/project-server](https://github.com/romantech/project-server)\n- 파인튜닝 레포지토리: [https://github.com/romantech/openai-fine-tuning](https://github.com/romantech/openai-fine-tuning)\n\n# 목차\n\n- [주요 기능](#주요-기능)\n- [사용 스택](#사용-스택)\n  - [Frontend](#frontend)\n  - [Backend](#backend)\n- [분석 데이터 생성 흐름](#분석-데이터-생성-흐름)\n- [구문 분석기 동작 방식](#구문-분석기-동작-방식)\n- [태깅 제약 조건](#태깅-제약-조건)\n- [문장 성분 목록](#문장-성분-목록)\n- [스크린샷](#스크린샷)\n\n# 주요 기능\n\n\u003e [!NOTE]  \n\u003e I'll 같은 축약 표현은 자동으로 풀어서 분석합니다, e.g., `I'll` → `I will`  \n\u003e 숫자에 포함된 모든 쉼표(,)는 제거 후 분석합니다, e.g., `6,500` → `6500`\n\n1. 영어 구문 분석: 주어, 동사, 목적어, 구/절 등 문장 성분 분석\n2. 영어 구문 편집기: 30여 가지 문법 태그를 이용한 문장 구조 시각화\n3. 영어 문장 생성: 입력한 주제와 연관된 랜덤 문장 생성\n\n# 사용 스택\n\n### Frontend\n\n- **Framework**: React with Typescript\n- **UI Library**: Chakra UI\n- **CSS Preprocessor**: SCSS\n- **State Management**: Jotai / React Query\n- **Form Handling**: React Hook Form / Yup\n- **Animation**: Framer Motion / Lottie\n\n### Backend\n\n- **Framework**: Express with Typescript\n- **Database \u0026 Cache**: Redis (using ioredis)\n- **Syntax Analysis**: OpenAI / LangChain\n\n# 분석 데이터 생성 흐름\n\n```mermaid\nsequenceDiagram\n    autonumber\n\n    participant C as React Client\n    participant S as Express Server\n    participant R as Redis DB\n    participant O as OpenAI API\n\n    C-\u003e\u003eS: Request analysis #32;#32;\n\n    activate S\n\n    S-\u003eS: Validate request\n    Note right of S: Verify IP and fields #32;\n\n    alt Invalid Request\n        S--\u003e\u003eC: 400 Bad Request\n\n    else Valid Request\n        S-\u003e\u003e+R: Get analysis quota\n        R--\u003e\u003e-S: Return analysis quota\n        S-\u003eS: Verify analysis quota\n\n        break If Limit Reached\n            S--\u003e\u003eC: 400 Limit Exceeded\n        end\n\n        else Continue\n            S-\u003e\u003e+R: Retrieve prompt\n            R--\u003e\u003e-S: Return prompt\n\n            critical Process with OpenAI\n                S-\u003e\u003e+O: Create chat completion\n                O--\u003e\u003e-S: Return analysis result\n            end\n\n            S-\u003e\u003eR: Update request count\n            Note over S,R: GPT 3.5 reduced by 1#59; GPT 4 reduced by 5 #32;#32;#32;\n\n            S--\u003e\u003eC: 200 OK with analysis data\n            deactivate S\n    end\n```\n\n# 구문 분석기 동작 방식\n\n먼저, 입력받은 문장의 토큰화 과정을 통해 각 단어를 최소 단위로 분리합니다. 이렇게 분리한 토큰들은 루트(최상위) 세그먼트에 포함시켜 그래프 구조로 관리합니다. 각 세그먼트는 시작과 끝에 대한 토큰 인덱스 정보를 가집니다. 문장 성분을 추가할 땐 토큰 인덱스 범위에 해당하는 세그먼트를 탐색하고, 필요에 따라 새로운 세그먼트를 생성하거나 결합합니다.\n\n1. 시작-끝 범위가 현재 세그먼트 범위와 일치할 때: 해당 세그먼트에 추가\n2. 시작-끝 범위가 현재 세그먼트 범위보다 작을 때: 자식 세그먼트 중 해당 범위를 포함하는 세그먼트 탐색\n3. 시작-끝 범위를 포함하는 자식 세그먼트가 없을 때: 자식 세그먼트를 결합하여 새로운 세그먼트 생성\n4. 자식 세그먼트가 하나도 없을 때: 새로운 세그먼트 생성\n\n아래 이미지는 `Global warming is a significant issue` 문장을 기준으로 `3-6`, `5-6`, `4-6` 토큰 인덱스 범위에 문장 성분을 추가할 때마다 세그먼트가 어떻게 변화하는지 보여주는 예시입니다.\n\n![syntax-parser-implementation-dark-optimized](https://github.com/romantech/syntax-analyzer/assets/8604840/4cb5fd1c-8c73-4396-880b-ccdad38a06b2)\n\n# 태깅 제약 조건\n\n문장 성분 태깅은 문장의 각 단어나 구/절에 문법적인 역할을 표시하는 작업입니다. 태깅 작업은 기본적으로 단어 단위로 이루어지며, 구/절은 서로 교차할 수 없는 제약을 설정했습니다. 이미 구조가 형성된 세그먼트를 교차 태깅하면 기존 구조를 해체하고 재구성해야 하는 문제가 발생하기 때문입니다.\n\n예를 들어 `Global warming is a significant issue` 문장에 아래처럼 `S`, `V`, `C`가 태깅된 상태에서 `warming is` 혹은 `is a significant` 구간을 태깅하는 것은 금지합니다. 대신 `Global warming is` 처럼 두 문장 성분을 모두 포함하는 구간은 허용합니다.\n\n```\n[Global warming] [is] [a significant issue]\n---------------- ---- ---------------------\n       S          V             C\n\n허용 : Global warming is / is a significant issue\n금지 : warming is / is a / is a significant\n```\n\n# 문장 성분 목록\n\n영어 문장은 아래 문법 요소를 기준으로 분석되며, 구문 편집기의 태그로도 활용됩니다. 약어와 설명은 편집기의 툴팁으로 표시됩니다. 한 단어는 토큰(token), 두 단어 이상은 유형에 따라 구(phrase) 혹은 절(clause)로 구분합니다.\n\n| 라벨          | 약어    | 타입   | 설명                                              |\n| ------------- | ------- | ------ | ------------------------------------------------- |\n| 주어          | s       | token  | 문장의 주체를 나타내는 단어나 구                  |\n| 동사          | v       | token  | 문장의 동작이나 상태를 나타내는 단어              |\n| 조동사        | mod     | token  | 다른 동사와 쓰여 의미를 부여하는 동사             |\n| 목적어        | o       | token  | 동사의 동작이나 상태에 영향을 받는 단어나 구      |\n| 간접 목적어   | i.o.    | token  | 동사의 동작이 미치는 대상을 나타내는 단어나 구    |\n| 직접 목적어   | d.o.    | token  | 동사의 동작이 직접적으로 영향을 주는 단어나 구    |\n| 전치사 목적어 | prp.o.  | token  | 전치사에 의해 소개되는 단어나 구                  |\n| 보어          | c       | token  | 주어나 목적어를 설명하거나 보완하는 단어나 구     |\n| 목적보어      | o.c.    | token  | 목적어를 설명하거나 보완하는 단어나 구            |\n| to부정사      | to-inf  | token  | 'to'와 함께 사용되는 동사의 기본형                |\n| 동명사        | g       | token  | 동사에 -ing를 붙여 명사로 사용하는 형태           |\n| 분사          | pt      | token  | 동사의 과거 분사나 현재 분사 형태                 |\n| 접속사        | conj    | token  | 문법적으로 연결하는 단어                          |\n| 부사          | adv     | token  | 동사, 형용사, 부사를 수식하는 단어                |\n| 분사구        | pt.phr  | phrase | 분사와 그 관련 구성요소로 이루어진 구             |\n| 전치사구      | prp.phr | phrase | 전치사와 그 객체로 이루어진 구                    |\n| 명사구        | n.phr   | phrase | 명사와 그와 관련된 수식어들로 이루어진 구         |\n| 부사구        | adv.phr | phrase | 문장 내에서 부사의 역할을 하는 구                 |\n| 동사구        | v.phr   | phrase | 문장 내에서 동사의 역할을 하는 구                 |\n| 형용사구      | adj.phr | phrase | 문장 내에서 형용사의 역할을 하는 구               |\n| 동명사구      | g.phr   | phrase | 동명사와 그와 관련된 단어들로 이루어진 구         |\n| 부정사구      | inf.phr | phrase | 'to'와 동사 기본형 및 관련 구성요소로 이루어진 구 |\n| 등위절        | co.cl   | clause | 동일한 중요도를 가진 두 개 이상의 절              |\n| 병렬절        | p.cl    | clause | 동일한 문법 구조를 갖는 두 개 이상의 절           |\n| 명사절        | n.cl    | clause | 문장에서 명사 역할을 하는 절                      |\n| 형용사절      | adj.cl  | clause | 문장에서 형용사 역할을 하는 절                    |\n| 부사절        | adv.cl  | clause | 문장에서 부사 역할을 하는 절                      |\n| 삽입절        | i.cl    | clause | 다른 절 속에 삽입된 절                            |\n| 관계절        | rel.cl  | clause | 주절에 관계된 세부 정보를 제공하는 절             |\n| 종속절        | dep.cl  | clause | 다른 절에 의존하여 완전한 의미를 가질 수 없는 절  |\n| 독립절        | ind.cl  | clause | 독립적으로 완전한 의미를 가진 절                  |\n\n# 스크린샷\n\n#### 홈 화면\n\n![home](https://github.com/romantech/syntax-analyzer/assets/8604840/b09f7777-e0c9-48aa-9ad4-5de85e8eb106)\n\n#### 영어 구문 분석 요청 양식\n\n![analysis-16-9](https://github.com/romantech/syntax-analyzer/assets/8604840/1a2e169b-d4f8-4792-8816-be42cfb153f6)\n\n#### 영어 구문 편집기\n\n![editor-16-9](https://github.com/romantech/syntax-analyzer/assets/8604840/5eb8336b-fdc1-4ed0-aa0b-a88a7e576a57)\n\n#### 랜덤 문장 생성\n\n![generator-16-9](https://github.com/romantech/syntax-analyzer/assets/8604840/114fb4e4-e29a-4f65-a8c7-b9d963b39dbf)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromantech%2Fsyntax-analyzer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fromantech%2Fsyntax-analyzer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromantech%2Fsyntax-analyzer/lists"}