[improvement][project] global refactor , code format , support llm , support fuzzy detect ,support query filter and so on.

This commit is contained in:
lexluo
2023-07-08 15:00:03 +08:00
parent 5ffd617431
commit 404163f391
329 changed files with 21050 additions and 5036 deletions

View File

@@ -0,0 +1,2 @@
export APP_NAME=chat-service
export MAIN_CLASS=com.tencent.supersonic.Launcher

View File

@@ -0,0 +1,38 @@
#!/usr/bin/env bash
binDir=$(cd "$(dirname "$0")"; pwd)
baseDir=$(readlink -f $binDir/../)
libDir=$baseDir/lib
confDir=$baseDir/conf
webDir=$baseDir/webapp
source ${baseDir}/bin/env.sh
CLASSPATH=""
CLASSPATH=$CLASSPATH:$confDir
for jarPath in $libDir/*.jar; do
CLASSPATH=$CLASSPATH:$jarPath
done
export CLASSPATH
export LANG="zh_CN.UTF-8"
cd $baseDir
if [[ "$JAVA_HOME" == "" ]]; then
JAVA_HOME=$(ls /usr/jdk64/jdk* -d 2>/dev/null | xargs | awk '{print "'$APP_NAME'"}')
fi
export PATH=$JAVA_HOME/bin:$PATH
command="-Dfile.encoding="UTF-8" -Duser.language="Zh" -Duser.region="CN" -Duser.timezone="GMT+08" -Xms1024m -Xmx2048m "$MAIN_CLASS
mkdir -p $baseDir/logs
if [[ "$is_test" == "true" ]]; then
java -Dspring.profiles.active="dev" $command >/dev/null 2>$baseDir/logs/error.log &
else
java $command $baseDir >/dev/null 2>$baseDir/logs/error.log &
fi

View File

@@ -0,0 +1,55 @@
#!/usr/bin/env bash
binDir=$(cd "$(dirname "$0")"; pwd)
baseDir=$(readlink -f $binDir/../)
confDir=$baseDir/conf
source ${baseDir}/bin/env.sh
commond=$1
function start()
{
pid=$(ps aux | grep $MAIN_CLASS | grep -v grep |grep $baseDir | awk '{print "'$APP_NAME'"}')
if [[ "$pid" == "" ]]; then
logs=$baseDir/logs/service.sh.log
env DEPLOY=true $baseDir/bin/run.sh $MAIN_CLASS && echo "Process started, see logs/error with logs/error command"
return 0
else
echo "Process (PID = $pid) is running."
return 1
fi
}
function stop()
{
pid=$(ps aux | grep $MAIN_CLASS | grep -v grep|grep $baseDir| awk '{print $2}')
if [[ "$pid" == "" ]]; then
echo "Process is not running !"
return 1
else
kill -9 $pid
echo "Process (PID = $pid) is killed !"
return 0
fi
}
case "$commond" in
start)
echo -e "Starting $APP_NAME"
start
;;
stop)
echo -e "Stopping $APP_NAME"
stop
;;
restart)
echo -e "Resetting $APP_NAME"
stop
start
;;
*)
echo "Use command {start|stop|status|restart} to run."
exit 1
esac
exit 0

View File

@@ -0,0 +1,20 @@
package com.tencent.supersonic;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* StandaloneLauncher
**/
@SpringBootApplication(scanBasePackages = {"com.tencent.supersonic"},
exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
@EnableScheduling
public class StandaloneLauncher {
public static void main(String[] args) {
SpringApplication.run(StandaloneLauncher.class, args);
}
}

View File

@@ -0,0 +1,31 @@
package com.tencent.supersonic.db;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
@MapperScan(value = "com.tencent.supersonic", annotationClass = Mapper.class)
public class MybatisConfig {
private static final String MAPPER_LOCATION = "classpath*:mapper/**/*.xml";
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
bean.setConfiguration(configuration);
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
return bean.getObject();
}
}

View File

@@ -0,0 +1,23 @@
com.tencent.supersonic.chat.api.component.SchemaMapper=\
com.tencent.supersonic.chat.application.mapper.HanlpSchemaMapper, \
com.tencent.supersonic.chat.application.mapper.DatabaseSchemaMapper, \
com.tencent.supersonic.chat.application.mapper.QueryFilterMapper
com.tencent.supersonic.chat.api.component.SemanticParser=\
com.tencent.supersonic.chat.application.parser.DomainSemanticParser, \
com.tencent.supersonic.chat.application.parser.TimeSemanticParser, \
com.tencent.supersonic.chat.application.parser.AggregateSemanticParser
# com.tencent.supersonic.chat.application.parser.LLMSemanticParser
com.tencent.supersonic.chat.api.component.SemanticLayer=\
com.tencent.supersonic.chat.infrastructure.semantic.LocalSemanticLayerImpl
com.tencent.supersonic.chat.application.query.QuerySelector=\
com.tencent.supersonic.chat.application.query.HeuristicQuerySelector
com.tencent.supersonic.chat.application.parser.DomainResolver=\
com.tencent.supersonic.chat.application.parser.HeuristicDomainResolver
com.tencent.supersonic.auth.authentication.domain.interceptor.AuthenticationInterceptor=\
com.tencent.supersonic.auth.authentication.domain.interceptor.DefaultAuthenticationInterceptor

View File

