파파고 번역 시 내용을 합쳐서 한번에 처리하지 않고 개별로 API를 호출해서 번역 처리
This commit is contained in:
@@ -20,7 +20,7 @@ class PapagoTranslationService(
|
||||
private val papagoTranslateUrl = "https://papago.apigw.ntruss.com/nmt/v1/translation"
|
||||
|
||||
fun translate(request: TranslateRequest): TranslateResult {
|
||||
if (request.texts.isEmpty()) {
|
||||
if (request.texts.isEmpty() || request.sourceLanguage == request.targetLanguage) {
|
||||
return TranslateResult(emptyList())
|
||||
}
|
||||
|
||||
@@ -32,17 +32,14 @@ class PapagoTranslationService(
|
||||
set("X-NCP-APIGW-API-KEY", papagoClientSecret)
|
||||
}
|
||||
|
||||
val chunks = chunkTexts(request.texts)
|
||||
val translatedTexts = mutableListOf<String>()
|
||||
|
||||
chunks.forEach { chunk ->
|
||||
val textsInChunkCount = chunk.split(DELIMITER).size
|
||||
|
||||
request.texts.forEach { text ->
|
||||
try {
|
||||
val body = mapOf(
|
||||
"source" to request.sourceLanguage,
|
||||
"target" to request.targetLanguage,
|
||||
"text" to chunk
|
||||
"text" to text
|
||||
)
|
||||
|
||||
val requestEntity = HttpEntity(body, headers)
|
||||
@@ -58,13 +55,8 @@ class PapagoTranslationService(
|
||||
}
|
||||
|
||||
val translated = response.body?.message?.result?.translatedText
|
||||
if (translated.isNullOrBlank()) {
|
||||
repeat(textsInChunkCount) { translatedTexts.add("") }
|
||||
} else {
|
||||
translated.split(DELIMITER).forEach { translatedTexts.add(it) }
|
||||
}
|
||||
translatedTexts.add(translated ?: "")
|
||||
} catch (_: Exception) {
|
||||
repeat(textsInChunkCount) { translatedTexts.add("") }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,26 +75,6 @@ class PapagoTranslationService(
|
||||
}
|
||||
}
|
||||
|
||||
private fun chunkTexts(texts: List<String>): List<String> {
|
||||
if (texts.isEmpty()) return emptyList()
|
||||
val chunks = mutableListOf<String>()
|
||||
var startIndex = 0
|
||||
while (startIndex < texts.size) {
|
||||
var endIndex = texts.size
|
||||
while (endIndex > startIndex) {
|
||||
val candidate = texts.subList(startIndex, endIndex)
|
||||
val joined = candidate.joinToString(DELIMITER)
|
||||
if (joined.length <= MAX_TEXT_LENGTH || endIndex - startIndex == 1) {
|
||||
chunks.add(joined)
|
||||
startIndex = endIndex
|
||||
break
|
||||
}
|
||||
endIndex--
|
||||
}
|
||||
}
|
||||
return chunks
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val SUPPORTED_LANGUAGE_CODES = setOf(
|
||||
"ko",
|
||||
@@ -120,8 +92,5 @@ class PapagoTranslationService(
|
||||
"pt",
|
||||
"it"
|
||||
)
|
||||
|
||||
private const val DELIMITER = "\u001F\u001E\u001D\u001C\u001F\u001E\u001D\u001C"
|
||||
private const val MAX_TEXT_LENGTH = 3000
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user