UnisKB/ui/src/views/dataset/step/StepSecond.vue

177 lines
5.5 KiB
Vue
Raw Normal View History

2023-11-02 01:56:14 +00:00
<template>
<div class="set-rules">
2023-11-08 11:08:54 +00:00
<el-row class="set-rules-height">
<el-col :span="12" class="p-24">
2023-11-06 11:06:02 +00:00
<h4 class="title-decoration-1 mb-8">设置分段规则</h4>
2023-11-08 11:08:54 +00:00
<div>
2023-11-06 11:06:02 +00:00
<el-scrollbar>
2023-11-08 11:08:54 +00:00
<div class="left-height">
2023-11-06 11:06:02 +00:00
<el-radio-group v-model="radio" class="set-rules__radio">
<el-radio label="1" size="large" border class="mb-16">
<p>智能分段推荐)</p>
<el-text type="info">不了解如何设置分段规则推荐使用智能分段</el-text>
</el-radio>
<el-radio label="2" size="large" border class="mb-16">
<p>高级分段</p>
<el-text type="info"
>用户可根据文档规范自行设置分段标识符分段长度以及清洗规则
</el-text>
<el-card shadow="never" class="card-never mt-16" v-if="radio === '2'">
2023-11-08 11:08:54 +00:00
<div class="set-rules__form">
<div class="form-item mb-16">
<div class="title flex align-center mb-8">
<span style="margin-right: 4px">分段标识</span>
<el-popover
placement="right"
:width="400"
trigger="hover"
content="按照所选符号先后顺序做递归分割,分割结果超出分段长度将截取至分段长度。"
>
<template #reference>
<el-icon style="font-size: 16px"><Warning /></el-icon>
</template>
</el-popover>
</div>
<el-select v-model="form.patterns" multiple placeholder="请选择">
2023-11-06 11:06:02 +00:00
<el-option
2023-11-08 11:08:54 +00:00
v-for="item in patternsList"
2023-11-06 11:06:02 +00:00
:key="item"
:label="item"
:value="item"
2023-11-08 11:08:54 +00:00
multiple
>
</el-option>
2023-11-06 11:06:02 +00:00
</el-select>
2023-11-08 11:08:54 +00:00
</div>
<div class="form-item mb-16">
<div class="title mb-8">分段长度</div>
<el-slider
v-model="form.limit"
show-input
:show-input-controls="false"
:min="10"
:max="1024"
/>
</div>
<div class="form-item mb-16">
<div class="title mb-8">自动清洗</div>
<el-switch v-model="form.with_filter" />
<div style="margin-top: 4px">
<el-text type="info">去掉重复多余符号空格空行制表符</el-text>
</div>
</div>
</div>
2023-11-06 11:06:02 +00:00
</el-card>
</el-radio>
</el-radio-group>
</div>
</el-scrollbar>
<div class="text-right">
<el-button @click="splitDocument"></el-button>
2023-11-02 01:56:14 +00:00
</div>
</div>
</el-col>
2023-11-08 11:08:54 +00:00
<el-col :span="12" class="p-24 border-l">
<div>
2023-11-06 11:06:02 +00:00
<h4 class="title-decoration-1 mb-8">分段预览</h4>
2023-11-08 11:08:54 +00:00
<SegmentPreview v-model:data="segmentList" />
2023-11-06 11:06:02 +00:00
</div>
2023-11-02 01:56:14 +00:00
</el-col>
</el-row>
</div>
</template>
<script setup lang="ts">
2023-11-06 11:06:02 +00:00
import { ref, computed, onMounted, reactive } from 'vue'
2023-11-02 01:56:14 +00:00
import SegmentPreview from '@/views/dataset/component/SegmentPreview.vue'
import DatasetApi from '@/api/dataset'
import useStore from '@/stores'
const { dataset } = useStore()
const documentsFiles = computed(() => dataset.documentsFiles)
2023-11-08 11:08:54 +00:00
const patternType = ['空行', '#', '##', '###', '####', '-', '空格', '回车', '句号', '逗号', '分号']
const marks = reactive({
10: '10',
1024: '1024'
})
2023-11-02 01:56:14 +00:00
2023-11-06 11:06:02 +00:00
const radio = ref('1')
2023-11-02 01:56:14 +00:00
const loading = ref(false)
2023-11-08 11:08:54 +00:00
const segmentList = ref<any[]>([])
2023-11-06 11:06:02 +00:00
2023-11-08 11:08:54 +00:00
const form = reactive<any>({
patterns: [] as any,
limit: 0,
with_filter: false
2023-11-06 11:06:02 +00:00
})
2023-11-08 11:08:54 +00:00
const patternsList = ref<string[]>(patternType)
2023-11-02 01:56:14 +00:00
function splitDocument() {
loading.value = true
let fd = new FormData()
documentsFiles.value.forEach((item) => {
if (item?.raw) {
fd.append('file', item?.raw)
}
})
2023-11-08 11:08:54 +00:00
Object.keys(form).forEach((key) => {
fd.append(key, form[key])
})
2023-11-02 01:56:14 +00:00
DatasetApi.postSplitDocument(fd)
2023-11-06 11:06:02 +00:00
.then((res: any) => {
segmentList.value = res
2023-11-02 01:56:14 +00:00
loading.value = false
})
.catch(() => {
loading.value = false
})
}
onMounted(() => {})
</script>
<style scoped lang="scss">
.set-rules {
2023-11-06 11:06:02 +00:00
width: 100%;
2023-11-08 11:08:54 +00:00
.set-rules-height {
height: var(--create-dataset-height);
}
.left-height {
max-height: calc(var(--create-dataset-height) - 105px);
overflow-x: hidden;
}
2023-11-02 01:56:14 +00:00
&__radio {
display: block;
2023-11-06 11:06:02 +00:00
.el-radio {
white-space: break-spaces;
width: 100%;
height: 100%;
2023-11-08 11:08:54 +00:00
padding: calc(var(--app-base-px) * 2);
2023-11-06 11:06:02 +00:00
line-height: 22px;
color: var(--app-text-color-primary);
}
:deep(.el-radio__label) {
padding-left: 32px;
2023-11-08 11:08:54 +00:00
width: 100%;
2023-11-06 11:06:02 +00:00
}
:deep(.el-radio__input) {
position: absolute;
top: 30px;
}
}
2023-11-08 11:08:54 +00:00
&__form {
.el-select {
width: 100%;
}
.title {
font-size: 14px;
font-weight: 400;
}
2023-11-02 01:56:14 +00:00
}
}
</style>