@@ -0,0 +1,28 @@
spring:
h2:
console:
path: /h2-console/chat
# enabled web
enabled: true
datasource:
driver-class-name: org.h2.Driver
schema: classpath:db/schema-h2.sql
data: classpath:db/data-h2.sql
url: jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false
username: root
password: semantic
server:
port: 9080
authentication:
enable: false
exclude:
path: /api/auth/user/register,/api/auth/user/login
semantic:
url:
prefix: http://127.0.0.1:9081
mybatis:
mapper-locations=classpath:mappers/custom/*.xml,classpath*:/mappers/*.xml

View File

@@ -0,0 +1,7 @@
spring:
profiles:
active: local
application:
name: chat
mybatis:
mapper-locations=classpath:mappers/custom/*.xml,classpath*:/mappers/*.xml

View File

@@ -0,0 +1,2 @@
[InternetShortcut]
URL=https://github.com/hankcs/HanLP/

View File

@@ -0,0 +1,3 @@
龚 nr 1
龛 ng 1
龛影 n 1

View File

@@ -0,0 +1,4 @@
买@水果 1
然后@来 1
我@遗忘 10
遗忘@我 10

View File

@@ -0,0 +1,5 @@
hr _1_1 876
sales _1_1 872
marketing _1_1 310
strategy _1_1 360
sales _1_1 500

View File

@@ -0,0 +1,7 @@
tom _1_2 52
alice _1_2 47
lucy _1_2 31
dean _1_2 36
john _1_2 50
jack _1_2 38
admin _1_2 70

View File

@@ -0,0 +1,6 @@
p1 _1_3 52
p2 _1_3 47
p3 _1_3 31
p4 _1_3 36
p5 _1_3 50
p6 _1_3 38

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,44 @@
序号,代码,名称,帮助记忆的诠释,例子及注解
1,Ag,形语素,形容词性语素。形容词代码为a语素代码前面置以A。,绿色/n 似/d 锦/Ag
2,a,形容词,取英语形容词adjective的第1个字母,[重要/a 步伐/n]NP ,美丽/a ,看似/v 抽象/a
3,ad,副形词,直接作状语的形容词。形容词代码a和副词代码d并在一起。,[积极/ad 谋求/v]V-ZZ ,幻象/n 易/ad 逝/Vg
4,an,名形词,具有名词功能的形容词。形容词代码a和名词代码n并在一起。,[外交/n 和/c 安全/an]NP-BL
5,Bg,区别语素,区别词性语素。区别词代码为b语素代码前面置以B。,赤/Ag 橙/Bg 黄/a 绿/a 青/a 蓝/a 紫/a
6,b,区别词,取汉字“别”的声母。,女/b 司机/n 金/b 手镯/n 慢性/b 胃炎/n 古/b 钱币/n 副/b 主任/n 总/b 公司/n单音节区别词和单音节名词或名语素组合作为一个词并标以名词词性n。 雄鸡/n 雌象/n 女魔/n 古币/n少数“单音节区别词+双音节词”的结构作为一个词。总书记/n
7,c,连词,取英语连词conjunction的第1个字母。,合作/vn 与/c 伙伴/n
8,Dg,副语素,副词性语素。副词代码为d语素代码前面置以D。,了解/v 甚/Dg 深/a ,煞/Dg 是/v 喜人/a
9,d,副词,取adverb的第2个字母因其第1个字母已用于形容词。,进一步/d 发展/v
10,e,叹词,取英语叹词exclamation的第1个字母。,啊/e /w 那/r 金灿灿/z 的/u 麦穗/n
11,f,方位词,取汉字“方”。,军人/n 的/u 眼睛/n 里/f 不/d 是/v 没有/v 风景/n
12,h,前接成分,取英语head的第1个字母。,许多/m 非/h 主角/n 人物/n ,办事处/n 的/u “/w 准/h 政府/n ”/w 功能/n 不断/d 加强/v
13,i,成语,取英语成语idiom的第1个字母。,一言一行/i ,义无反顾/i
14,j,简称略语,取汉字“简”的声母。,[德/j 外长/n]NP ,文教/j
15,k,后接成分,后接成分。,少年儿童/l 朋友/n 们/k ,身体/n 健康/a 者/k
16,l,习用语,习用语尚未成为成语,有点“临时性”,取“临”的声母。,少年儿童/l 朋友/n 们/k ,落到实处/l
17,Mg,数语素,数词性语素。数词代码为m语素代码前面置以M。,甲/Mg 减下/v 的/u 人/n 让/v 乙/Mg 背上/v ,凡/d “/w 寅/Mg 年/n ”/w 中/f 出生/v 的/u 人/n 生肖/n 都/d 属/v 虎/n
18,m,数词,取英语numeral的第3个字母nu已有他用。,1数量词组应切分为数词和量词。 三/m 个/q 10/m 公斤/q 一/m 盒/q 点心/n ,但少数数量词已是词典的登录单位,则不再切分。 一个/m 一些/m 2. 基数、序数、小数、分数、百分数一律不予切分,为一个切分单位,标注为 m 。一百二十三/m20万/m 123.54/m 一个/m 第一/m 第三十五/m 20%/m 三分之二/m 千分之三十/m 几十/m 人/n 十几万/m 元/q 第一百零一/m 个/q 3. 约数,前加副词、形容词或后加“来、多、左右”等助数词的应予分开。约/d 一百/m 多/m 万/m仅/d 一百/m 个/q 四十/m 来/m 个/q二十/m 余/m 只/q 十几/m 个/q三十/m 左右/m ,两个数词相连的及“成百”、“上千”等则不予切分。五六/m 年/q 七八/m 天/q十七八/m 岁/q 成百/m 学生/n上千/m 人/n 4表序关系的“数名”结构应予切分。二/m 连/n , 三/m 部/n
19,Ng,名语素,名词性语素。名词代码为n语素代码前面置以N。,出/v 过/u 两/m 天/q 差/Ng 理/v 了/u 一/m 次/q 发/Ng
20,n,名词,取英语名词noun的第1个字母。,(参见 动词--v岗位/n 城市/n 机会/n ,她/r 是/v 责任/n 编辑/n
21,nr,人名,名词代码n和“人(ren)”的声母并在一起。,1. 汉族人及与汉族起名方式相同的非汉族人的姓和名单独切分并分别标注为nr。张/nr 仁伟/nr 欧阳/nr 修/nr 阮/nr 志雄/nr 朴/nr 贞爱/nr汉族人除有单姓和复姓外还有双姓即有的女子出嫁后在原来的姓上加上丈夫的姓。如陈方安生。这种情况切分、标注为陈/nr 方/nr 安生/nr唐姜氏切分、标注为唐/nr 姜氏/nr。2. 姓名后的职务、职称或称呼要分开。江/nr 主席/n 小平/nr 同志/n 江/nr 总书记/n张/nr 教授/n 王/nr 部长/n 陈/nr 老总/n 李/nr 大娘/n 刘/nr 阿姨/n 龙/nr 姑姑/n3. 对人的简称、尊称等若为两个字则合为一个切分单位并标以nr。老张/nr 大李/nr 小郝/nr 郭老/nr 陈总/nr4. 明显带排行的亲属称谓要切分开,分不清楚的则不切开。三/m 哥/n 大婶/n 大/a 女儿/n 大哥/n 小弟/n 老爸/n5. 一些著名作者的或不易区分姓和名的笔名通常作为一个切分单位。鲁迅/nr 茅盾/nr 巴金/nr 三毛/nr 琼瑶/nr 白桦/nr6. 外国人或少数民族的译名包括日本人的姓名不予切分标注为nr。克林顿/nr 叶利钦/nr 才旦卓玛/nr 小林多喜二/nr 北研二/nr华盛顿/nr 爱因斯坦/nr有些西方人的姓名中有小圆点也不分开。卡尔·马克思/nr
22,ns,地名,名词代码n和处所词代码s并在一起。,参见2。短语标记说明--NS安徽/ns深圳/ns杭州/ns拉萨/ns哈尔滨/ns 呼和浩特/ns 乌鲁木齐/ns长江/ns黄海/ns太平洋/ns 泰山/ns 华山/ns亚洲/ns 海南岛/ns太湖/ns白洋淀/ns 俄罗斯/ns哈萨克斯坦/ns彼得堡/ns 伏尔加格勒/ns 1. 国名不论长短,作为一个切分单位。中国/ns 中华人民共和国/ns 日本国/ns 美利坚合众国/ns 美国/ns2. 地名后有“省”、“市”、“县”、“区”、“乡”、“镇”、“村”、“旗”、“州”、“都”、“府”、“道”等单字的行政区划名称时,不切分开,作为一个切分单位。四川省/ns 天津市/ns景德镇/ns沙市市/ns 牡丹江市/ns正定县/ns海淀区/ns 通州区/ns东升乡/ns 双桥镇/ns 南化村/ns华盛顿州/ns俄亥俄州/ns东京都/ns 大阪府/ns北海道/ns 长野县/ns开封府/ns宣城县/ns3. 地名后的行政区划有两个以上的汉字则将地名同行政区划名称切开不过要将地名同行政区划名称用方括号括起来并标以短语NS。[芜湖/ns 专区/n] NS[宣城/ns 地区/n]ns[内蒙古/ns 自治区/n]NS[深圳/ns 特区/n]NS [厦门/ns 经济/n 特区/n]NS [香港/ns 特别/a 行政区/n]NS[香港/ns 特区/n]NS [华盛顿/ns 特区/n]NS4. 地名后有表示地形地貌的一个字的普通名词,如“江、河、山、洋、海、岛、峰、湖”等,不予切分。鸭绿江/ns亚马逊河/ns 喜马拉雅山/ns 珠穆朗玛峰/ns地中海/ns大西洋/ns洞庭湖/ns 塞普路斯岛/ns 5. 地名后接的表示地形地貌的普通名词若有两个以上汉字则应切开。然后将地名同该普通名词标成短语NS。[台湾/ns 海峡/n]NS[华北/ns 平原/n]NS[帕米尔/ns 高原/n]NS [南沙/ns 群岛/n]NS[京东/ns 大/a 峡谷/n]NS [横断/b 山脉/n]NS6地名后有表示自然区划的一个字的普通名词如“ 街,路,道,巷,里,町,庄,村,弄,堡”等,不予切分。 中关村/ns长安街/ns学院路/ns 景德镇/ns 吴家堡/ns 庞各庄/ns 三元里/ns彼得堡/ns 北菜市巷/ns 7地名后接的表示自然区划的普通名词若有两个以上汉字则应切开。然后将地名同自然区划名词标成短语NS。[米市/ns 大街/n]NS [蒋家/nz 胡同/n]NS [陶然亭/ns 公园/n]NS 8 大小地名相连时的标注方式为:北京市/ns 海淀区/ns 海淀镇/ns [南/f 大街/n]NS [蒋家/nz 胡同/n]NS 24/m 号/q
23,nt,机构团体,“团”的声母为t名词代码n和t并在一起。,参见2。短语标记说明--NT联合国/nt中共中央/nt国务院/nt 北京大学/nt1大多数团体、机构、组织的专有名称一般是短语型的较长且含有地名或人名等专名再组合标注为短语NT。[中国/ns 计算机/n 学会/n]NT [香港/ns 钟表业/n 总会/n]NT [烟台/ns 大学/n]NT [香港/ns 理工大学/n]NT [华东/ns 理工大学/n]NT[合肥/ns 师范/n 学院/n]NT [北京/ns 图书馆/n]NT [富士通/nz 株式会社/n]NT [香山/ns 植物园/n]NT [安娜/nz 美容院/n]NT[上海/ns 手表/n 厂/n]NT [永和/nz 烧饼铺/n]NT[北京/ns 国安/nz 队/n]NT2. 对于在国际或中国范围内的知名的唯一的团体、机构、组织的名称即使前面没有专名也标为nt或NT。联合国/nt国务院/nt外交部/nt 财政部/nt教育部/nt 国防部/nt[世界/n 贸易/n 组织/n]NT [国家/n 教育/vn 委员会/n]NT[信息/n 产业/n 部/n]NT[全国/n 信息/n 技术/n 标准化/vn 委员会/n]NT[全国/n 总/b 工会/n]NT[全国/n 人民/n 代表/n 大会/n]NT美国的“国务院”其他国家的“外交部、财政部、教育部”必须在其所属国的国名之后出现时才联合标注为NT。[美国/ns 国务院/n]NT[法国/ns 外交部/n]NT[美/j 国会/n]NT日本有些政府机构名称很特别无论是否出现在“日本”国名之后都标为nt。[日本/ns 外务省/nt]NT[日/j 通产省/nt]NT通产省/nt 3. 前后相连有上下位关系的团体机构组织名称的处理方式如下:[联合国/nt 教科文/j 组织/n]NT [中国/ns 银行/n 北京/ns 分行/n]NT[河北省/ns 正定县/ns 西平乐乡/ns 南化村/ns 党支部/n]NT 当下位名称含有专名(如“北京/ns 分行/n”、“南化村/ns 党支部/n”、“昌平/ns 分校/n”也可脱离前面的上位名称单独标注为NT。[中国/ns 银行/n]NT [北京/ns 分行/n]NT北京大学/nt [昌平/ns 分校/n]NT4. 团体、机构、组织名称中用圆括号加注简称时:[宝山/ns 钢铁/n /w 宝钢/j /w 总/b 公司/n]NT[宝山/ns 钢铁/n 总/b 公司/n]NT/w 宝钢/j /w
24,nx,外文字符,外文字符。,A/nx 公司/n B/nx 先生/n X/nx 君/Ng 24/m K/nx 镀金/n C/nx 是/v 光速/n Windows98/nx PentiumIV/nx I LOVE THIS GAME/nx
25,nz,其他专名,“专”的声母的第1个字母为z名词代码n和z并在一起。,参见2。短语标记说明--NZ除人名、国名、地名、团体、机构、组织以外的其他专有名词都标以nz。满族/nz俄罗斯族/nz汉语/nz罗马利亚语/nz 捷克语/nz中文/nz 英文/nz 满人/nz 哈萨克人/nz 诺贝尔奖/nz 茅盾奖/nz 1.包含专有名称或简称的交通线标以nz短语型的标为NZ。津浦路/nz 石太线/nz [京/j 九/j 铁路/n]NZ [京/j 津/j 高速/b 公路/n]NZ 2. 历史上重要事件、运动等专有名称一般是短语型的按短语型专有名称处理标以NZ。[卢沟桥/ns 事件/n]NZ [西安/ns 事变/n]NZ[五四/t 运动/n]NZ [明治/nz 维新/n]NZ[甲午/t 战争/n]NZ3.专有名称后接多音节的名词,如“语言”、“文学”、“文化”、“方式”、“精神”等,失去专指性,则应分开。欧洲/ns 语言/n 法国/ns 文学/n 西方/ns 文化/n 贝多芬/nr 交响乐/n 雷锋/nr 精神/n 美国/ns 方式/n日本/ns 料理/n 宋朝/t 古董/n 4. 商标包括专名及后接的“牌”、“型”等是专指的标以nz但其后所接的商品仍标以普通名词n。康师傅/nr 方便面/n 中华牌/nz 香烟/n 牡丹III型/nz 电视机/n 联想/nz 电脑/n 鳄鱼/nz 衬衣/n 耐克/nz 鞋/n5. 以序号命名的名称一般不认为是专有名称。2/m 号/q 国道/n ,十一/m 届/q 三中全会/j如果前面有专名合起来作为短语型专名。[中国/ns 101/m 国道/n]NZ [中共/j 十一/m 届/q 三中全会/j]NZ6. 书、报、杂志、文档、报告、协议、合同等的名称通常有书名号加以标识,不作为专有名词。由于这些名字往往较长,名字本身按常规处理。《/w 宁波/ns 日报/n 》/w ,《/w 鲁迅/nr 全集/n 》/w中华/nz 读书/vn 报/n 杜甫/nr 诗选/n少数书名、报刊名等专有名称则不切分。红楼梦/nz 人民日报/nz儒林外史/nz 7. 当有些专名无法分辨它们是人名还是地名或机构名时暂标以nz。[巴黎/ns 贝尔希/nz 体育馆/n]NT其中“贝尔希”只好暂标为nz。
26,o,拟声词,取英语拟声词onomatopoeia的第1个字母。,哈哈/o 一/m 笑/v ,装载机/n 隆隆/o 推进/v
27,p,介词,取英语介词prepositional的第1个字母。,对/p 子孙后代/n 负责/v ,以/p 煤/n 养/v 农/Ng ,为/p 治理/v 荒山/n 服务/v 把/p 青年/n 推/v 上/v 了/u 领导/vn 岗位/n
28,q,量词,取英语quantity的第1个字母。,参见数词m首/m 批/q ,一/m 年/q
29,Rg,代语素,代词性语素。代词代码为r在语素的代码g前面置以R。,读者/n 就/d 是/v 这/r 两/m 棵/q 小树/n 扎根/v 于/p 斯/Rg 、/w 成长/v 于/p 斯/Rg 的/u 肥田/n 沃土/n
30,r,代词,取英语代词pronoun的第2个字母因p已用于介词。,单音节代词“本”、“每”、“各”、“诸”后接单音节名词时,和后接的单音节名词合为代词;当后接双音节名词时,应予切分。本报/r 每人/r 本社/r 本/r 地区/n 各/r 部门/n
31,s,处所词,取英语space的第1个字母。,家里/s 的/u 电脑/n 都/d 联通/v 了/u 国际/n 互联网/n ,西部/s 交通/n 咽喉/n
32,Tg,时语素,时间词性语素。时间词代码为t在语素的代码g前面置以T。,3日/t 晚/Tg 在/p 总统府/n 发表/v 声明/n ,尊重/v 现/Tg 执政/vn 当局/n 的/u 权威/n
33,t,时间词,取英语time的第1个字母。,1. 年月日时分秒按年、月、日、时、分、秒切分标注为t 。1997年/t 3月/t 19日/t 下午/t 2时/t 18分/t若数字后无表示时间的“年、月、日、时、分、秒”等的标为数词m。1998/m 中文/n 信息/n 处理/vn 国际/n 会议/n 2. 历史朝代的名称虽然有专有名词的性质仍标注为t。西周/t 秦朝/t 东汉/t 南北朝/t 清代/t“牛年、虎年”等一律不予切分标注为牛年/t 虎年/t 甲午年/t 甲午/t 战争/n 庚子/t 赔款/n 戊戌/t 变法/n
34,u,助词,取英语助词auxiliary。,[[俄罗斯/ns 和/c 北约/j]NP-BL 之间/f [战略/n 伙伴/n 关系/n]NP 的/u 建立/vn]NP 填平/v 了/u [[欧洲/ns 安全/a 政治/n]NP 的/u 鸿沟/n]NP
35,Vg,动语素,动词性语素。动词代码为v。在语素的代码g前面置以V。,洗/v 了/u 一个/m 舒舒服服/z 的/u 澡/Vg
36,v,动词,取英语动词verb的第一个字母。,(参见 名词--n[[[欧盟/j 扩大/v]S 的/u [历史性/n 决定/n]NP]NP 和/c [北约/j 开放/v]S]NP-BL [为/p [创建/v [一/m 种/q 新/a 的/u 欧洲/ns 安全/a 格局/n]NP]VP-SBI]PP-MD [奠定/v 了/u 基础/n]V-SBI
37,vd,副动词,直接作状语的动词。动词和副词的代码并在一起。,形势/n 会/v 持续/vd 好转/v ,认为/v 是/v 电话局/n 收/v 错/vd 了/u 费/n
38,vn,名动词,指具有名词功能的动词。动词和名词的代码并在一起。,引起/v 人们/n 的/u 关注/vn 和/c 思考/vn ,收费/vn 电话/n 的/u 号码/n
39,w,标点符号,,”/w /w
40,x,非语素字,非语素字只是一个符号字母x通常用于代表未知数、符号。,
41,Yg,语气语素,语气词性语素。语气词代码为y。在语素的代码g前面置以Y。,唯/d 大力/d 者/k 能/v 致/v 之/u 耳/Yg
42,y,语气词,取汉字“语”的声母。,会/v 泄露/v 用户/n 隐私/n 吗/y ,又/d 何在/v 呢/y
43,z,状态词,取汉字“状”的声母的前一个字母。,取得/v 扎扎实实/z 的/u 突破性/n 进展/vn ,四季/n 常青/z 的/u 热带/n 树木/n ,短短/z 几/m 年/q 间,
1 序号 代码 名称 帮助记忆的诠释 例子及注解
2 1 Ag 形语素 形容词性语素。形容词代码为a,语素代码g前面置以A。 绿色/n 似/d 锦/Ag ,
3 2 a 形容词 取英语形容词adjective的第1个字母 [重要/a 步伐/n]NP ,美丽/a ,看似/v 抽象/a ,
4 3 ad 副形词 直接作状语的形容词。形容词代码a和副词代码d并在一起。 [积极/ad 谋求/v]V-ZZ ,幻象/n 易/ad 逝/Vg ,
5 4 an 名形词 具有名词功能的形容词。形容词代码a和名词代码n并在一起。 [外交/n 和/c 安全/an]NP-BL ,
6 5 Bg 区别语素 区别词性语素。区别词代码为b,语素代码g前面置以B。 赤/Ag 橙/Bg 黄/a 绿/a 青/a 蓝/a 紫/a ,
7 6 b 区别词 取汉字“别”的声母。 女/b 司机/n, 金/b 手镯/n, 慢性/b 胃炎/n, 古/b 钱币/n, 副/b 主任/n, 总/b 公司/n单音节区别词和单音节名词或名语素组合,作为一个词,并标以名词词性n。 雄鸡/n, 雌象/n, 女魔/n, 古币/n少数“单音节区别词+双音节词”的结构作为一个词。总书记/n ,
8 7 c 连词 取英语连词conjunction的第1个字母。 合作/vn 与/c 伙伴/n
9 8 Dg 副语素 副词性语素。副词代码为d,语素代码g前面置以D。 了解/v 甚/Dg 深/a ,煞/Dg 是/v 喜人/a ,
10 9 d 副词 取adverb的第2个字母,因其第1个字母已用于形容词。 进一步/d 发展/v ,
11 10 e 叹词 取英语叹词exclamation的第1个字母。 啊/e ,/w 那/r 金灿灿/z 的/u 麦穗/n ,
12 11 f 方位词 取汉字“方”。 军人/n 的/u 眼睛/n 里/f 不/d 是/v 没有/v 风景/n ,
13 12 h 前接成分 取英语head的第1个字母。 许多/m 非/h 主角/n 人物/n ,办事处/n 的/u “/w 准/h 政府/n ”/w 功能/n 不断/d 加强/v ,
14 13 i 成语 取英语成语idiom的第1个字母。 一言一行/i ,义无反顾/i ,
15 14 j 简称略语 取汉字“简”的声母。 [德/j 外长/n]NP ,文教/j ,
16 15 k 后接成分 后接成分。 少年儿童/l 朋友/n 们/k ,身体/n 健康/a 者/k ,
17 16 l 习用语 习用语尚未成为成语,有点“临时性”,取“临”的声母。 少年儿童/l 朋友/n 们/k ,落到实处/l ,
18 17 Mg 数语素 数词性语素。数词代码为m,语素代码g前面置以M。 甲/Mg 减下/v 的/u 人/n 让/v 乙/Mg 背上/v ,凡/d “/w 寅/Mg 年/n ”/w 中/f 出生/v 的/u 人/n 生肖/n 都/d 属/v 虎/n ,
19 18 m 数词 取英语numeral的第3个字母,n,u已有他用。 1.数量词组应切分为数词和量词。 三/m 个/q, 10/m 公斤/q, 一/m 盒/q 点心/n ,但少数数量词已是词典的登录单位,则不再切分。 一个/m , 一些/m ,2. 基数、序数、小数、分数、百分数一律不予切分,为一个切分单位,标注为 m 。一百二十三/m,20万/m, 123.54/m, 一个/m, 第一/m, 第三十五/m, 20%/m, 三分之二/m, 千分之三十/m, 几十/m 人/n, 十几万/m 元/q, 第一百零一/m 个/q ,3. 约数,前加副词、形容词或后加“来、多、左右”等助数词的应予分开。约/d 一百/m 多/m 万/m,仅/d 一百/m 个/q, 四十/m 来/m 个/q,二十/m 余/m 只/q, 十几/m 个/q,三十/m 左右/m ,两个数词相连的及“成百”、“上千”等则不予切分。五六/m 年/q, 七八/m 天/q,十七八/m 岁/q, 成百/m 学生/n,上千/m 人/n, 4.表序关系的“数+名”结构,应予切分。二/m 连/n , 三/m 部/n ,
20 19 Ng 名语素 名词性语素。名词代码为n,语素代码g前面置以N。 出/v 过/u 两/m 天/q 差/Ng, 理/v 了/u 一/m 次/q 发/Ng,
21 20 n 名词 取英语名词noun的第1个字母。 (参见 动词--v)岗位/n , 城市/n , 机会/n ,她/r 是/v 责任/n 编辑/n ,
22 21 nr 人名 名词代码n和“人(ren)”的声母并在一起。 1. 汉族人及与汉族起名方式相同的非汉族人的姓和名单独切分,并分别标注为nr。张/nr 仁伟/nr, 欧阳/nr 修/nr, 阮/nr 志雄/nr, 朴/nr 贞爱/nr汉族人除有单姓和复姓外,还有双姓,即有的女子出嫁后,在原来的姓上加上丈夫的姓。如:陈方安生。这种情况切分、标注为:陈/nr 方/nr 安生/nr;唐姜氏,切分、标注为:唐/nr 姜氏/nr。2. 姓名后的职务、职称或称呼要分开。江/nr 主席/n, 小平/nr 同志/n, 江/nr 总书记/n,张/nr 教授/n, 王/nr 部长/n, 陈/nr 老总/n, 李/nr 大娘/n, 刘/nr 阿姨/n, 龙/nr 姑姑/n3. 对人的简称、尊称等若为两个字,则合为一个切分单位,并标以nr。老张/nr, 大李/nr, 小郝/nr, 郭老/nr, 陈总/nr4. 明显带排行的亲属称谓要切分开,分不清楚的则不切开。三/m 哥/n, 大婶/n, 大/a 女儿/n, 大哥/n, 小弟/n, 老爸/n5. 一些著名作者的或不易区分姓和名的笔名通常作为一个切分单位。鲁迅/nr, 茅盾/nr, 巴金/nr, 三毛/nr, 琼瑶/nr, 白桦/nr6. 外国人或少数民族的译名(包括日本人的姓名)不予切分,标注为nr。克林顿/nr, 叶利钦/nr, 才旦卓玛/nr, 小林多喜二/nr, 北研二/nr,华盛顿/nr, 爱因斯坦/nr有些西方人的姓名中有小圆点,也不分开。卡尔·马克思/nr
23 22 ns 地名 名词代码n和处所词代码s并在一起。 (参见2。短语标记说明--NS)安徽/ns,深圳/ns,杭州/ns,拉萨/ns,哈尔滨/ns, 呼和浩特/ns, 乌鲁木齐/ns,长江/ns,黄海/ns,太平洋/ns, 泰山/ns, 华山/ns,亚洲/ns, 海南岛/ns,太湖/ns,白洋淀/ns, 俄罗斯/ns,哈萨克斯坦/ns,彼得堡/ns, 伏尔加格勒/ns 1. 国名不论长短,作为一个切分单位。中国/ns, 中华人民共和国/ns, 日本国/ns, 美利坚合众国/ns, 美国/ns2. 地名后有“省”、“市”、“县”、“区”、“乡”、“镇”、“村”、“旗”、“州”、“都”、“府”、“道”等单字的行政区划名称时,不切分开,作为一个切分单位。四川省/ns, 天津市/ns,景德镇/ns沙市市/ns, 牡丹江市/ns,正定县/ns,海淀区/ns, 通州区/ns,东升乡/ns, 双桥镇/ns 南化村/ns,华盛顿州/ns,俄亥俄州/ns,东京都/ns, 大阪府/ns,北海道/ns, 长野县/ns,开封府/ns,宣城县/ns3. 地名后的行政区划有两个以上的汉字,则将地名同行政区划名称切开,不过要将地名同行政区划名称用方括号括起来,并标以短语NS。[芜湖/ns 专区/n] NS,[宣城/ns 地区/n]ns,[内蒙古/ns 自治区/n]NS,[深圳/ns 特区/n]NS, [厦门/ns 经济/n 特区/n]NS, [香港/ns 特别/a 行政区/n]NS,[香港/ns 特区/n]NS, [华盛顿/ns 特区/n]NS,4. 地名后有表示地形地貌的一个字的普通名词,如“江、河、山、洋、海、岛、峰、湖”等,不予切分。鸭绿江/ns,亚马逊河/ns, 喜马拉雅山/ns, 珠穆朗玛峰/ns,地中海/ns,大西洋/ns,洞庭湖/ns, 塞普路斯岛/ns 5. 地名后接的表示地形地貌的普通名词若有两个以上汉字,则应切开。然后将地名同该普通名词标成短语NS。[台湾/ns 海峡/n]NS,[华北/ns 平原/n]NS,[帕米尔/ns 高原/n]NS, [南沙/ns 群岛/n]NS,[京东/ns 大/a 峡谷/n]NS [横断/b 山脉/n]NS6.地名后有表示自然区划的一个字的普通名词,如“ 街,路,道,巷,里,町,庄,村,弄,堡”等,不予切分。 中关村/ns,长安街/ns,学院路/ns, 景德镇/ns, 吴家堡/ns, 庞各庄/ns, 三元里/ns,彼得堡/ns, 北菜市巷/ns, 7.地名后接的表示自然区划的普通名词若有两个以上汉字,则应切开。然后将地名同自然区划名词标成短语NS。[米市/ns 大街/n]NS, [蒋家/nz 胡同/n]NS , [陶然亭/ns 公园/n]NS , 8. 大小地名相连时的标注方式为:北京市/ns 海淀区/ns 海淀镇/ns [南/f 大街/n]NS [蒋家/nz 胡同/n]NS 24/m 号/q ,
24 23 nt 机构团体 “团”的声母为t,名词代码n和t并在一起。 (参见2。短语标记说明--NT)联合国/nt,中共中央/nt,国务院/nt, 北京大学/nt1.大多数团体、机构、组织的专有名称一般是短语型的,较长,且含有地名或人名等专名,再组合,标注为短语NT。[中国/ns 计算机/n 学会/n]NT, [香港/ns 钟表业/n 总会/n]NT, [烟台/ns 大学/n]NT, [香港/ns 理工大学/n]NT, [华东/ns 理工大学/n]NT,[合肥/ns 师范/n 学院/n]NT, [北京/ns 图书馆/n]NT, [富士通/nz 株式会社/n]NT, [香山/ns 植物园/n]NT, [安娜/nz 美容院/n]NT,[上海/ns 手表/n 厂/n]NT, [永和/nz 烧饼铺/n]NT,[北京/ns 国安/nz 队/n]NT,2. 对于在国际或中国范围内的知名的唯一的团体、机构、组织的名称即使前面没有专名,也标为nt或NT。联合国/nt,国务院/nt,外交部/nt, 财政部/nt,教育部/nt, 国防部/nt,[世界/n 贸易/n 组织/n]NT, [国家/n 教育/vn 委员会/n]NT,[信息/n 产业/n 部/n]NT,[全国/n 信息/n 技术/n 标准化/vn 委员会/n]NT,[全国/n 总/b 工会/n]NT,[全国/n 人民/n 代表/n 大会/n]NT,美国的“国务院”,其他国家的“外交部、财政部、教育部”,必须在其所属国的国名之后出现时,才联合标注为NT。[美国/ns 国务院/n]NT,[法国/ns 外交部/n]NT,[美/j 国会/n]NT,日本有些政府机构名称很特别,无论是否出现在“日本”国名之后都标为nt。[日本/ns 外务省/nt]NT,[日/j 通产省/nt]NT通产省/nt 3. 前后相连有上下位关系的团体机构组织名称的处理方式如下:[联合国/nt 教科文/j 组织/n]NT, [中国/ns 银行/n 北京/ns 分行/n]NT,[河北省/ns 正定县/ns 西平乐乡/ns 南化村/ns 党支部/n]NT, 当下位名称含有专名(如“北京/ns 分行/n”、“南化村/ns 党支部/n”、“昌平/ns 分校/n”)时,也可脱离前面的上位名称单独标注为NT。[中国/ns 银行/n]NT [北京/ns 分行/n]NT,北京大学/nt [昌平/ns 分校/n]NT,4. 团体、机构、组织名称中用圆括号加注简称时:[宝山/ns 钢铁/n (/w 宝钢/j )/w 总/b 公司/n]NT,[宝山/ns 钢铁/n 总/b 公司/n]NT,(/w 宝钢/j )/w
25 24 nx 外文字符 外文字符。 A/nx 公司/n ,B/nx 先生/n ,X/nx 君/Ng ,24/m K/nx 镀金/n ,C/nx 是/v 光速/n ,Windows98/nx ,PentiumIV/nx ,I LOVE THIS GAME/nx ,
26 25 nz 其他专名 “专”的声母的第1个字母为z,名词代码n和z并在一起。 (参见2。短语标记说明--NZ)除人名、国名、地名、团体、机构、组织以外的其他专有名词都标以nz。满族/nz,俄罗斯族/nz,汉语/nz,罗马利亚语/nz, 捷克语/nz,中文/nz, 英文/nz, 满人/nz, 哈萨克人/nz, 诺贝尔奖/nz, 茅盾奖/nz, 1.包含专有名称(或简称)的交通线,标以nz;短语型的,标为NZ。津浦路/nz, 石太线/nz, [京/j 九/j 铁路/n]NZ, [京/j 津/j 高速/b 公路/n]NZ, 2. 历史上重要事件、运动等专有名称一般是短语型的,按短语型专有名称处理,标以NZ。[卢沟桥/ns 事件/n]NZ, [西安/ns 事变/n]NZ,[五四/t 运动/n]NZ, [明治/nz 维新/n]NZ,[甲午/t 战争/n]NZ,3.专有名称后接多音节的名词,如“语言”、“文学”、“文化”、“方式”、“精神”等,失去专指性,则应分开。欧洲/ns 语言/n, 法国/ns 文学/n, 西方/ns 文化/n, 贝多芬/nr 交响乐/n, 雷锋/nr 精神/n, 美国/ns 方式/n,日本/ns 料理/n, 宋朝/t 古董/n 4. 商标(包括专名及后接的“牌”、“型”等)是专指的,标以nz,但其后所接的商品仍标以普通名词n。康师傅/nr 方便面/n, 中华牌/nz 香烟/n, 牡丹III型/nz 电视机/n, 联想/nz 电脑/n, 鳄鱼/nz 衬衣/n, 耐克/nz 鞋/n5. 以序号命名的名称一般不认为是专有名称。2/m 号/q 国道/n ,十一/m 届/q 三中全会/j如果前面有专名,合起来作为短语型专名。[中国/ns 101/m 国道/n]NZ, [中共/j 十一/m 届/q 三中全会/j]NZ,6. 书、报、杂志、文档、报告、协议、合同等的名称通常有书名号加以标识,不作为专有名词。由于这些名字往往较长,名字本身按常规处理。《/w 宁波/ns 日报/n 》/w ,《/w 鲁迅/nr 全集/n 》/w,中华/nz 读书/vn 报/n, 杜甫/nr 诗选/n,少数书名、报刊名等专有名称,则不切分。红楼梦/nz, 人民日报/nz,儒林外史/nz 7. 当有些专名无法分辨它们是人名还是地名或机构名时,暂标以nz。[巴黎/ns 贝尔希/nz 体育馆/n]NT,其中“贝尔希”只好暂标为nz。
27 26 o 拟声词 取英语拟声词onomatopoeia的第1个字母。 哈哈/o 一/m 笑/v ,装载机/n 隆隆/o 推进/v ,
28 27 p 介词 取英语介词prepositional的第1个字母。 对/p 子孙后代/n 负责/v ,以/p 煤/n 养/v 农/Ng ,为/p 治理/v 荒山/n 服务/v , 把/p 青年/n 推/v 上/v 了/u 领导/vn 岗位/n ,
29 28 q 量词 取英语quantity的第1个字母。 (参见数词m)首/m 批/q ,一/m 年/q ,
30 29 Rg 代语素 代词性语素。代词代码为r,在语素的代码g前面置以R。 读者/n 就/d 是/v 这/r 两/m 棵/q 小树/n 扎根/v 于/p 斯/Rg 、/w 成长/v 于/p 斯/Rg 的/u 肥田/n 沃土/n ,
31 30 r 代词 取英语代词pronoun的第2个字母,因p已用于介词。 单音节代词“本”、“每”、“各”、“诸”后接单音节名词时,和后接的单音节名词合为代词;当后接双音节名词时,应予切分。本报/r, 每人/r, 本社/r, 本/r 地区/n, 各/r 部门/n
32 31 s 处所词 取英语space的第1个字母。 家里/s 的/u 电脑/n 都/d 联通/v 了/u 国际/n 互联网/n ,西部/s 交通/n 咽喉/n ,
33 32 Tg 时语素 时间词性语素。时间词代码为t,在语素的代码g前面置以T。 3日/t 晚/Tg 在/p 总统府/n 发表/v 声明/n ,尊重/v 现/Tg 执政/vn 当局/n 的/u 权威/n ,
34 33 t 时间词 取英语time的第1个字母。 1. 年月日时分秒,按年、月、日、时、分、秒切分,标注为t 。1997年/t 3月/t 19日/t 下午/t 2时/t 18分/t若数字后无表示时间的“年、月、日、时、分、秒”等的标为数词m。1998/m 中文/n 信息/n 处理/vn 国际/n 会议/n 2. 历史朝代的名称虽然有专有名词的性质,仍标注为t。西周/t, 秦朝/t, 东汉/t, 南北朝/t, 清代/t“牛年、虎年”等一律不予切分,标注为:牛年/t, 虎年/t, 甲午年/t, 甲午/t 战争/n, 庚子/t 赔款/n, 戊戌/t 变法/n
35 34 u 助词 取英语助词auxiliary。 [[俄罗斯/ns 和/c 北约/j]NP-BL 之间/f [战略/n 伙伴/n 关系/n]NP 的/u 建立/vn]NP 填平/v 了/u [[欧洲/ns 安全/a 政治/n]NP 的/u 鸿沟/n]NP
36 35 Vg 动语素 动词性语素。动词代码为v。在语素的代码g前面置以V。 洗/v 了/u 一个/m 舒舒服服/z 的/u 澡/Vg
37 36 v 动词 取英语动词verb的第一个字母。 (参见 名词--n)[[[欧盟/j 扩大/v]S 的/u [历史性/n 决定/n]NP]NP 和/c [北约/j 开放/v]S]NP-BL [为/p [创建/v [一/m 种/q 新/a 的/u 欧洲/ns 安全/a 格局/n]NP]VP-SBI]PP-MD [奠定/v 了/u 基础/n]V-SBI ,,
38 37 vd 副动词 直接作状语的动词。动词和副词的代码并在一起。 形势/n 会/v 持续/vd 好转/v ,认为/v 是/v 电话局/n 收/v 错/vd 了/u 费/n ,
39 38 vn 名动词 指具有名词功能的动词。动词和名词的代码并在一起。 引起/v 人们/n 的/u 关注/vn 和/c 思考/vn ,收费/vn 电话/n 的/u 号码/n ,
40 39 w 标点符号 ”/w :/w
41 40 x 非语素字 非语素字只是一个符号,字母x通常用于代表未知数、符号。
42 41 Yg 语气语素 语气词性语素。语气词代码为y。在语素的代码g前面置以Y。 唯/d 大力/d 者/k 能/v 致/v 之/u 耳/Yg
43 42 y 语气词 取汉字“语”的声母。 会/v 泄露/v 用户/n 隐私/n 吗/y ,又/d 何在/v 呢/y ?
44 43 z 状态词 取汉字“状”的声母的前一个字母。 取得/v 扎扎实实/z 的/u 突破性/n 进展/vn ,四季/n 常青/z 的/u 热带/n 树木/n ,短短/z 几/m 年/q 间,

View File

@@ -0,0 +1 @@
1.7.5

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,341 @@
-- chat tables
CREATE TABLE IF NOT EXISTS `s2_chat_context`
(
`chat_id` BIGINT NOT NULL , -- context chat id
`modified_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , -- row modify time
`user` varchar(64) DEFAULT NULL , -- row modify user
`query_text` LONGVARCHAR DEFAULT NULL , -- query text
`semantic_parse` LONGVARCHAR DEFAULT NULL , -- parse data
`ext_data` LONGVARCHAR DEFAULT NULL , -- extend data
PRIMARY KEY (`chat_id`)
);
CREATE TABLE IF NOT EXISTS `s2_chat`
(
`chat_id` BIGINT auto_increment ,-- AUTO_INCREMENT,
`chat_name` varchar(100) DEFAULT NULL,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
`last_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
`creator` varchar(30) DEFAULT NULL,
`last_question` varchar(200) DEFAULT NULL,
`is_delete` INT DEFAULT '0' COMMENT 'is deleted',
`is_top` INT DEFAULT '0' COMMENT 'is top',
PRIMARY KEY (`chat_id`)
) ;
CREATE TABLE `s2_chat_query`
(
`question_id` BIGINT NOT NULL AUTO_INCREMENT,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`query_text` mediumtext,
`user_name` varchar(150) DEFAULT NULL COMMENT '',
`query_state` int(1) DEFAULT NULL,
`chat_id` BIGINT NOT NULL , -- context chat id
`query_response` mediumtext NOT NULL ,
`score` int DEFAULT '0',
`feedback` varchar(1024) DEFAULT '',
PRIMARY KEY (`question_id`)
);
CREATE TABLE IF NOT EXISTS `s2_chat_config` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT DEFAULT NULL ,
`default_metrics` varchar(655) DEFAULT NULL,
`visibility` varchar(655) , -- invisible dimension metric information
`entity_info` varchar(655) ,
`dictionary_info` varchar(655) , -- dictionary-related dimension setting information
`created_at` TIMESTAMP NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_by` varchar(100) NOT NULL ,
`status` INT NOT NULL DEFAULT '0' , -- domain extension information status : 0 is normal, 1 is off the shelf, 2 is deleted
PRIMARY KEY (`id`)
) ;
COMMENT ON TABLE s2_chat_config IS 'chat config information table ';
CREATE TABLE IF NOT EXISTS `s2_dictionary` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL ,
`dim_value_infos` LONGVARCHAR , -- dimension value setting information
`created_at` TIMESTAMP NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_by` varchar(100) DEFAULT NULL ,
`status` INT NOT NULL DEFAULT '0' , -- domain extension information status : 0 is normal, 1 is off the shelf, 2 is deleted
PRIMARY KEY (`id`),
UNIQUE (domain_id)
);
COMMENT ON TABLE s2_dictionary IS 'dictionary configuration information table';
CREATE TABLE IF NOT EXISTS `s2_dictionary_task` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL , -- task name
`description` varchar(255) ,
`command`LONGVARCHAR NOT NULL , -- task Request Parameters
`command_md5` varchar(255) NOT NULL , -- task Request Parameters md5
`status` INT NOT NULL , -- the final status of the task
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
`created_by` varchar(100) NOT NULL ,
`progress` DOUBLE default 0.00 , -- task real-time progress
`elapsed_ms` bigINT DEFAULT NULL , -- the task takes time in milliseconds
`message` LONGVARCHAR , -- remark related information
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_dictionary_task IS 'dictionary task information table';
create table s2_user
(
id INT AUTO_INCREMENT,
name varchar(100) not null,
display_name varchar(100) null,
password varchar(100) null,
email varchar(100) null,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_user IS 'user information table';
-- semantic tables
CREATE TABLE IF NOT EXISTS `s2_domain` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` varchar(255) DEFAULT NULL , -- domain name
`biz_name` varchar(255) DEFAULT NULL , -- internal name
`parent_id` INT DEFAULT '0' , -- parent domain ID
`status` INT NOT NULL ,
`created_at` TIMESTAMP DEFAULT NULL ,
`created_by` varchar(100) DEFAULT NULL ,
`updated_at` TIMESTAMP DEFAULT NULL ,
`updated_by` varchar(100) DEFAULT NULL ,
`is_unique` INT DEFAULT NULL , -- 0 is non-unique, 1 is unique
`admin` varchar(3000) DEFAULT NULL , -- domain administrator
`admin_org` varchar(3000) DEFAULT NULL , -- domain administrators organization
`is_open` TINYINT DEFAULT NULL , -- whether the domain is public
`viewer` varchar(3000) DEFAULT NULL , -- domain available users
`view_org` varchar(3000) DEFAULT NULL , -- domain available organization
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_domain IS 'domain basic information';
CREATE TABLE `s2_database` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL ,
`name` varchar(255) NOT NULL ,
`description` varchar(500) DEFAULT NULL ,
`type` varchar(20) NOT NULL , -- type: mysql,clickhouse,tdw
`config` varchar(655) NOT NULL ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`updated_by` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_database IS 'database instance table';
CREATE TABLE IF NOT EXISTS `s2_datasource` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL ,
`name` varchar(255) NOT NULL ,
`biz_name` varchar(255) NOT NULL ,
`description` varchar(500) DEFAULT NULL ,
`database_id` INT NOT NULL ,
`datasource_detail` LONGVARCHAR NOT NULL ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`updated_by` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_datasource IS 'datasource table';
create table s2_auth_groups
(
group_id INT,
config varchar(2048),
PRIMARY KEY (`group_id`)
);
CREATE TABLE IF NOT EXISTS `s2_metric` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL ,
`name` varchar(255) NOT NULL ,
`biz_name` varchar(255) NOT NULL ,
`description` varchar(500) DEFAULT NULL ,
`status` INT NOT NULL , -- status, 0 is normal, 1 is off the shelf, 2 is deleted
`sensitive_level` INT NOT NULL ,
`type` varchar(50) NOT NULL , -- type proxy,expr
`type_params` LONGVARCHAR DEFAULT NULL ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`updated_by` varchar(100) NOT NULL ,
`data_format_type` varchar(50) DEFAULT NULL ,
`data_format` varchar(500) DEFAULT NULL,
`alias` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_metric IS 'metric information table';
CREATE TABLE IF NOT EXISTS `s2_dimension` (
`id` INT NOT NULL AUTO_INCREMENT ,
`domain_id` INT NOT NULL ,
`datasource_id` INT NOT NULL ,
`name` varchar(255) NOT NULL ,
`biz_name` varchar(255) NOT NULL ,
`description` varchar(500) NOT NULL ,
`status` INT NOT NULL , -- status, 0 is normal, 1 is off the shelf, 2 is deleted
`sensitive_level` INT DEFAULT NULL ,
`type` varchar(50) NOT NULL , -- type categorical,time
`type_params` LONGVARCHAR DEFAULT NULL ,
`expr` LONGVARCHAR NOT NULL , -- expression
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`updated_by` varchar(100) NOT NULL ,
`semantic_type` varchar(20) NOT NULL, -- semantic type: DATE, ID, CATEGORY
`alias` varchar(500) DEFAULT NULL,
`default_values` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_dimension IS 'dimension information table';
create table s2_datasource_rela
(
id INT AUTO_INCREMENT,
domain_id INT null,
datasource_from INT null,
datasource_to INT null,
join_key varchar(100) null,
created_at TIMESTAMP null,
created_by varchar(100) null,
updated_at TIMESTAMP null,
updated_by varchar(100) null,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_datasource_rela IS 'data source association table';
create table s2_view_info
(
id INT auto_increment,
domain_id INT null,
type varchar(20) null comment 'datasource、dimension、metric',
config LONGVARCHAR null comment 'config detail',
created_at TIMESTAMP null,
created_by varchar(100) null,
updated_at TIMESTAMP null,
updated_by varchar(100) not null
);
COMMENT ON TABLE s2_view_info IS 'view information table';
CREATE TABLE `s2_query_stat_info` (
`id` INT NOT NULL AUTO_INCREMENT,
`trace_id` varchar(200) DEFAULT NULL, -- query unique identifier
`domain_id` INT DEFAULT NULL,
`user` varchar(200) DEFAULT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
`query_type` varchar(200) DEFAULT NULL, -- the corresponding scene
`query_type_back` INT DEFAULT '0' , -- query type, 0-normal query, 1-pre-refresh type
`query_sql_cmd`LONGVARCHAR , -- sql type request parameter
`sql_cmd_md5` varchar(200) DEFAULT NULL, -- sql type request parameter md5
`query_struct_cmd`LONGVARCHAR , -- struct type request parameter
`struct_cmd_md5` varchar(200) DEFAULT NULL, -- struct type request parameter md5值
`sql`LONGVARCHAR ,
`sql_md5` varchar(200) DEFAULT NULL, -- sql md5
`query_engine` varchar(20) DEFAULT NULL,
`elapsed_ms` bigINT DEFAULT NULL,
`query_state` varchar(20) DEFAULT NULL,
`native_query` INT DEFAULT NULL, -- 1-detail query, 0-aggregation query
`start_date` varchar(50) DEFAULT NULL,
`end_date` varchar(50) DEFAULT NULL,
`dimensions`LONGVARCHAR , -- dimensions involved in sql
`metrics`LONGVARCHAR , -- metric involved in sql
`select_cols`LONGVARCHAR ,
`agg_cols`LONGVARCHAR ,
`filter_cols`LONGVARCHAR ,
`group_by_cols`LONGVARCHAR ,
`order_by_cols`LONGVARCHAR ,
`use_result_cache` TINYINT DEFAULT '-1' , -- whether to hit the result cache
`use_sql_cache` TINYINT DEFAULT '-1' , -- whether to hit the sql cache
`sql_cache_key`LONGVARCHAR , -- sql cache key
`result_cache_key`LONGVARCHAR , -- result cache key
PRIMARY KEY (`id`)
) ;
COMMENT ON TABLE s2_query_stat_info IS 'query statistics table';
CREATE TABLE IF NOT EXISTS `s2_semantic_pasre_info` (
`id` INT NOT NULL AUTO_INCREMENT,
`trace_id` varchar(200) NOT NULL ,
`domain_id` INT NOT NULL ,
`dimensions`LONGVARCHAR ,
`metrics`LONGVARCHAR ,
`orders`LONGVARCHAR ,
`filters`LONGVARCHAR ,
`date_info`LONGVARCHAR ,
`limit` INT NOT NULL ,
`native_query` TINYINT NOT NULL DEFAULT '0' ,
`sql`LONGVARCHAR ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`status` INT NOT NULL ,
`elapsed_ms` bigINT DEFAULT NULL ,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_semantic_pasre_info IS 'semantic layer sql parsing information table';
CREATE TABLE IF NOT EXISTS `s2_available_date_info` (
`id` INT NOT NULL AUTO_INCREMENT ,
`item_id` INT NOT NULL ,
`type` varchar(255) NOT NULL ,
`date_format` varchar(64) NOT NULL ,
`start_date` varchar(64) ,
`end_date` varchar(64) ,
`unavailable_date` LONGVARCHAR DEFAULT NULL ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`updated_by` varchar(100) NOT NULL ,
`status` INT DEFAULT '0', -- 1-in use 0 is normal, 1 is off the shelf, 2 is deleted
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_dimension IS 'dimension information table';
-------demo for semantic and chat
CREATE TABLE IF NOT EXISTS `s2_user_department` (
`user_name` varchar(200) NOT NULL,
`department` varchar(200) NOT NULL -- department of user
);
COMMENT ON TABLE s2_user_department IS 'user_department_info';
CREATE TABLE IF NOT EXISTS `s2_pv_uv_statis` (
`imp_date` varchar(200) NOT NULL,
`user_name` varchar(200) NOT NULL,
`page` varchar(200) NOT NULL
);
COMMENT ON TABLE s2_pv_uv_statis IS 's2_pv_uv_statis';
CREATE TABLE IF NOT EXISTS `s2_stay_time_statis` (
`imp_date` varchar(200) NOT NULL,
`user_name` varchar(200) NOT NULL,
`stay_hours` DOUBLE NOT NULL,
`page` varchar(200) NOT NULL
);
COMMENT ON TABLE s2_stay_time_statis IS 's2_stay_time_statis_info';

View File

@@ -0,0 +1,2 @@
root=.
CustomDictionaryPath=data/dictionary/custom/DimValue_1_1.txt;data/dictionary/custom/DimValue_1_2.txt;data/dictionary/custom/DimValue_1_3.txt;

View File

@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<contextName>logback</contextName>
<!-- <property name="LOG_PATH" value="${logback.logdir:-logs}"/>-->
<property name="LOG_PATH" value="${LOG_PATH:-logs}"/>
<property name="LOG_APPNAME" value="chat"/>
<!--输出到控制台-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} %line - %msg%n</pattern>
</encoder>
</appender>
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名称如果没有File 属性那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${LOG_PATH}/info.${LOG_APPNAME}.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${LOG_PATH}/info.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz</FileNamePattern>
<!--只保留最近30天的日志-->
<maxHistory>30</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%thread] %-5level [%X{TRACE_ID}] %logger{36} %line - %msg%n</pattern>
</encoder>
</appender>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的ThresholdFilter-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>Error</level>
</filter>
<!--日志名称如果没有File 属性那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${LOG_PATH}/error.${LOG_APPNAME}.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${LOG_PATH}/error.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%thread] %-5level [%X{TRACE_ID}] %logger{36} %line - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
<appender-ref ref="consoleLog"/>
</root>
<appender name="serviceLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名称如果没有File 属性那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${LOG_PATH}/serviceinfo.${LOG_APPNAME}.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${LOG_PATH}/serviceinfo.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz</FileNamePattern>
<!--只保留最近30天的日志-->
<maxHistory>30</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%thread] %-5level [%X{TRACE_ID}] %logger{36} %line - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.tencent.supersonic" level="INFO" additivity="true">
<appender-ref ref="serviceLog"/>
</logger>
</configuration>

View File

@@ -0,0 +1,31 @@
package com.tencent.supersonic.db;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
@MapperScan(value = "com.tencent.supersonic", annotationClass = Mapper.class)
public class MybatisConfig {
private static final String MAPPER_LOCATION = "classpath*:mapper/**/*.xml";
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
bean.setConfiguration(configuration);
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
return bean.getObject();
}
}

