各位大牛,请教个问题。有个翻译 api 每次最多 1000 个字,现在有一段文本大约 5000 字,每行在 100 字左右,我想尽可能多的把这 5000 个字用行分割,但尽可能生成少的数组,从而尽可能少的循环请求翻译接口,请问如何实现呢?
想了一天没想到什么好方法,如何用 JS 实现呢?
a = `这是第一行
这是第二行
这是第三行
这是第 n 行
`
最终需要生成数组 b
b =['尽可能多但不超过 1000 个字,不能在每行中断开','同前一项']
1
Chad0000 2022-02-11 06:02:45 +08:00
如果你 JS 是负责前端,那么这种事情应该在后端处理,同时也方便后端随时切换到其他翻译 API 。
|
3
nifury 2022-02-11 06:12:34 +08:00
先按行分割,然后把相邻行合并直到没法再加新行(不然就>1000 字)
不是最优解,但近似吧……又不是算法题,好实现就行 |
4
Chad0000 2022-02-11 06:13:48 +08:00
@iPc666 #2 我跟 NodeJS 打交道的也就 Angular 了。后端我用 C#,你这个方案应该不麻烦吧,直接按行分成数组,再将数组分组调用,分组的方式为加起来不超过 1000 字。直接一个循环累加字符长度,直到超过 1000 就把之前的打包成一组进行翻译,然后从这里重新累计字符长度。
如果你还要计算最优解,尽量再减少数组,可能就需要考虑分析每组翻译“浪费”的字符数,甚至可以把数组打乱顺序以达到最少“浪费”,但这样过于折腾,能节省多少费用,以及是否会影响翻译,综合看来我觉得就没必要了。 |
5
iPc666 OP 以每行分割成数组后,怎么通过一次循环实现呢?
|
6
musi 2022-02-11 07:06:37 +08:00
a = `这是第一行
这是第二行 这是第三行 这是第 n 行 ` const arr = a.split('\n'); const texts = []; let str = '' while(arr.length) { const currentText = arr.shift() // 限制每段文本的长度不超过 10 if(str.length + currentText.length <= 10){ str += currentText }else{ texts.push(str); str = currentText } } texts.push(str); str = '' console.log(texts) => ['这是第一行这是第二行', '这是第三行', '这是第 n 行'] |
7
gzlock 2022-02-11 07:12:56 +08:00
不知道对题目理解的对不对
https://codepen.io/gzlock/pen/dyZWLZB |
11
iPc666 OP 用这段代码搞定了
··· function splitStrIntoArray(str, maxLength) { let i; let output = []; let lineSoFar = ""; let temp; let line = str.split('\n'); for (i = 0; i < line.length;) { temp = addLineOntoLineWrap(lineSoFar, line[i]); if (temp.length > maxLength) { if (lineSoFar.length === 0) { lineSoFar = temp; i++; } output.push(lineSoFar); lineSoFar = ""; } else { lineSoFar = temp; i++; } } if (lineSoFar.length > 0) { output.push(lineSoFar); } return output; } function addLineOntoLineWrap(lineWrap, line) { if (lineWrap.length !== 0) { lineWrap += "\n"; } return lineWrap + line; } b = splitStrIntoArray(a,1000) ··· |
12
madao1993 2022-02-11 07:33:30 +08:00
split 分割字符串,for 循环遍历数组元素,数组的 length 属性相加超过 1000 就 i--然后 continue
这不是最优解,但是很方便 |
13
iPc666 OP @gzlock 你的代码有问题,max 给 1000 , 控制台报错 https://codepen.io/youxiaohou/pen/KKymYbQ
|
15
iPc666 OP |
16
jorneyr 2022-02-11 08:24:24 +08:00
String.substring(x, 1000),从这个位置向前找最近的一个换行符作为分割位置。
x 为上一次的分割位置。 |
17
z4none 2022-02-11 10:11:47 +08:00
各行可以乱序提交? 这就是个装箱问题.
|
18
mekingname 2022-02-11 10:34:29 +08:00
问题来了,如果有一个词跨行了怎么办?它翻译的时候肯定会出问题吧。
|
19
RickyC 2022-02-11 13:50:18 +08:00
这是智力题吗?
一段文字,翻译完不就行了。 干嘛追求解题效率最高呢? |
20
iPc666 OP 跨行了就是人工智能的范畴了
|