341 lines
7.4 KiB
C#
341 lines
7.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace AxCopilot.Services;
|
|
|
|
public static class IntentDetector
|
|
{
|
|
public static class Categories
|
|
{
|
|
public const string Coding = "coding";
|
|
|
|
public const string Translation = "translation";
|
|
|
|
public const string Analysis = "analysis";
|
|
|
|
public const string Creative = "creative";
|
|
|
|
public const string Document = "document";
|
|
|
|
public const string Math = "math";
|
|
|
|
public const string General = "general";
|
|
|
|
public static readonly string[] All = new string[7] { "coding", "translation", "analysis", "creative", "document", "math", "general" };
|
|
}
|
|
|
|
private static readonly Dictionary<string, (string Keyword, double Weight)[]> _keywords = new Dictionary<string, (string, double)[]>
|
|
{
|
|
["coding"] = new(string, double)[72]
|
|
{
|
|
("코드", 1.0),
|
|
("함수", 1.0),
|
|
("클래스", 1.0),
|
|
("버그", 1.2),
|
|
("디버그", 1.2),
|
|
("리팩토링", 1.5),
|
|
("컴파일", 1.2),
|
|
("에러", 0.8),
|
|
("구현", 0.9),
|
|
("개발", 0.7),
|
|
("테스트", 0.8),
|
|
("빌드", 1.0),
|
|
("배포", 0.8),
|
|
("커밋", 1.2),
|
|
("브랜치", 1.2),
|
|
("머지", 1.0),
|
|
("풀리퀘", 1.2),
|
|
("변수", 1.0),
|
|
("메서드", 1.2),
|
|
("인터\ufffd\ufffd이스", 1.0),
|
|
("타입", 0.6),
|
|
("파라미터", 1.0),
|
|
("반환", 0.8),
|
|
("예외", 1.0),
|
|
("스택", 0.9),
|
|
("알고리즘", 1.2),
|
|
("자료구조", 1.2),
|
|
("정렬", 0.8),
|
|
("재귀", 1.0),
|
|
("루프", 0.9),
|
|
("API", 1.0),
|
|
("SDK", 1.0),
|
|
("라이브러리", 0.8),
|
|
("패키지", 0.8),
|
|
("모듈", 0.8),
|
|
("깃", 1.0),
|
|
("레포", 1.0),
|
|
("소스", 0.7),
|
|
("프로그래밍", 1.0),
|
|
("코딩", 1.2),
|
|
("code", 1.0),
|
|
("function", 1.0),
|
|
("class", 0.8),
|
|
("bug", 1.2),
|
|
("debug", 1.2),
|
|
("refactor", 1.5),
|
|
("compile", 1.2),
|
|
("error", 0.6),
|
|
("implement", 1.0),
|
|
("develop", 0.7),
|
|
("test", 0.7),
|
|
("build", 0.8),
|
|
("deploy", 0.8),
|
|
("commit", 1.2),
|
|
("branch", 1.2),
|
|
("merge", 1.0),
|
|
("variable", 1.0),
|
|
("method", 1.0),
|
|
("interface", 0.8),
|
|
("parameter", 1.0),
|
|
("return", 0.6),
|
|
("exception", 1.0),
|
|
("stack", 0.7),
|
|
("algorithm", 1.2),
|
|
("syntax", 1.2),
|
|
("runtime", 1.0),
|
|
("compile", 1.0),
|
|
("git", 1.2),
|
|
("npm", 1.0),
|
|
("pip", 1.0),
|
|
("nuget", 1.0),
|
|
("docker", 1.0)
|
|
},
|
|
["translation"] = new(string, double)[19]
|
|
{
|
|
("번역", 2.0),
|
|
("영어로", 2.0),
|
|
("한국어로", 2.0),
|
|
("일본어로", 2.0),
|
|
("중국어로", 2.0),
|
|
("영문", 1.5),
|
|
("국문", 1.5),
|
|
("통역", 1.5),
|
|
("원문", 1.2),
|
|
("의역", 1.5),
|
|
("직역", 1.5),
|
|
("translate", 2.0),
|
|
("English", 1.0),
|
|
("Korean", 1.0),
|
|
("Japanese", 1.0),
|
|
("Chinese", 1.0),
|
|
("translation", 2.0),
|
|
("localize", 1.5),
|
|
("localization", 1.5)
|
|
},
|
|
["analysis"] = new(string, double)[27]
|
|
{
|
|
("분석", 1.5),
|
|
("요약", 1.5),
|
|
("비교", 1.2),
|
|
("장\ufffd\ufffd점", 1.5),
|
|
("평가", 1.2),
|
|
("검토", 1.0),
|
|
("리뷰", 0.8),
|
|
("통계", 1.2),
|
|
("데이터", 0.8),
|
|
("트렌드", 1.0),
|
|
("인사이트", 1.2),
|
|
("근거", 1.0),
|
|
("원인", 0.8),
|
|
("결론", 0.8),
|
|
("핵심", 0.7),
|
|
("analyze", 1.5),
|
|
("summarize", 1.5),
|
|
("compare", 1.2),
|
|
("evaluate", 1.2),
|
|
("review", 0.8),
|
|
("statistics", 1.2),
|
|
("data", 0.6),
|
|
("trend", 1.0),
|
|
("insight", 1.2),
|
|
("pros", 1.0),
|
|
("cons", 1.0),
|
|
("conclusion", 0.8)
|
|
},
|
|
["creative"] = new(string, double)[25]
|
|
{
|
|
("작성", 0.8),
|
|
("글쓰기", 1.5),
|
|
("스토리", 1.5),
|
|
("시", 1.2),
|
|
("소설", 1.5),
|
|
("에\ufffd\ufffd이", 1.5),
|
|
("블로그", 1.2),
|
|
("카피", 1.2),
|
|
("슬로건", 1.5),
|
|
("제목", 0.8),
|
|
("아이디어", 1.0),
|
|
("창작", 1.5),
|
|
("묘사", 1.2),
|
|
("대본", 1.5),
|
|
("가사", 1.5),
|
|
("story", 1.5),
|
|
("poem", 1.5),
|
|
("essay", 1.5),
|
|
("blog", 1.2),
|
|
("creative", 1.5),
|
|
("slogan", 1.5),
|
|
("copy", 0.8),
|
|
("fiction", 1.5),
|
|
("narrative", 1.2),
|
|
("lyrics", 1.5)
|
|
},
|
|
["document"] = new(string, double)[27]
|
|
{
|
|
("보고서", 2.0),
|
|
("문서", 1.2),
|
|
("제안서", 2.0),
|
|
("기획서", 2.0),
|
|
("계획서", 1.8),
|
|
("발표자료", 2.0),
|
|
("프레젠테이션", 2.0),
|
|
("양식", 1.5),
|
|
("서식", 1.5),
|
|
("템플릿", 1.2),
|
|
("\ufffd\ufffd셀", 1.5),
|
|
("워드", 1.2),
|
|
("파워포인트", 1.5),
|
|
("PDF", 0.8),
|
|
("CSV", 1.0),
|
|
("회의록", 2.0),
|
|
("업무일지", 2.0),
|
|
("주간보고", 2.0),
|
|
("월간보고", 2.0),
|
|
("report", 1.8),
|
|
("document", 1.0),
|
|
("proposal", 2.0),
|
|
("presentation", 2.0),
|
|
("template", 1.2),
|
|
("spreadsheet", 1.5),
|
|
("excel", 1.5),
|
|
("memo", 1.2)
|
|
},
|
|
["math"] = new(string, double)[33]
|
|
{
|
|
("수학", 1.5),
|
|
("계산", 1.2),
|
|
("방정식", 2.0),
|
|
("증명", 2.0),
|
|
("미적분", 2.0),
|
|
("통계", 1.0),
|
|
("확률", 1.5),
|
|
("행렬", 2.0),
|
|
("벡터", 1.5),
|
|
("미분", 2.0),
|
|
("적분", 2.0),
|
|
("함수", 0.5),
|
|
("그래프", 0.8),
|
|
("좌표", 1.5),
|
|
("기하", 1.5),
|
|
("삼각함수", 2.0),
|
|
("로그", 1.0),
|
|
("지수", 1.0),
|
|
("급수", 2.0),
|
|
("극한", 2.0),
|
|
("math", 1.5),
|
|
("calculate", 1.2),
|
|
("equation", 2.0),
|
|
("proof", 2.0),
|
|
("calculus", 2.0),
|
|
("probability", 1.5),
|
|
("matrix", 2.0),
|
|
("vector", 1.5),
|
|
("derivative", 2.0),
|
|
("integral", 2.0),
|
|
("theorem", 2.0),
|
|
("formula", 1.5),
|
|
("algebra", 1.5)
|
|
}
|
|
};
|
|
|
|
public static (string Category, double Confidence) Detect(string message)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(message))
|
|
{
|
|
return (Category: "general", Confidence: 0.0);
|
|
}
|
|
string text = message.ToLowerInvariant();
|
|
string[] collection = text.Split(new char[16]
|
|
{
|
|
' ', '\t', '\n', '\r', ',', '.', '!', '?', ';', ':',
|
|
'(', ')', '[', ']', '{', '}'
|
|
}, StringSplitOptions.RemoveEmptyEntries);
|
|
HashSet<string> hashSet = new HashSet<string>(collection);
|
|
Dictionary<string, double> dictionary = new Dictionary<string, double>();
|
|
double num = 0.0;
|
|
string key;
|
|
foreach (KeyValuePair<string, (string, double)[]> keyword in _keywords)
|
|
{
|
|
keyword.Deconstruct(out key, out var value);
|
|
string key2 = key;
|
|
(string, double)[] array = value;
|
|
double num2 = 0.0;
|
|
int num3 = 0;
|
|
(string, double)[] array2 = array;
|
|
for (int i = 0; i < array2.Length; i++)
|
|
{
|
|
(string, double) tuple = array2[i];
|
|
string item = tuple.Item1;
|
|
double item2 = tuple.Item2;
|
|
string text2 = item.ToLowerInvariant();
|
|
if (IsKorean(item) ? text.Contains(text2) : hashSet.Contains(text2))
|
|
{
|
|
num2 += item2;
|
|
num3++;
|
|
}
|
|
}
|
|
dictionary[key2] = num2;
|
|
if (num2 > num)
|
|
{
|
|
num = num2;
|
|
}
|
|
}
|
|
if (num < 1.0)
|
|
{
|
|
return (Category: "general", Confidence: 0.0);
|
|
}
|
|
string item3 = "general";
|
|
double num4 = 0.0;
|
|
foreach (KeyValuePair<string, double> item4 in dictionary)
|
|
{
|
|
item4.Deconstruct(out key, out var value2);
|
|
string text3 = key;
|
|
double num5 = value2;
|
|
if (num5 > num4)
|
|
{
|
|
num4 = num5;
|
|
item3 = text3;
|
|
}
|
|
}
|
|
double num6 = Math.Min(1.0, num4 / 4.0 + 0.3);
|
|
double[] array3 = dictionary.Values.OrderByDescending((double s) => s).ToArray();
|
|
if (array3.Length >= 2 && array3[1] > 0.0)
|
|
{
|
|
double num7 = array3[1] / array3[0];
|
|
if (num7 > 0.7)
|
|
{
|
|
num6 *= 0.8;
|
|
}
|
|
}
|
|
return (Category: item3, Confidence: Math.Round(num6, 2));
|
|
}
|
|
|
|
private static bool IsKorean(string text)
|
|
{
|
|
foreach (char c in text)
|
|
{
|
|
if (c >= '가' && c <= '힣')
|
|
{
|
|
return true;
|
|
}
|
|
if (c >= 'ㄱ' && c <= 'ㆎ')
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|