View File

@@ -0,0 +1,371 @@
package com.tencent.supersonic.test;
import com.tencent.supersonic.StandaloneLauncher;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.chat.api.pojo.Filter;
import com.tencent.supersonic.chat.api.request.QueryContextReq;
import com.tencent.supersonic.chat.api.response.QueryResultResp;
import com.tencent.supersonic.chat.application.query.MetricCompare;
import com.tencent.supersonic.chat.application.query.MetricDomain;
import com.tencent.supersonic.chat.application.query.MetricFilter;
import com.tencent.supersonic.chat.application.query.MetricGroupBy;
import com.tencent.supersonic.chat.domain.service.ChatService;
import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.common.pojo.SchemaItem;
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import com.tencent.supersonic.chat.domain.service.QueryService;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = StandaloneLauncher.class)
@ActiveProfiles("local")
public class QueryIntegrationTest {
private static final Logger LOGGER = LoggerFactory.getLogger(QueryIntegrationTest.class);
@Autowired
private ChatService chatService;
@Autowired
@Qualifier("chatQueryService")
private QueryService queryService;
//case:alice的访问次数,queryMode:METRIC_FILTER,
@Test
public void queryTest1() {
QueryContextReq queryContextReq = getQueryContextReq("alice的访问次数");
try {
QueryResultResp queryResultResp = queryService.executeQuery(queryContextReq);
LOGGER.info("QueryResultResp queryResultResp:{}", queryResultResp);
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricFilter.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric = new SchemaItem();
schemaItemMetric.setId(2L);
schemaItemMetric.setName("访问次数");
schemaItemMetric.setBizName("pv");
Boolean metricExist = false;
for (SchemaItem schemaItem : metrics) {
if (schemaItem.getId().equals(schemaItemMetric.getId()) &&
schemaItem.getName().equals(schemaItemMetric.getName()) &&
schemaItem.getBizName().equals(schemaItemMetric.getBizName())) {
metricExist = true;
}
}
assertThat(metricExist).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
SchemaItem schemaItemDimension = new SchemaItem();
schemaItemDimension.setBizName("sys_imp_date");
Boolean dimensionExist = false;
for (SchemaItem schemaItem : dimensions) {
if (schemaItem.getBizName().equals(schemaItemDimension.getBizName())) {
dimensionExist = true;
}
}
assertThat(dimensionExist).isEqualTo(true);
//assert 维度filter
Set<Filter> dimensionFilters = queryResultResp.getChatContext().getDimensionFilters();
Filter dimensionFilter = new Filter();
dimensionFilter.setBizName("user_name");
dimensionFilter.setOperator(FilterOperatorEnum.EQUALS);
dimensionFilter.setValue("alice");
dimensionFilter.setName("用户名");
dimensionFilter.setElementID(2L);
Boolean dimensionFilterExist = false;
for (Filter filter : dimensionFilters) {
if (filter.getBizName().equals(dimensionFilter.getBizName()) &&
filter.getOperator().equals(dimensionFilter.getOperator()) &&
filter.getValue().equals(dimensionFilter.getValue()) &&
filter.getElementID().equals(dimensionFilter.getElementID()) &&
filter.getName().equals(dimensionFilter.getName())) {
dimensionFilterExist = true;
}
}
assertThat(dimensionFilterExist).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = new DateConf();
dateInfo.setUnit(7);
dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS);
dateInfo.setPeriod("DAY");
Boolean timeFilterExist =
queryResultResp.getChatContext().getDateInfo().getUnit().equals(dateInfo.getUnit()) &&
queryResultResp.getChatContext().getDateInfo().getDateMode().equals(dateInfo.getDateMode())
&&
queryResultResp.getChatContext().getDateInfo().getPeriod().equals(dateInfo.getPeriod());
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
} catch (Exception e) {
}
}
//case:超音数的访问次数,queryMode:METRIC_DOMAIN
@Test
public void queryTest2() {
QueryContextReq queryContextReq = getQueryContextReq("超音数的访问次数");
try {
QueryResultResp queryResultResp = queryService.executeQuery(queryContextReq);
LOGGER.info("QueryResultResp queryResultResp:{}", queryResultResp);
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricDomain.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric = new SchemaItem();
schemaItemMetric.setId(2L);
schemaItemMetric.setName("访问次数");
schemaItemMetric.setBizName("pv");
Boolean metricExist = false;
for (SchemaItem schemaItem : metrics) {
if (schemaItem.getId().equals(schemaItemMetric.getId()) &&
schemaItem.getName().equals(schemaItemMetric.getName()) &&
schemaItem.getBizName().equals(schemaItemMetric.getBizName())) {
metricExist = true;
}
}
assertThat(metricExist).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
SchemaItem schemaItemDimension = new SchemaItem();
schemaItemDimension.setBizName("sys_imp_date");
Boolean dimensionExist = false;
for (SchemaItem schemaItem : dimensions) {
if (schemaItem.getBizName().equals(schemaItemDimension.getBizName())) {
dimensionExist = true;
}
}
assertThat(dimensionExist).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = new DateConf();
dateInfo.setUnit(7);
dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS);
dateInfo.setPeriod("DAY");
Boolean timeFilterExist =
queryResultResp.getChatContext().getDateInfo().getUnit().equals(dateInfo.getUnit()) &&
queryResultResp.getChatContext().getDateInfo().getDateMode().equals(dateInfo.getDateMode())
&&
queryResultResp.getChatContext().getDateInfo().getPeriod().equals(dateInfo.getPeriod());
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
} catch (Exception e) {
}
}
//case:超音数各部门的访问次数,queryMode:METRIC_GROUPBY
@Test
public void queryTest3() {
QueryContextReq queryContextReq = getQueryContextReq("超音数各部门的访问次数");
try {
QueryResultResp queryResultResp = queryService.executeQuery(queryContextReq);
LOGGER.info("QueryResultResp queryResultResp:{}", queryResultResp);
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricGroupBy.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric = new SchemaItem();
schemaItemMetric.setId(2L);
schemaItemMetric.setName("访问次数");
schemaItemMetric.setBizName("pv");
Boolean metricExist = false;
for (SchemaItem schemaItem : metrics) {
if (schemaItem.getId().equals(schemaItemMetric.getId()) &&
schemaItem.getName().equals(schemaItemMetric.getName()) &&
schemaItem.getBizName().equals(schemaItemMetric.getBizName())) {
metricExist = true;
}
}
assertThat(metricExist).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
SchemaItem schemaItemDimension = new SchemaItem();
schemaItemDimension.setBizName("sys_imp_date");
Boolean dimensionExist = false;
for (SchemaItem schemaItem : dimensions) {
if (schemaItem.getBizName().equals(schemaItemDimension.getBizName())) {
dimensionExist = true;
}
}
assertThat(dimensionExist).isEqualTo(true);
SchemaItem schemaItemDimension1 = new SchemaItem();
schemaItemDimension1.setBizName("department");
schemaItemDimension1.setName("部门");
schemaItemDimension1.setId(1L);
Boolean dimensionExist1 = false;
for (SchemaItem schemaItem : dimensions) {
if (schemaItem.getBizName().equals(schemaItemDimension1.getBizName()) &&
schemaItem.getId().equals(schemaItemDimension1.getId()) &&
schemaItem.getName().equals(schemaItemDimension1.getName())) {
dimensionExist1 = true;
}
}
assertThat(dimensionExist1).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = new DateConf();
dateInfo.setUnit(7);
dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS);
dateInfo.setPeriod("DAY");
Boolean timeFilterExist =
queryResultResp.getChatContext().getDateInfo().getUnit().equals(dateInfo.getUnit()) &&
queryResultResp.getChatContext().getDateInfo().getDateMode().equals(dateInfo.getDateMode())
&&
queryResultResp.getChatContext().getDateInfo().getPeriod().equals(dateInfo.getPeriod());
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
} catch (Exception e) {
}
}
//case:对比alice和lucy的访问次数,queryMode:METRIC_COMPARE
@Test
public void queryTest4() {
QueryContextReq queryContextReq = getQueryContextReq("对比alice和lucy的访问次数");
try {
QueryResultResp queryResultResp = queryService.executeQuery(queryContextReq);
LOGGER.info("QueryResultResp queryResultResp:{}", queryResultResp);
//assert queryState
Assert.assertEquals(queryResultResp.getQueryState(), 0);
//assert queryMode
Assert.assertEquals(queryResultResp.getQueryMode(), MetricCompare.QUERY_MODE);
//assert aggType
Assert.assertEquals(queryResultResp.getChatContext().getAggType(), null);
//assert 主题域Id
assertThat(queryResultResp.getChatContext().getDomainId()).isEqualTo(1L);
//assert 指标
Set<SchemaItem> metrics = queryResultResp.getChatContext().getMetrics();
SchemaItem schemaItemMetric = new SchemaItem();
schemaItemMetric.setId(2L);
schemaItemMetric.setName("访问次数");
schemaItemMetric.setBizName("pv");
Boolean metricExist = false;
for (SchemaItem schemaItem : metrics) {
if (schemaItem.getId().equals(schemaItemMetric.getId()) &&
schemaItem.getName().equals(schemaItemMetric.getName()) &&
schemaItem.getBizName().equals(schemaItemMetric.getBizName())) {
metricExist = true;
}
}
assertThat(metricExist).isEqualTo(true);
//assert 维度
Set<SchemaItem> dimensions = queryResultResp.getChatContext().getDimensions();
SchemaItem schemaItemDimension = new SchemaItem();
schemaItemDimension.setBizName("sys_imp_date");
Boolean dimensionExist = false;
for (SchemaItem schemaItem : dimensions) {
if (schemaItem.getBizName().equals(schemaItemDimension.getBizName())) {
dimensionExist = true;
}
}
assertThat(dimensionExist).isEqualTo(true);
//assert 维度filter
Set<Filter> dimensionFilters = queryResultResp.getChatContext().getDimensionFilters();
Filter dimensionFilter = new Filter();
dimensionFilter.setBizName("user_name");
dimensionFilter.setOperator(FilterOperatorEnum.IN);
List<String> list = new ArrayList<>();
list.add("alice");
list.add("lucy");
dimensionFilter.setValue(list);
dimensionFilter.setName("用户名");
dimensionFilter.setElementID(2L);
Boolean dimensionFilterExist = false;
for (Filter filter : dimensionFilters) {
if (filter.getBizName().equals(dimensionFilter.getBizName()) &&
filter.getOperator().equals(dimensionFilter.getOperator()) &&
filter.getValue().toString().equals(dimensionFilter.getValue().toString()) &&
filter.getElementID().equals(dimensionFilter.getElementID()) &&
filter.getName().equals(dimensionFilter.getName())) {
dimensionFilterExist = true;
}
}
assertThat(dimensionFilterExist).isEqualTo(true);
//assert 时间filter
DateConf dateInfo = new DateConf();
dateInfo.setUnit(7);
dateInfo.setDateMode(DateConf.DateMode.RECENT_UNITS);
dateInfo.setPeriod("DAY");
Boolean timeFilterExist =
queryResultResp.getChatContext().getDateInfo().getUnit().equals(dateInfo.getUnit()) &&
queryResultResp.getChatContext().getDateInfo().getDateMode().equals(dateInfo.getDateMode())
&&
queryResultResp.getChatContext().getDateInfo().getPeriod().equals(dateInfo.getPeriod());
assertThat(timeFilterExist).isEqualTo(true);
//assert nativeQuery
assertThat(queryResultResp.getChatContext().getNativeQuery()).isEqualTo(false);
} catch (Exception e) {
}
}
public QueryContextReq getQueryContextReq(String query) {
QueryContextReq queryContextReq = new QueryContextReq();
queryContextReq.setQueryText(query);//"alice的访问次数"
queryContextReq.setChatId(1);
queryContextReq.setUser(new User(1L, "admin", "admin", "admin@email"));
return queryContextReq;
}
}

View File

@@ -0,0 +1,23 @@
com.tencent.supersonic.chat.api.component.SchemaMapper=\
com.tencent.supersonic.chat.application.mapper.HanlpSchemaMapper
com.tencent.supersonic.chat.api.component.SemanticParser=\
com.tencent.supersonic.chat.application.parser.DomainSemanticParser, \
com.tencent.supersonic.chat.application.parser.TimeSemanticParser, \
com.tencent.supersonic.chat.application.parser.AggregateSemanticParser
# com.tencent.supersonic.chat.application.parser.LLMSemanticParser
com.tencent.supersonic.chat.api.component.QueryProcessor=\
com.tencent.supersonic.chat.application.processor.SemanticQueryProcessor
com.tencent.supersonic.chat.api.component.SemanticLayer=\
com.tencent.supersonic.chat.infrastructure.semantic.LocalSemanticLayerImpl
com.tencent.supersonic.chat.application.query.QuerySelector=\
com.tencent.supersonic.chat.application.query.HeuristicQuerySelector
com.tencent.supersonic.chat.application.query.DomainResolver=\
com.tencent.supersonic.chat.application.query.HeuristicDomainResolver
com.tencent.supersonic.auth.authentication.domain.interceptor.AuthenticationInterceptor=\
com.tencent.supersonic.auth.authentication.domain.interceptor.DefaultAuthenticationInterceptor

View File

@@ -0,0 +1,28 @@
spring:
h2:
console:
path: /h2-console/chat
# enabled web
enabled: true
datasource:
driver-class-name: org.h2.Driver
schema: classpath:db/schema-h2.sql
data: classpath:db/data-h2.sql
url: jdbc:h2:mem:semantic;DATABASE_TO_UPPER=false
username: root
password: semantic
server:
port: 9080
authentication:
enable: false
exclude:
path: /api/auth/user/register,/api/auth/user/login
semantic:
url:
prefix: http://127.0.0.1:9081
mybatis:
mapper-locations=classpath:mappers/custom/*.xml,classpath*:/mappers/*.xml

View File

@@ -0,0 +1,7 @@
spring:
profiles:
active: local
application:
name: chat
mybatis:
mapper-locations=classpath:mappers/custom/*.xml,classpath*:/mappers/*.xml

View File

@@ -0,0 +1,2 @@
[InternetShortcut]
URL=https://github.com/hankcs/HanLP/

View File

@@ -0,0 +1,3 @@
龚 nr 1
龛 ng 1
龛影 n 1

View File

@@ -0,0 +1,4 @@
买@水果 1
然后@来 1
我@遗忘 10
遗忘@我 10

View File

@@ -0,0 +1,5 @@
hr _1_1 876
sales _1_1 872
marketing _1_1 310
strategy _1_1 360
sales _1_1 500

View File

@@ -0,0 +1,7 @@
tom _1_2 52
alice _1_2 47
lucy _1_2 31
dean _1_2 36
john _1_2 50
jack _1_2 38
admin _1_2 70

View File

@@ -0,0 +1,6 @@
p1 _1_3 52
p2 _1_3 47
p3 _1_3 31
p4 _1_3 36
p5 _1_3 50
p6 _1_3 38

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,44 @@
序号,代码,名称,帮助记忆的诠释,例子及注解
1,Ag,形语素,形容词性语素。形容词代码为a语素代码前面置以A。,绿色/n 似/d 锦/Ag
2,a,形容词,取英语形容词adjective的第1个字母,[重要/a 步伐/n]NP ,美丽/a ,看似/v 抽象/a
3,ad,副形词,直接作状语的形容词。形容词代码a和副词代码d并在一起。,[积极/ad 谋求/v]V-ZZ ,幻象/n 易/ad 逝/Vg
4,an,名形词,具有名词功能的形容词。形容词代码a和名词代码n并在一起。,[外交/n 和/c 安全/an]NP-BL
5,Bg,区别语素,区别词性语素。区别词代码为b语素代码前面置以B。,赤/Ag 橙/Bg 黄/a 绿/a 青/a 蓝/a 紫/a
6,b,区别词,取汉字“别”的声母。,女/b 司机/n 金/b 手镯/n 慢性/b 胃炎/n 古/b 钱币/n 副/b 主任/n 总/b 公司/n单音节区别词和单音节名词或名语素组合作为一个词并标以名词词性n。 雄鸡/n 雌象/n 女魔/n 古币/n少数“单音节区别词+双音节词”的结构作为一个词。总书记/n
7,c,连词,取英语连词conjunction的第1个字母。,合作/vn 与/c 伙伴/n
8,Dg,副语素,副词性语素。副词代码为d语素代码前面置以D。,了解/v 甚/Dg 深/a ,煞/Dg 是/v 喜人/a
9,d,副词,取adverb的第2个字母因其第1个字母已用于形容词。,进一步/d 发展/v
10,e,叹词,取英语叹词exclamation的第1个字母。,啊/e /w 那/r 金灿灿/z 的/u 麦穗/n
11,f,方位词,取汉字“方”。,军人/n 的/u 眼睛/n 里/f 不/d 是/v 没有/v 风景/n
12,h,前接成分,取英语head的第1个字母。,许多/m 非/h 主角/n 人物/n ,办事处/n 的/u “/w 准/h 政府/n ”/w 功能/n 不断/d 加强/v
13,i,成语,取英语成语idiom的第1个字母。,一言一行/i ,义无反顾/i
14,j,简称略语,取汉字“简”的声母。,[德/j 外长/n]NP ,文教/j
15,k,后接成分,后接成分。,少年儿童/l 朋友/n 们/k ,身体/n 健康/a 者/k
16,l,习用语,习用语尚未成为成语,有点“临时性”,取“临”的声母。,少年儿童/l 朋友/n 们/k ,落到实处/l
17,Mg,数语素,数词性语素。数词代码为m语素代码前面置以M。,甲/Mg 减下/v 的/u 人/n 让/v 乙/Mg 背上/v ,凡/d “/w 寅/Mg 年/n ”/w 中/f 出生/v 的/u 人/n 生肖/n 都/d 属/v 虎/n
18,m,数词,取英语numeral的第3个字母nu已有他用。,1数量词组应切分为数词和量词。 三/m 个/q 10/m 公斤/q 一/m 盒/q 点心/n ,但少数数量词已是词典的登录单位,则不再切分。 一个/m 一些/m 2. 基数、序数、小数、分数、百分数一律不予切分,为一个切分单位,标注为 m 。一百二十三/m20万/m 123.54/m 一个/m 第一/m 第三十五/m 20%/m 三分之二/m 千分之三十/m 几十/m 人/n 十几万/m 元/q 第一百零一/m 个/q 3. 约数,前加副词、形容词或后加“来、多、左右”等助数词的应予分开。约/d 一百/m 多/m 万/m仅/d 一百/m 个/q 四十/m 来/m 个/q二十/m 余/m 只/q 十几/m 个/q三十/m 左右/m ,两个数词相连的及“成百”、“上千”等则不予切分。五六/m 年/q 七八/m 天/q十七八/m 岁/q 成百/m 学生/n上千/m 人/n 4表序关系的“数名”结构应予切分。二/m 连/n , 三/m 部/n
19,Ng,名语素,名词性语素。名词代码为n语素代码前面置以N。,出/v 过/u 两/m 天/q 差/Ng 理/v 了/u 一/m 次/q 发/Ng
20,n,名词,取英语名词noun的第1个字母。,(参见 动词--v岗位/n 城市/n 机会/n ,她/r 是/v 责任/n 编辑/n
21,nr,人名,名词代码n和“人(ren)”的声母并在一起。,1. 汉族人及与汉族起名方式相同的非汉族人的姓和名单独切分并分别标注为nr。张/nr 仁伟/nr 欧阳/nr 修/nr 阮/nr 志雄/nr 朴/nr 贞爱/nr汉族人除有单姓和复姓外还有双姓即有的女子出嫁后在原来的姓上加上丈夫的姓。如陈方安生。这种情况切分、标注为陈/nr 方/nr 安生/nr唐姜氏切分、标注为唐/nr 姜氏/nr。2. 姓名后的职务、职称或称呼要分开。江/nr 主席/n 小平/nr 同志/n 江/nr 总书记/n张/nr 教授/n 王/nr 部长/n 陈/nr 老总/n 李/nr 大娘/n 刘/nr 阿姨/n 龙/nr 姑姑/n3. 对人的简称、尊称等若为两个字则合为一个切分单位并标以nr。老张/nr 大李/nr 小郝/nr 郭老/nr 陈总/nr4. 明显带排行的亲属称谓要切分开,分不清楚的则不切开。三/m 哥/n 大婶/n 大/a 女儿/n 大哥/n 小弟/n 老爸/n5. 一些著名作者的或不易区分姓和名的笔名通常作为一个切分单位。鲁迅/nr 茅盾/nr 巴金/nr 三毛/nr 琼瑶/nr 白桦/nr6. 外国人或少数民族的译名包括日本人的姓名不予切分标注为nr。克林顿/nr 叶利钦/nr 才旦卓玛/nr 小林多喜二/nr 北研二/nr华盛顿/nr 爱因斯坦/nr有些西方人的姓名中有小圆点也不分开。卡尔·马克思/nr
22,ns,地名,名词代码n和处所词代码s并在一起。,参见2。短语标记说明--NS安徽/ns深圳/ns杭州/ns拉萨/ns哈尔滨/ns 呼和浩特/ns 乌鲁木齐/ns长江/ns黄海/ns太平洋/ns 泰山/ns 华山/ns亚洲/ns 海南岛/ns太湖/ns白洋淀/ns 俄罗斯/ns哈萨克斯坦/ns彼得堡/ns 伏尔加格勒/ns 1. 国名不论长短,作为一个切分单位。中国/ns 中华人民共和国/ns 日本国/ns 美利坚合众国/ns 美国/ns2. 地名后有“省”、“市”、“县”、“区”、“乡”、“镇”、“村”、“旗”、“州”、“都”、“府”、“道”等单字的行政区划名称时,不切分开,作为一个切分单位。四川省/ns 天津市/ns景德镇/ns沙市市/ns 牡丹江市/ns正定县/ns海淀区/ns 通州区/ns东升乡/ns 双桥镇/ns 南化村/ns华盛顿州/ns俄亥俄州/ns东京都/ns 大阪府/ns北海道/ns 长野县/ns开封府/ns宣城县/ns3. 地名后的行政区划有两个以上的汉字则将地名同行政区划名称切开不过要将地名同行政区划名称用方括号括起来并标以短语NS。[芜湖/ns 专区/n] NS[宣城/ns 地区/n]ns[内蒙古/ns 自治区/n]NS[深圳/ns 特区/n]NS [厦门/ns 经济/n 特区/n]NS [香港/ns 特别/a 行政区/n]NS[香港/ns 特区/n]NS [华盛顿/ns 特区/n]NS4. 地名后有表示地形地貌的一个字的普通名词,如“江、河、山、洋、海、岛、峰、湖”等,不予切分。鸭绿江/ns亚马逊河/ns 喜马拉雅山/ns 珠穆朗玛峰/ns地中海/ns大西洋/ns洞庭湖/ns 塞普路斯岛/ns 5. 地名后接的表示地形地貌的普通名词若有两个以上汉字则应切开。然后将地名同该普通名词标成短语NS。[台湾/ns 海峡/n]NS[华北/ns 平原/n]NS[帕米尔/ns 高原/n]NS [南沙/ns 群岛/n]NS[京东/ns 大/a 峡谷/n]NS [横断/b 山脉/n]NS6地名后有表示自然区划的一个字的普通名词如“ 街,路,道,巷,里,町,庄,村,弄,堡”等,不予切分。 中关村/ns长安街/ns学院路/ns 景德镇/ns 吴家堡/ns 庞各庄/ns 三元里/ns彼得堡/ns 北菜市巷/ns 7地名后接的表示自然区划的普通名词若有两个以上汉字则应切开。然后将地名同自然区划名词标成短语NS。[米市/ns 大街/n]NS [蒋家/nz 胡同/n]NS [陶然亭/ns 公园/n]NS 8 大小地名相连时的标注方式为:北京市/ns 海淀区/ns 海淀镇/ns [南/f 大街/n]NS [蒋家/nz 胡同/n]NS 24/m 号/q
23,nt,机构团体,“团”的声母为t名词代码n和t并在一起。,参见2。短语标记说明--NT联合国/nt中共中央/nt国务院/nt 北京大学/nt1大多数团体、机构、组织的专有名称一般是短语型的较长且含有地名或人名等专名再组合标注为短语NT。[中国/ns 计算机/n 学会/n]NT [香港/ns 钟表业/n 总会/n]NT [烟台/ns 大学/n]NT [香港/ns 理工大学/n]NT [华东/ns 理工大学/n]NT[合肥/ns 师范/n 学院/n]NT [北京/ns 图书馆/n]NT [富士通/nz 株式会社/n]NT [香山/ns 植物园/n]NT [安娜/nz 美容院/n]NT[上海/ns 手表/n 厂/n]NT [永和/nz 烧饼铺/n]NT[北京/ns 国安/nz 队/n]NT2. 对于在国际或中国范围内的知名的唯一的团体、机构、组织的名称即使前面没有专名也标为nt或NT。联合国/nt国务院/nt外交部/nt 财政部/nt教育部/nt 国防部/nt[世界/n 贸易/n 组织/n]NT [国家/n 教育/vn 委员会/n]NT[信息/n 产业/n 部/n]NT[全国/n 信息/n 技术/n 标准化/vn 委员会/n]NT[全国/n 总/b 工会/n]NT[全国/n 人民/n 代表/n 大会/n]NT美国的“国务院”其他国家的“外交部、财政部、教育部”必须在其所属国的国名之后出现时才联合标注为NT。[美国/ns 国务院/n]NT[法国/ns 外交部/n]NT[美/j 国会/n]NT日本有些政府机构名称很特别无论是否出现在“日本”国名之后都标为nt。[日本/ns 外务省/nt]NT[日/j 通产省/nt]NT通产省/nt 3. 前后相连有上下位关系的团体机构组织名称的处理方式如下:[联合国/nt 教科文/j 组织/n]NT [中国/ns 银行/n 北京/ns 分行/n]NT[河北省/ns 正定县/ns 西平乐乡/ns 南化村/ns 党支部/n]NT 当下位名称含有专名(如“北京/ns 分行/n”、“南化村/ns 党支部/n”、“昌平/ns 分校/n”也可脱离前面的上位名称单独标注为NT。[中国/ns 银行/n]NT [北京/ns 分行/n]NT北京大学/nt [昌平/ns 分校/n]NT4. 团体、机构、组织名称中用圆括号加注简称时:[宝山/ns 钢铁/n /w 宝钢/j /w 总/b 公司/n]NT[宝山/ns 钢铁/n 总/b 公司/n]NT/w 宝钢/j /w
24,nx,外文字符,外文字符。,A/nx 公司/n B/nx 先生/n X/nx 君/Ng 24/m K/nx 镀金/n C/nx 是/v 光速/n Windows98/nx PentiumIV/nx I LOVE THIS GAME/nx
25,nz,其他专名,“专”的声母的第1个字母为z名词代码n和z并在一起。,参见2。短语标记说明--NZ除人名、国名、地名、团体、机构、组织以外的其他专有名词都标以nz。满族/nz俄罗斯族/nz汉语/nz罗马利亚语/nz 捷克语/nz中文/nz 英文/nz 满人/nz 哈萨克人/nz 诺贝尔奖/nz 茅盾奖/nz 1.包含专有名称或简称的交通线标以nz短语型的标为NZ。津浦路/nz 石太线/nz [京/j 九/j 铁路/n]NZ [京/j 津/j 高速/b 公路/n]NZ 2. 历史上重要事件、运动等专有名称一般是短语型的按短语型专有名称处理标以NZ。[卢沟桥/ns 事件/n]NZ [西安/ns 事变/n]NZ[五四/t 运动/n]NZ [明治/nz 维新/n]NZ[甲午/t 战争/n]NZ3.专有名称后接多音节的名词,如“语言”、“文学”、“文化”、“方式”、“精神”等,失去专指性,则应分开。欧洲/ns 语言/n 法国/ns 文学/n 西方/ns 文化/n 贝多芬/nr 交响乐/n 雷锋/nr 精神/n 美国/ns 方式/n日本/ns 料理/n 宋朝/t 古董/n 4. 商标包括专名及后接的“牌”、“型”等是专指的标以nz但其后所接的商品仍标以普通名词n。康师傅/nr 方便面/n 中华牌/nz 香烟/n 牡丹III型/nz 电视机/n 联想/nz 电脑/n 鳄鱼/nz 衬衣/n 耐克/nz 鞋/n5. 以序号命名的名称一般不认为是专有名称。2/m 号/q 国道/n ,十一/m 届/q 三中全会/j如果前面有专名合起来作为短语型专名。[中国/ns 101/m 国道/n]NZ [中共/j 十一/m 届/q 三中全会/j]NZ6. 书、报、杂志、文档、报告、协议、合同等的名称通常有书名号加以标识,不作为专有名词。由于这些名字往往较长,名字本身按常规处理。《/w 宁波/ns 日报/n 》/w ,《/w 鲁迅/nr 全集/n 》/w中华/nz 读书/vn 报/n 杜甫/nr 诗选/n少数书名、报刊名等专有名称则不切分。红楼梦/nz 人民日报/nz儒林外史/nz 7. 当有些专名无法分辨它们是人名还是地名或机构名时暂标以nz。[巴黎/ns 贝尔希/nz 体育馆/n]NT其中“贝尔希”只好暂标为nz。
26,o,拟声词,取英语拟声词onomatopoeia的第1个字母。,哈哈/o 一/m 笑/v ,装载机/n 隆隆/o 推进/v
27,p,介词,取英语介词prepositional的第1个字母。,对/p 子孙后代/n 负责/v ,以/p 煤/n 养/v 农/Ng ,为/p 治理/v 荒山/n 服务/v 把/p 青年/n 推/v 上/v 了/u 领导/vn 岗位/n
28,q,量词,取英语quantity的第1个字母。,参见数词m首/m 批/q ,一/m 年/q
29,Rg,代语素,代词性语素。代词代码为r在语素的代码g前面置以R。,读者/n 就/d 是/v 这/r 两/m 棵/q 小树/n 扎根/v 于/p 斯/Rg 、/w 成长/v 于/p 斯/Rg 的/u 肥田/n 沃土/n
30,r,代词,取英语代词pronoun的第2个字母因p已用于介词。,单音节代词“本”、“每”、“各”、“诸”后接单音节名词时,和后接的单音节名词合为代词;当后接双音节名词时,应予切分。本报/r 每人/r 本社/r 本/r 地区/n 各/r 部门/n
31,s,处所词,取英语space的第1个字母。,家里/s 的/u 电脑/n 都/d 联通/v 了/u 国际/n 互联网/n ,西部/s 交通/n 咽喉/n
32,Tg,时语素,时间词性语素。时间词代码为t在语素的代码g前面置以T。,3日/t 晚/Tg 在/p 总统府/n 发表/v 声明/n ,尊重/v 现/Tg 执政/vn 当局/n 的/u 权威/n
33,t,时间词,取英语time的第1个字母。,1. 年月日时分秒按年、月、日、时、分、秒切分标注为t 。1997年/t 3月/t 19日/t 下午/t 2时/t 18分/t若数字后无表示时间的“年、月、日、时、分、秒”等的标为数词m。1998/m 中文/n 信息/n 处理/vn 国际/n 会议/n 2. 历史朝代的名称虽然有专有名词的性质仍标注为t。西周/t 秦朝/t 东汉/t 南北朝/t 清代/t“牛年、虎年”等一律不予切分标注为牛年/t 虎年/t 甲午年/t 甲午/t 战争/n 庚子/t 赔款/n 戊戌/t 变法/n
34,u,助词,取英语助词auxiliary。,[[俄罗斯/ns 和/c 北约/j]NP-BL 之间/f [战略/n 伙伴/n 关系/n]NP 的/u 建立/vn]NP 填平/v 了/u [[欧洲/ns 安全/a 政治/n]NP 的/u 鸿沟/n]NP
35,Vg,动语素,动词性语素。动词代码为v。在语素的代码g前面置以V。,洗/v 了/u 一个/m 舒舒服服/z 的/u 澡/Vg
36,v,动词,取英语动词verb的第一个字母。,(参见 名词--n[[[欧盟/j 扩大/v]S 的/u [历史性/n 决定/n]NP]NP 和/c [北约/j 开放/v]S]NP-BL [为/p [创建/v [一/m 种/q 新/a 的/u 欧洲/ns 安全/a 格局/n]NP]VP-SBI]PP-MD [奠定/v 了/u 基础/n]V-SBI
37,vd,副动词,直接作状语的动词。动词和副词的代码并在一起。,形势/n 会/v 持续/vd 好转/v ,认为/v 是/v 电话局/n 收/v 错/vd 了/u 费/n
38,vn,名动词,指具有名词功能的动词。动词和名词的代码并在一起。,引起/v 人们/n 的/u 关注/vn 和/c 思考/vn ,收费/vn 电话/n 的/u 号码/n
39,w,标点符号,,”/w /w
40,x,非语素字,非语素字只是一个符号字母x通常用于代表未知数、符号。,
41,Yg,语气语素,语气词性语素。语气词代码为y。在语素的代码g前面置以Y。,唯/d 大力/d 者/k 能/v 致/v 之/u 耳/Yg
42,y,语气词,取汉字“语”的声母。,会/v 泄露/v 用户/n 隐私/n 吗/y ,又/d 何在/v 呢/y
43,z,状态词,取汉字“状”的声母的前一个字母。,取得/v 扎扎实实/z 的/u 突破性/n 进展/vn ,四季/n 常青/z 的/u 热带/n 树木/n ,短短/z 几/m 年/q 间,
1 序号 代码 名称 帮助记忆的诠释 例子及注解
2 1 Ag 形语素 形容词性语素。形容词代码为a,语素代码g前面置以A。 绿色/n 似/d 锦/Ag ,
3 2 a 形容词 取英语形容词adjective的第1个字母 [重要/a 步伐/n]NP ,美丽/a ,看似/v 抽象/a ,
4 3 ad 副形词 直接作状语的形容词。形容词代码a和副词代码d并在一起。 [积极/ad 谋求/v]V-ZZ ,幻象/n 易/ad 逝/Vg ,
5 4 an 名形词 具有名词功能的形容词。形容词代码a和名词代码n并在一起。 [外交/n 和/c 安全/an]NP-BL ,
6 5 Bg 区别语素 区别词性语素。区别词代码为b,语素代码g前面置以B。 赤/Ag 橙/Bg 黄/a 绿/a 青/a 蓝/a 紫/a ,
7 6 b 区别词 取汉字“别”的声母。 女/b 司机/n, 金/b 手镯/n, 慢性/b 胃炎/n, 古/b 钱币/n, 副/b 主任/n, 总/b 公司/n单音节区别词和单音节名词或名语素组合,作为一个词,并标以名词词性n。 雄鸡/n, 雌象/n, 女魔/n, 古币/n少数“单音节区别词+双音节词”的结构作为一个词。总书记/n ,
8 7 c 连词 取英语连词conjunction的第1个字母。 合作/vn 与/c 伙伴/n
9 8 Dg 副语素 副词性语素。副词代码为d,语素代码g前面置以D。 了解/v 甚/Dg 深/a ,煞/Dg 是/v 喜人/a ,
10 9 d 副词 取adverb的第2个字母,因其第1个字母已用于形容词。 进一步/d 发展/v ,
11 10 e 叹词 取英语叹词exclamation的第1个字母。 啊/e ,/w 那/r 金灿灿/z 的/u 麦穗/n ,
12 11 f 方位词 取汉字“方”。 军人/n 的/u 眼睛/n 里/f 不/d 是/v 没有/v 风景/n ,
13 12 h 前接成分 取英语head的第1个字母。 许多/m 非/h 主角/n 人物/n ,办事处/n 的/u “/w 准/h 政府/n ”/w 功能/n 不断/d 加强/v ,
14 13 i 成语 取英语成语idiom的第1个字母。 一言一行/i ,义无反顾/i ,
15 14 j 简称略语 取汉字“简”的声母。 [德/j 外长/n]NP ,文教/j ,
16 15 k 后接成分 后接成分。 少年儿童/l 朋友/n 们/k ,身体/n 健康/a 者/k ,
17 16 l 习用语 习用语尚未成为成语,有点“临时性”,取“临”的声母。 少年儿童/l 朋友/n 们/k ,落到实处/l ,
18 17 Mg 数语素 数词性语素。数词代码为m,语素代码g前面置以M。 甲/Mg 减下/v 的/u 人/n 让/v 乙/Mg 背上/v ,凡/d “/w 寅/Mg 年/n ”/w 中/f 出生/v 的/u 人/n 生肖/n 都/d 属/v 虎/n ,
19 18 m 数词 取英语numeral的第3个字母,n,u已有他用。 1.数量词组应切分为数词和量词。 三/m 个/q, 10/m 公斤/q, 一/m 盒/q 点心/n ,但少数数量词已是词典的登录单位,则不再切分。 一个/m , 一些/m ,2. 基数、序数、小数、分数、百分数一律不予切分,为一个切分单位,标注为 m 。一百二十三/m,20万/m, 123.54/m, 一个/m, 第一/m, 第三十五/m, 20%/m, 三分之二/m, 千分之三十/m, 几十/m 人/n, 十几万/m 元/q, 第一百零一/m 个/q ,3. 约数,前加副词、形容词或后加“来、多、左右”等助数词的应予分开。约/d 一百/m 多/m 万/m,仅/d 一百/m 个/q, 四十/m 来/m 个/q,二十/m 余/m 只/q, 十几/m 个/q,三十/m 左右/m ,两个数词相连的及“成百”、“上千”等则不予切分。五六/m 年/q, 七八/m 天/q,十七八/m 岁/q, 成百/m 学生/n,上千/m 人/n, 4.表序关系的“数+名”结构,应予切分。二/m 连/n , 三/m 部/n ,
20 19 Ng 名语素 名词性语素。名词代码为n,语素代码g前面置以N。 出/v 过/u 两/m 天/q 差/Ng, 理/v 了/u 一/m 次/q 发/Ng,
21 20 n 名词 取英语名词noun的第1个字母。 (参见 动词--v)岗位/n , 城市/n , 机会/n ,她/r 是/v 责任/n 编辑/n ,
22 21 nr 人名 名词代码n和“人(ren)”的声母并在一起。 1. 汉族人及与汉族起名方式相同的非汉族人的姓和名单独切分,并分别标注为nr。张/nr 仁伟/nr, 欧阳/nr 修/nr, 阮/nr 志雄/nr, 朴/nr 贞爱/nr汉族人除有单姓和复姓外,还有双姓,即有的女子出嫁后,在原来的姓上加上丈夫的姓。如:陈方安生。这种情况切分、标注为:陈/nr 方/nr 安生/nr;唐姜氏,切分、标注为:唐/nr 姜氏/nr。2. 姓名后的职务、职称或称呼要分开。江/nr 主席/n, 小平/nr 同志/n, 江/nr 总书记/n,张/nr 教授/n, 王/nr 部长/n, 陈/nr 老总/n, 李/nr 大娘/n, 刘/nr 阿姨/n, 龙/nr 姑姑/n3. 对人的简称、尊称等若为两个字,则合为一个切分单位,并标以nr。老张/nr, 大李/nr, 小郝/nr, 郭老/nr, 陈总/nr4. 明显带排行的亲属称谓要切分开,分不清楚的则不切开。三/m 哥/n, 大婶/n, 大/a 女儿/n, 大哥/n, 小弟/n, 老爸/n5. 一些著名作者的或不易区分姓和名的笔名通常作为一个切分单位。鲁迅/nr, 茅盾/nr, 巴金/nr, 三毛/nr, 琼瑶/nr, 白桦/nr6. 外国人或少数民族的译名(包括日本人的姓名)不予切分,标注为nr。克林顿/nr, 叶利钦/nr, 才旦卓玛/nr, 小林多喜二/nr, 北研二/nr,华盛顿/nr, 爱因斯坦/nr有些西方人的姓名中有小圆点,也不分开。卡尔·马克思/nr
23 22 ns 地名 名词代码n和处所词代码s并在一起。 (参见2。短语标记说明--NS)安徽/ns,深圳/ns,杭州/ns,拉萨/ns,哈尔滨/ns, 呼和浩特/ns, 乌鲁木齐/ns,长江/ns,黄海/ns,太平洋/ns, 泰山/ns, 华山/ns,亚洲/ns, 海南岛/ns,太湖/ns,白洋淀/ns, 俄罗斯/ns,哈萨克斯坦/ns,彼得堡/ns, 伏尔加格勒/ns 1. 国名不论长短,作为一个切分单位。中国/ns, 中华人民共和国/ns, 日本国/ns, 美利坚合众国/ns, 美国/ns2. 地名后有“省”、“市”、“县”、“区”、“乡”、“镇”、“村”、“旗”、“州”、“都”、“府”、“道”等单字的行政区划名称时,不切分开,作为一个切分单位。四川省/ns, 天津市/ns,景德镇/ns沙市市/ns, 牡丹江市/ns,正定县/ns,海淀区/ns, 通州区/ns,东升乡/ns, 双桥镇/ns 南化村/ns,华盛顿州/ns,俄亥俄州/ns,东京都/ns, 大阪府/ns,北海道/ns, 长野县/ns,开封府/ns,宣城县/ns3. 地名后的行政区划有两个以上的汉字,则将地名同行政区划名称切开,不过要将地名同行政区划名称用方括号括起来,并标以短语NS。[芜湖/ns 专区/n] NS,[宣城/ns 地区/n]ns,[内蒙古/ns 自治区/n]NS,[深圳/ns 特区/n]NS, [厦门/ns 经济/n 特区/n]NS, [香港/ns 特别/a 行政区/n]NS,[香港/ns 特区/n]NS, [华盛顿/ns 特区/n]NS,4. 地名后有表示地形地貌的一个字的普通名词,如“江、河、山、洋、海、岛、峰、湖”等,不予切分。鸭绿江/ns,亚马逊河/ns, 喜马拉雅山/ns, 珠穆朗玛峰/ns,地中海/ns,大西洋/ns,洞庭湖/ns, 塞普路斯岛/ns 5. 地名后接的表示地形地貌的普通名词若有两个以上汉字,则应切开。然后将地名同该普通名词标成短语NS。[台湾/ns 海峡/n]NS,[华北/ns 平原/n]NS,[帕米尔/ns 高原/n]NS, [南沙/ns 群岛/n]NS,[京东/ns 大/a 峡谷/n]NS [横断/b 山脉/n]NS6.地名后有表示自然区划的一个字的普通名词,如“ 街,路,道,巷,里,町,庄,村,弄,堡”等,不予切分。 中关村/ns,长安街/ns,学院路/ns, 景德镇/ns, 吴家堡/ns, 庞各庄/ns, 三元里/ns,彼得堡/ns, 北菜市巷/ns, 7.地名后接的表示自然区划的普通名词若有两个以上汉字,则应切开。然后将地名同自然区划名词标成短语NS。[米市/ns 大街/n]NS, [蒋家/nz 胡同/n]NS , [陶然亭/ns 公园/n]NS , 8. 大小地名相连时的标注方式为:北京市/ns 海淀区/ns 海淀镇/ns [南/f 大街/n]NS [蒋家/nz 胡同/n]NS 24/m 号/q ,
24 23 nt 机构团体 “团”的声母为t,名词代码n和t并在一起。 (参见2。短语标记说明--NT)联合国/nt,中共中央/nt,国务院/nt, 北京大学/nt1.大多数团体、机构、组织的专有名称一般是短语型的,较长,且含有地名或人名等专名,再组合,标注为短语NT。[中国/ns 计算机/n 学会/n]NT, [香港/ns 钟表业/n 总会/n]NT, [烟台/ns 大学/n]NT, [香港/ns 理工大学/n]NT, [华东/ns 理工大学/n]NT,[合肥/ns 师范/n 学院/n]NT, [北京/ns 图书馆/n]NT, [富士通/nz 株式会社/n]NT, [香山/ns 植物园/n]NT, [安娜/nz 美容院/n]NT,[上海/ns 手表/n 厂/n]NT, [永和/nz 烧饼铺/n]NT,[北京/ns 国安/nz 队/n]NT,2. 对于在国际或中国范围内的知名的唯一的团体、机构、组织的名称即使前面没有专名,也标为nt或NT。联合国/nt,国务院/nt,外交部/nt, 财政部/nt,教育部/nt, 国防部/nt,[世界/n 贸易/n 组织/n]NT, [国家/n 教育/vn 委员会/n]NT,[信息/n 产业/n 部/n]NT,[全国/n 信息/n 技术/n 标准化/vn 委员会/n]NT,[全国/n 总/b 工会/n]NT,[全国/n 人民/n 代表/n 大会/n]NT,美国的“国务院”,其他国家的“外交部、财政部、教育部”,必须在其所属国的国名之后出现时,才联合标注为NT。[美国/ns 国务院/n]NT,[法国/ns 外交部/n]NT,[美/j 国会/n]NT,日本有些政府机构名称很特别,无论是否出现在“日本”国名之后都标为nt。[日本/ns 外务省/nt]NT,[日/j 通产省/nt]NT通产省/nt 3. 前后相连有上下位关系的团体机构组织名称的处理方式如下:[联合国/nt 教科文/j 组织/n]NT, [中国/ns 银行/n 北京/ns 分行/n]NT,[河北省/ns 正定县/ns 西平乐乡/ns 南化村/ns 党支部/n]NT, 当下位名称含有专名(如“北京/ns 分行/n”、“南化村/ns 党支部/n”、“昌平/ns 分校/n”)时,也可脱离前面的上位名称单独标注为NT。[中国/ns 银行/n]NT [北京/ns 分行/n]NT,北京大学/nt [昌平/ns 分校/n]NT,4. 团体、机构、组织名称中用圆括号加注简称时:[宝山/ns 钢铁/n (/w 宝钢/j )/w 总/b 公司/n]NT,[宝山/ns 钢铁/n 总/b 公司/n]NT,(/w 宝钢/j )/w
25 24 nx 外文字符 外文字符。 A/nx 公司/n ,B/nx 先生/n ,X/nx 君/Ng ,24/m K/nx 镀金/n ,C/nx 是/v 光速/n ,Windows98/nx ,PentiumIV/nx ,I LOVE THIS GAME/nx ,
26 25 nz 其他专名 “专”的声母的第1个字母为z,名词代码n和z并在一起。 (参见2。短语标记说明--NZ)除人名、国名、地名、团体、机构、组织以外的其他专有名词都标以nz。满族/nz,俄罗斯族/nz,汉语/nz,罗马利亚语/nz, 捷克语/nz,中文/nz, 英文/nz, 满人/nz, 哈萨克人/nz, 诺贝尔奖/nz, 茅盾奖/nz, 1.包含专有名称(或简称)的交通线,标以nz;短语型的,标为NZ。津浦路/nz, 石太线/nz, [京/j 九/j 铁路/n]NZ, [京/j 津/j 高速/b 公路/n]NZ, 2. 历史上重要事件、运动等专有名称一般是短语型的,按短语型专有名称处理,标以NZ。[卢沟桥/ns 事件/n]NZ, [西安/ns 事变/n]NZ,[五四/t 运动/n]NZ, [明治/nz 维新/n]NZ,[甲午/t 战争/n]NZ,3.专有名称后接多音节的名词,如“语言”、“文学”、“文化”、“方式”、“精神”等,失去专指性,则应分开。欧洲/ns 语言/n, 法国/ns 文学/n, 西方/ns 文化/n, 贝多芬/nr 交响乐/n, 雷锋/nr 精神/n, 美国/ns 方式/n,日本/ns 料理/n, 宋朝/t 古董/n 4. 商标(包括专名及后接的“牌”、“型”等)是专指的,标以nz,但其后所接的商品仍标以普通名词n。康师傅/nr 方便面/n, 中华牌/nz 香烟/n, 牡丹III型/nz 电视机/n, 联想/nz 电脑/n, 鳄鱼/nz 衬衣/n, 耐克/nz 鞋/n5. 以序号命名的名称一般不认为是专有名称。2/m 号/q 国道/n ,十一/m 届/q 三中全会/j如果前面有专名,合起来作为短语型专名。[中国/ns 101/m 国道/n]NZ, [中共/j 十一/m 届/q 三中全会/j]NZ,6. 书、报、杂志、文档、报告、协议、合同等的名称通常有书名号加以标识,不作为专有名词。由于这些名字往往较长,名字本身按常规处理。《/w 宁波/ns 日报/n 》/w ,《/w 鲁迅/nr 全集/n 》/w,中华/nz 读书/vn 报/n, 杜甫/nr 诗选/n,少数书名、报刊名等专有名称,则不切分。红楼梦/nz, 人民日报/nz,儒林外史/nz 7. 当有些专名无法分辨它们是人名还是地名或机构名时,暂标以nz。[巴黎/ns 贝尔希/nz 体育馆/n]NT,其中“贝尔希”只好暂标为nz。
27 26 o 拟声词 取英语拟声词onomatopoeia的第1个字母。 哈哈/o 一/m 笑/v ,装载机/n 隆隆/o 推进/v ,
28 27 p 介词 取英语介词prepositional的第1个字母。 对/p 子孙后代/n 负责/v ,以/p 煤/n 养/v 农/Ng ,为/p 治理/v 荒山/n 服务/v , 把/p 青年/n 推/v 上/v 了/u 领导/vn 岗位/n ,
29 28 q 量词 取英语quantity的第1个字母。 (参见数词m)首/m 批/q ,一/m 年/q ,
30 29 Rg 代语素 代词性语素。代词代码为r,在语素的代码g前面置以R。 读者/n 就/d 是/v 这/r 两/m 棵/q 小树/n 扎根/v 于/p 斯/Rg 、/w 成长/v 于/p 斯/Rg 的/u 肥田/n 沃土/n ,
31 30 r 代词 取英语代词pronoun的第2个字母,因p已用于介词。 单音节代词“本”、“每”、“各”、“诸”后接单音节名词时,和后接的单音节名词合为代词;当后接双音节名词时,应予切分。本报/r, 每人/r, 本社/r, 本/r 地区/n, 各/r 部门/n
32 31 s 处所词 取英语space的第1个字母。 家里/s 的/u 电脑/n 都/d 联通/v 了/u 国际/n 互联网/n ,西部/s 交通/n 咽喉/n ,
33 32 Tg 时语素 时间词性语素。时间词代码为t,在语素的代码g前面置以T。 3日/t 晚/Tg 在/p 总统府/n 发表/v 声明/n ,尊重/v 现/Tg 执政/vn 当局/n 的/u 权威/n ,
34 33 t 时间词 取英语time的第1个字母。 1. 年月日时分秒,按年、月、日、时、分、秒切分,标注为t 。1997年/t 3月/t 19日/t 下午/t 2时/t 18分/t若数字后无表示时间的“年、月、日、时、分、秒”等的标为数词m。1998/m 中文/n 信息/n 处理/vn 国际/n 会议/n 2. 历史朝代的名称虽然有专有名词的性质,仍标注为t。西周/t, 秦朝/t, 东汉/t, 南北朝/t, 清代/t“牛年、虎年”等一律不予切分,标注为:牛年/t, 虎年/t, 甲午年/t, 甲午/t 战争/n, 庚子/t 赔款/n, 戊戌/t 变法/n
35 34 u 助词 取英语助词auxiliary。 [[俄罗斯/ns 和/c 北约/j]NP-BL 之间/f [战略/n 伙伴/n 关系/n]NP 的/u 建立/vn]NP 填平/v 了/u [[欧洲/ns 安全/a 政治/n]NP 的/u 鸿沟/n]NP
36 35 Vg 动语素 动词性语素。动词代码为v。在语素的代码g前面置以V。 洗/v 了/u 一个/m 舒舒服服/z 的/u 澡/Vg
37 36 v 动词 取英语动词verb的第一个字母。 (参见 名词--n)[[[欧盟/j 扩大/v]S 的/u [历史性/n 决定/n]NP]NP 和/c [北约/j 开放/v]S]NP-BL [为/p [创建/v [一/m 种/q 新/a 的/u 欧洲/ns 安全/a 格局/n]NP]VP-SBI]PP-MD [奠定/v 了/u 基础/n]V-SBI ,,
38 37 vd 副动词 直接作状语的动词。动词和副词的代码并在一起。 形势/n 会/v 持续/vd 好转/v ,认为/v 是/v 电话局/n 收/v 错/vd 了/u 费/n ,
39 38 vn 名动词 指具有名词功能的动词。动词和名词的代码并在一起。 引起/v 人们/n 的/u 关注/vn 和/c 思考/vn ,收费/vn 电话/n 的/u 号码/n ,
40 39 w 标点符号 ”/w :/w
41 40 x 非语素字 非语素字只是一个符号,字母x通常用于代表未知数、符号。
42 41 Yg 语气语素 语气词性语素。语气词代码为y。在语素的代码g前面置以Y。 唯/d 大力/d 者/k 能/v 致/v 之/u 耳/Yg
43 42 y 语气词 取汉字“语”的声母。 会/v 泄露/v 用户/n 隐私/n 吗/y ,又/d 何在/v 呢/y ?
44 43 z 状态词 取汉字“状”的声母的前一个字母。 取得/v 扎扎实实/z 的/u 突破性/n 进展/vn ,四季/n 常青/z 的/u 热带/n 树木/n ,短短/z 几/m 年/q 间,

View File

@@ -0,0 +1 @@
1.7.5

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,341 @@
-- chat tables
CREATE TABLE IF NOT EXISTS `s2_chat_context`
(
`chat_id` BIGINT NOT NULL , -- context chat id
`modified_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , -- row modify time
`user` varchar(64) DEFAULT NULL , -- row modify user
`query_text` LONGVARCHAR DEFAULT NULL , -- query text
`semantic_parse` LONGVARCHAR DEFAULT NULL , -- parse data
`ext_data` LONGVARCHAR DEFAULT NULL , -- extend data
PRIMARY KEY (`chat_id`)
);
CREATE TABLE IF NOT EXISTS `s2_chat`
(
`chat_id` BIGINT auto_increment ,-- AUTO_INCREMENT,
`chat_name` varchar(100) DEFAULT NULL,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
`last_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
`creator` varchar(30) DEFAULT NULL,
`last_question` varchar(200) DEFAULT NULL,
`is_delete` INT DEFAULT '0' COMMENT 'is deleted',
`is_top` INT DEFAULT '0' COMMENT 'is top',
PRIMARY KEY (`chat_id`)
) ;
CREATE TABLE `s2_chat_query`
(
`question_id` BIGINT NOT NULL AUTO_INCREMENT,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`query_text` mediumtext,
`user_name` varchar(150) DEFAULT NULL COMMENT '',
`query_state` int(1) DEFAULT NULL,
`chat_id` BIGINT NOT NULL , -- context chat id
`query_response` mediumtext NOT NULL ,
`score` int DEFAULT '0',
`feedback` varchar(1024) DEFAULT '',
PRIMARY KEY (`question_id`)
);
CREATE TABLE IF NOT EXISTS `s2_chat_config` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT DEFAULT NULL ,
`default_metrics` varchar(655) DEFAULT NULL,
`visibility` varchar(655) , -- invisible dimension metric information
`entity_info` varchar(655) ,
`dictionary_info` varchar(655) , -- dictionary-related dimension setting information
`created_at` TIMESTAMP NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_by` varchar(100) NOT NULL ,
`status` INT NOT NULL DEFAULT '0' , -- domain extension information status : 0 is normal, 1 is off the shelf, 2 is deleted
PRIMARY KEY (`id`)
) ;
COMMENT ON TABLE s2_chat_config IS 'chat config information table ';
CREATE TABLE IF NOT EXISTS `s2_dictionary` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL ,
`dim_value_infos` LONGVARCHAR , -- dimension value setting information
`created_at` TIMESTAMP NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_by` varchar(100) DEFAULT NULL ,
`status` INT NOT NULL DEFAULT '0' , -- domain extension information status : 0 is normal, 1 is off the shelf, 2 is deleted
PRIMARY KEY (`id`),
UNIQUE (domain_id)
);
COMMENT ON TABLE s2_dictionary IS 'dictionary configuration information table';
CREATE TABLE IF NOT EXISTS `s2_dictionary_task` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL , -- task name
`description` varchar(255) ,
`command`LONGVARCHAR NOT NULL , -- task Request Parameters
`command_md5` varchar(255) NOT NULL , -- task Request Parameters md5
`status` INT NOT NULL , -- the final status of the task
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
`created_by` varchar(100) NOT NULL ,
`progress` DOUBLE default 0.00 , -- task real-time progress
`elapsed_ms` bigINT DEFAULT NULL , -- the task takes time in milliseconds
`message` LONGVARCHAR , -- remark related information
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_dictionary_task IS 'dictionary task information table';
create table s2_user
(
id INT AUTO_INCREMENT,
name varchar(100) not null,
display_name varchar(100) null,
password varchar(100) null,
email varchar(100) null,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_user IS 'user information table';
-- semantic tables
CREATE TABLE IF NOT EXISTS `s2_domain` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` varchar(255) DEFAULT NULL , -- domain name
`biz_name` varchar(255) DEFAULT NULL , -- internal name
`parent_id` INT DEFAULT '0' , -- parent domain ID
`status` INT NOT NULL ,
`created_at` TIMESTAMP DEFAULT NULL ,
`created_by` varchar(100) DEFAULT NULL ,
`updated_at` TIMESTAMP DEFAULT NULL ,
`updated_by` varchar(100) DEFAULT NULL ,
`is_unique` INT DEFAULT NULL , -- 0 is non-unique, 1 is unique
`admin` varchar(3000) DEFAULT NULL , -- domain administrator
`admin_org` varchar(3000) DEFAULT NULL , -- domain administrators organization
`is_open` TINYINT DEFAULT NULL , -- whether the domain is public
`viewer` varchar(3000) DEFAULT NULL , -- domain available users
`view_org` varchar(3000) DEFAULT NULL , -- domain available organization
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_domain IS 'domain basic information';
CREATE TABLE `s2_database` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL ,
`name` varchar(255) NOT NULL ,
`description` varchar(500) DEFAULT NULL ,
`type` varchar(20) NOT NULL , -- type: mysql,clickhouse,tdw
`config` varchar(655) NOT NULL ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`updated_by` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_database IS 'database instance table';
CREATE TABLE IF NOT EXISTS `s2_datasource` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL ,
`name` varchar(255) NOT NULL ,
`biz_name` varchar(255) NOT NULL ,
`description` varchar(500) DEFAULT NULL ,
`database_id` INT NOT NULL ,
`datasource_detail` LONGVARCHAR NOT NULL ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`updated_by` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_datasource IS 'datasource table';
create table s2_auth_groups
(
group_id INT,
config varchar(2048),
PRIMARY KEY (`group_id`)
);
CREATE TABLE IF NOT EXISTS `s2_metric` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL ,
`name` varchar(255) NOT NULL ,
`biz_name` varchar(255) NOT NULL ,
`description` varchar(500) DEFAULT NULL ,
`status` INT NOT NULL , -- status, 0 is normal, 1 is off the shelf, 2 is deleted
`sensitive_level` INT NOT NULL ,
`type` varchar(50) NOT NULL , -- type proxy,expr
`type_params` LONGVARCHAR DEFAULT NULL ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`updated_by` varchar(100) NOT NULL ,
`data_format_type` varchar(50) DEFAULT NULL ,
`data_format` varchar(500) DEFAULT NULL,
`alias` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_metric IS 'metric information table';
CREATE TABLE IF NOT EXISTS `s2_dimension` (
`id` INT NOT NULL AUTO_INCREMENT ,
`domain_id` INT NOT NULL ,
`datasource_id` INT NOT NULL ,
`name` varchar(255) NOT NULL ,
`biz_name` varchar(255) NOT NULL ,
`description` varchar(500) NOT NULL ,
`status` INT NOT NULL , -- status, 0 is normal, 1 is off the shelf, 2 is deleted
`sensitive_level` INT DEFAULT NULL ,
`type` varchar(50) NOT NULL , -- type categorical,time
`type_params` LONGVARCHAR DEFAULT NULL ,
`expr` LONGVARCHAR NOT NULL , -- expression
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`updated_by` varchar(100) NOT NULL ,
`semantic_type` varchar(20) NOT NULL, -- semantic type: DATE, ID, CATEGORY
`alias` varchar(500) DEFAULT NULL,
`default_values` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_dimension IS 'dimension information table';
create table s2_datasource_rela
(
id INT AUTO_INCREMENT,
domain_id INT null,
datasource_from INT null,
datasource_to INT null,
join_key varchar(100) null,
created_at TIMESTAMP null,
created_by varchar(100) null,
updated_at TIMESTAMP null,
updated_by varchar(100) null,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_datasource_rela IS 'data source association table';
create table s2_view_info
(
id INT auto_increment,
domain_id INT null,
type varchar(20) null comment 'datasource、dimension、metric',
config LONGVARCHAR null comment 'config detail',
created_at TIMESTAMP null,
created_by varchar(100) null,
updated_at TIMESTAMP null,
updated_by varchar(100) not null
);
COMMENT ON TABLE s2_view_info IS 'view information table';
CREATE TABLE `s2_query_stat_info` (
`id` INT NOT NULL AUTO_INCREMENT,
`trace_id` varchar(200) DEFAULT NULL, -- query unique identifier
`domain_id` INT DEFAULT NULL,
`user` varchar(200) DEFAULT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
`query_type` varchar(200) DEFAULT NULL, -- the corresponding scene
`query_type_back` INT DEFAULT '0' , -- query type, 0-normal query, 1-pre-refresh type
`query_sql_cmd`LONGVARCHAR , -- sql type request parameter
`sql_cmd_md5` varchar(200) DEFAULT NULL, -- sql type request parameter md5
`query_struct_cmd`LONGVARCHAR , -- struct type request parameter
`struct_cmd_md5` varchar(200) DEFAULT NULL, -- struct type request parameter md5值
`sql`LONGVARCHAR ,
`sql_md5` varchar(200) DEFAULT NULL, -- sql md5
`query_engine` varchar(20) DEFAULT NULL,
`elapsed_ms` bigINT DEFAULT NULL,
`query_state` varchar(20) DEFAULT NULL,
`native_query` INT DEFAULT NULL, -- 1-detail query, 0-aggregation query
`start_date` varchar(50) DEFAULT NULL,
`end_date` varchar(50) DEFAULT NULL,
`dimensions`LONGVARCHAR , -- dimensions involved in sql
`metrics`LONGVARCHAR , -- metric involved in sql
`select_cols`LONGVARCHAR ,
`agg_cols`LONGVARCHAR ,
`filter_cols`LONGVARCHAR ,
`group_by_cols`LONGVARCHAR ,
`order_by_cols`LONGVARCHAR ,
`use_result_cache` TINYINT DEFAULT '-1' , -- whether to hit the result cache
`use_sql_cache` TINYINT DEFAULT '-1' , -- whether to hit the sql cache
`sql_cache_key`LONGVARCHAR , -- sql cache key
`result_cache_key`LONGVARCHAR , -- result cache key
PRIMARY KEY (`id`)
) ;
COMMENT ON TABLE s2_query_stat_info IS 'query statistics table';
CREATE TABLE IF NOT EXISTS `s2_semantic_pasre_info` (
`id` INT NOT NULL AUTO_INCREMENT,
`trace_id` varchar(200) NOT NULL ,
`domain_id` INT NOT NULL ,
`dimensions`LONGVARCHAR ,
`metrics`LONGVARCHAR ,
`orders`LONGVARCHAR ,
`filters`LONGVARCHAR ,
`date_info`LONGVARCHAR ,
`limit` INT NOT NULL ,
`native_query` TINYINT NOT NULL DEFAULT '0' ,
`sql`LONGVARCHAR ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`status` INT NOT NULL ,
`elapsed_ms` bigINT DEFAULT NULL ,
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_semantic_pasre_info IS 'semantic layer sql parsing information table';
CREATE TABLE IF NOT EXISTS `s2_available_date_info` (
`id` INT NOT NULL AUTO_INCREMENT ,
`item_id` INT NOT NULL ,
`type` varchar(255) NOT NULL ,
`date_format` varchar(64) NOT NULL ,
`start_date` varchar(64) ,
`end_date` varchar(64) ,
`unavailable_date` LONGVARCHAR DEFAULT NULL ,
`created_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP NOT NULL ,
`updated_by` varchar(100) NOT NULL ,
`status` INT DEFAULT '0', -- 1-in use 0 is normal, 1 is off the shelf, 2 is deleted
PRIMARY KEY (`id`)
);
COMMENT ON TABLE s2_dimension IS 'dimension information table';
-------demo for semantic and chat
CREATE TABLE IF NOT EXISTS `s2_user_department` (
`user_name` varchar(200) NOT NULL,
`department` varchar(200) NOT NULL -- department of user
);
COMMENT ON TABLE s2_user_department IS 'user_department_info';
CREATE TABLE IF NOT EXISTS `s2_pv_uv_statis` (
`imp_date` varchar(200) NOT NULL,
`user_name` varchar(200) NOT NULL,
`page` varchar(200) NOT NULL
);
COMMENT ON TABLE s2_pv_uv_statis IS 's2_pv_uv_statis';
CREATE TABLE IF NOT EXISTS `s2_stay_time_statis` (
`imp_date` varchar(200) NOT NULL,
`user_name` varchar(200) NOT NULL,
`stay_hours` DOUBLE NOT NULL,
`page` varchar(200) NOT NULL
);
COMMENT ON TABLE s2_stay_time_statis IS 's2_stay_time_statis_info';

View File

@@ -0,0 +1,2 @@
root=.
CustomDictionaryPath=data/dictionary/custom/DimValue_1_1.txt;data/dictionary/custom/DimValue_1_2.txt;data/dictionary/custom/DimValue_1_3.txt;

View File

@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<contextName>logback</contextName>
<!-- <property name="LOG_PATH" value="${logback.logdir:-logs}"/>-->
<property name="LOG_PATH" value="${LOG_PATH:-logs}"/>
<property name="LOG_APPNAME" value="chat"/>
<!--输出到控制台-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} %line - %msg%n</pattern>
</encoder>
</appender>
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名称如果没有File 属性那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${LOG_PATH}/info.${LOG_APPNAME}.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${LOG_PATH}/info.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz</FileNamePattern>
<!--只保留最近30天的日志-->
<maxHistory>30</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%thread] %-5level [%X{TRACE_ID}] %logger{36} %line - %msg%n</pattern>
</encoder>
</appender>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的ThresholdFilter-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>Error</level>
</filter>
<!--日志名称如果没有File 属性那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${LOG_PATH}/error.${LOG_APPNAME}.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${LOG_PATH}/error.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%thread] %-5level [%X{TRACE_ID}] %logger{36} %line - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
<appender-ref ref="consoleLog"/>
</root>
<appender name="serviceLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名称如果没有File 属性那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${LOG_PATH}/serviceinfo.${LOG_APPNAME}.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${LOG_PATH}/serviceinfo.${LOG_APPNAME}.%d{yyyy-MM-dd}.log.gz</FileNamePattern>
<!--只保留最近30天的日志-->
<maxHistory>30</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%thread] %-5level [%X{TRACE_ID}] %logger{36} %line - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.tencent.supersonic" level="INFO" additivity="true">
<appender-ref ref="serviceLog"/>
</logger>
</configuration>