Skip to content

Commit

Permalink
feat: 新的转换算法
Browse files Browse the repository at this point in the history
  • Loading branch information
pengzhanbo committed Mar 23, 2024
1 parent f99a03b commit 90efcfe
Show file tree
Hide file tree
Showing 9 changed files with 131 additions and 33 deletions.
9 changes: 9 additions & 0 deletions src/cache.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export type Words = Map<string, string>

export const st: Words = new Map()
export const ts: Words = new Map()

export type PhrasesMap = Map<string, [string[], string[]]>

export const simplifiedPhrasesMap: PhrasesMap = new Map()
export const traditionalPhrasesMap: PhrasesMap = new Map()
39 changes: 39 additions & 0 deletions src/convert.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { simplifiedPhrasesMap, st, traditionalPhrasesMap, ts } from './cache'
import { converter } from './converter'
import { transformWords } from './words'

transformWords()

/**
* 简体转换为繁体
* @param text - 简体文本
* @param enhance - 使用启用 短语库增强,提高准确性
* @returns 繁体文本
*/
export function toTraditional(text: string, enhance = false): string {
return converter(text, st, enhance ? simplifiedPhrasesMap : undefined)
}

/**
* 繁体转换为简体
* @param text - 繁体文本
* @param enhance - 使用启用 短语库增强,提高准确性
* @returns 简体文本
*/
export function toSimplified(text: string, enhance = false): string {
return converter(text, ts, enhance ? traditionalPhrasesMap : undefined)
}

/**
* @deprecated use {@link toTraditional}
*/
export function simpleToTradition(text: string): string {
return toTraditional(text)
}

/**
* @deprecated use {@link toSimplified}
*/
export function traditionToSimple(text: string): string {
return toSimplified(text)
}
60 changes: 28 additions & 32 deletions src/converter.ts
Original file line number Diff line number Diff line change
@@ -1,34 +1,30 @@
import { chineseLib } from './chineseLib.js'

const converter = (text: string, table: Record<string, string>) =>
text.replace(/./g, (char) => table[char] || char)

let s2t: Record<string, string> | null = null
let t2s: Record<string, string> | null = null

export function simpleToTradition(text: string) {
if (!s2t) {
s2t = {}

chineseLib.split(' ').forEach((char) => {
s2t![char[0]] = char[1]
})
}

return converter(text, s2t)
}

export function traditionToSimple(text: string) {
if (!t2s) {
t2s = {}

chineseLib.split(' ').forEach((char) => {
char.split('').forEach((_, i) => {
if (i === 0) return
t2s![char[i]] = char[0]
})
})
import type { PhrasesMap, Words } from './cache'

export function converter(source: string, words: Words, phrases?: PhrasesMap): string {
const len = source.length
let target = ''
let i = 0
let has = false
while (i < len) {
const char = source[i]
if (phrases && phrases.has(char)) {
const [sources, targets] = phrases.get(char)!
const slice = source.slice(i)
for (const [j, s] of sources.entries()) {
if (slice.startsWith(s)) {
target += targets[j]
i += s.length
has = true
break
}
}
}

if (!has) {
target += words.get(char) || char
i += 1
}
else { has = false }
}

return converter(text, t2s)
return target
}
1 change: 1 addition & 0 deletions src/data/simplified-phrases.ts

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/data/traditional-phrases.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default ["酒逢知己千鍾少話不投機半句多 大目乾連冥間救母變文 衹見樹木不見森林 書中自有千鍾粟 酒逢知己千鍾少 旋轉乾坤之力 藉寇兵齎盜糧 乾坤大挪移 宫商角徵羽 一目瞭然 乾乾淨淨 乾乾脆脆 乾坤一擲 乾坤再造 乾隆年間 乾隆皇帝 以免藉口 以功覆過 侔德覆載 傷亡枕藉 出醜狼藉 反反覆覆 反覆思維 反覆思量 名覆金甌 壺裏乾坤 幺麼小丑 幺麼小醜 徵羽摩柯 情有獨鍾 扭轉乾坤 拉鍊工程 文錦覆阱 於呼哀哉 旋乾轉坤 旋轉乾坤 朝乾夕惕 沈沒成本 浪蕩乾坤 狐藉虎威 珍珠項鍊 瞭如指掌 瞭然於心 瞭若指掌 簡單明瞭 老態龍鍾 肘手鍊足 藉故推辭 藉此機會 藉端生事 藉箸代籌 藉草枕塊 藉藉无名 衹見樹木 袖裏乾坤 覆蕉尋鹿 覆鹿尋蕉 覆鹿遺蕉 變徵之聲 變徵之音 買臣覆水 踅門瞭戶 鑽石項鍊 雁杳魚沈 雖覆能復 顛乾倒坤 顛倒乾坤 不瞭解 乾清宮 乾盛世 二噁英 八濛山 千鍾粟 反覆性 尼乾陀 張法乾 憑藉着 找藉口 據瞭解 於世成 於仲完 於其一 於勇明 於崇文 於忠祥 於惟一 於梨華 於清言 於竹屋 於陵子 李乾德 李澤鉅 李鍊福 李鍾郁 樊於期 瞭解到 藉助於 藉寇兵 覆盆子 覆醬瓿 角徵羽 貂覆額 郭子乾 錢鍾書 鍾萬梅 鍾重發 麼些族 黄鍾公 上鍊 么麼 么麽 乾元 乾卦 乾嘉 乾圖 乾坤 乾宅 乾斷 乾旦 乾曜 乾紅 乾綱 乾縣 乾象 乾造 乾道 乾陵 乾隆 傢俱 凌藉 函覆 反覆 哪吒 回覆 射覆 幺麼 康乾 彷彿 彷徨 徵弦 徵絃 徵聲 徵調 徵音 憑藉 手鍊 拉鍊 拜覆 於乎 於倫 於則 於單 於坦 於戲 於敖 於潛 於琳 於穆 於菟 於邑 明瞭 明覆 有序 木吒 沈沒 沈積 沈船 沈默 流徵 滑藉 無序 牴牾 牴觸 甚鉅 申覆 畢昇 發覆 瞭如 瞭望 瞭然 瞭解 示覆 神祇 稟覆 竺乾 答覆 篤麼 籌畫 素藉 茵藉 萬鍾 蒜薹 蕓薹 蕩覆 蕭乾 藉代 藉以 藉助 藉卉 藉口 藉喻 藉手 藉據 藉故 藉方 藉條 藉槁 藉機 藉此 藉甚 藉由 藉着 藉端 藉藉 藉詞 藉讀 藉資 衹得 覆上 覆住 覆信 覆冒 覆呈 覆命 覆墓 覆宗 覆帳 覆幬 覆成 覆按 覆文 覆杯 覆校 覆瓿 覆盂 覆盆 覆盤 覆育 覆逆 覆醢 覆電 覆露 覆鼎 見覆 角徵 計畫 變徵 躪藉 醞藉 重覆 金吒 金鍊 鈞覆 鉅子 鉅萬 鉅防 鉸鍊 銀鍊 鍊墜 鍊子 鍊形 鍊條 鍊錘 鍊鎖 鍛鍾 鍾繇 鍾鍛 鍾馗 鎖鍊 鐵鍊 電覆 露覆 項鍊 頗覆 頸鍊 顧藉 龍鍾","酒逢知己千锺少话不投机半句多 大目乾连冥间救母变文 只见树木不见森林 书中自有千锺粟 酒逢知己千锺少 旋转乾坤之力 借寇兵赍盗粮 _ _ 一目了然 干干净净 干干脆脆 乾坤一掷 _ 乾隆年间 _ 以免借口 以功复过 侔德复载 伤亡枕藉 出丑狼藉 反反复复 反复思维 反复思量 名复金瓯 壶里乾坤 幺麽小丑 幺麽小丑 _ 情有独钟 扭转乾坤 拉链工程 文锦复阱 _ 旋乾转坤 旋转乾坤 _ 沉没成本 浪荡乾坤 狐借虎威 珍珠项链 了如指掌 了然于心 了若指掌 简单明了 老态龙钟 肘手链足 借故推辞 借此机会 借端生事 借箸代筹 借草枕块 _ 只见树木 袖里乾坤 复蕉寻鹿 复鹿寻蕉 复鹿遗蕉 变徵之声 变徵之音 买臣复水 踅门了户 钻石项链 雁杳鱼沉 虽覆能复 颠乾倒坤 颠倒乾坤 不了解 乾清宫 _ 二𫫇英 _ 千锺粟 反复性 _ 张法乾 凭借着 找借口 据了解 _ _ _ _ _ _ _ 於梨华 _ _ _ _ 李泽钜 李链福 李锺郁 _ 了解到 借助于 借寇兵 _ 复酱瓿 _ 貂复额 _ 钱锺书 锺万梅 锺重发 麽些族 黄锺公 上链 幺麽 幺麽 _ _ _ 乾图 _ _ 乾断 _ _ 乾红 乾纲 乾县 _ _ _ _ _ 家具 凌借 函复 反复 _ 回复 射复 幺麽 _ 仿佛 _ _ 徵弦 徵声 徵调 _ 凭借 手链 拉链 拜复 _ 於伦 於则 於单 _ 於戏 _ 於潜 _ _ _ _ 明了 明复 _ _ 沉没 沉积 沉船 沉默 _ 滑借 无序 抵牾 抵触 甚钜 申复 毕昇 发复 了如 _ 了然 了解 示复 _ 禀复 _ 答复 笃麽 筹划 素借 茵借 万锺 _ 芸薹 荡复 萧乾 借代 借以 借助 借卉 借口 借喻 借手 借据 借故 借方 借条 借槁 借机 借此 借甚 借由 借着 借端 _ 借词 借读 借资 只得 复上 复住 复信 复冒 复呈 复命 复墓 复宗 复帐 复帱 复成 复按 复文 复杯 复校 复瓿 复盂 _ 覆盘 复育 复逆 复醢 复电 复露 复鼎 见复 _ 计划 变徵 躏借 酝借 重复 _ 金链 钧复 钜子 钜万 钜防 铰链 银链 链坠 链子 链形 链条 链锤 链锁 锻锺 钟繇 锺锻 锺馗 锁链 铁链 电复 露复 项链 颇复 颈链 顾借 龙钟"] as readonly [string, string]
1 change: 1 addition & 0 deletions src/data/words.ts

Large diffs are not rendered by default.

27 changes: 27 additions & 0 deletions src/enhance.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import simplifiedPhrases from './data/simplified-phrases'
import traditionalPhrases from './data/traditional-phrases'
import { type PhrasesMap, simplifiedPhrasesMap, traditionalPhrasesMap } from './cache'

/**
* 注入 短语库,增强 繁简体 转换 的准确性
*/
export function setupEnhance() {
transformPhrases(simplifiedPhrases, simplifiedPhrasesMap)
transformPhrases(traditionalPhrases, traditionalPhrasesMap)
}

function transformPhrases(data: readonly [string, string], map: PhrasesMap) {
const sources = data[0].split(' ')
const targets = data[1].split(' ')

for (const [index, source] of sources.entries()) {
const key = source[0]
const target = targets[index]

let value = map.get(key)
!value && map.set(key, (value = [[], []]))

value[0].push(source)
value[1].push(target === '_' ? source : target)
}
}
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export * from './converter.js'
export * from './convert'
24 changes: 24 additions & 0 deletions src/words.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import words from './data/words'
import { st, ts } from './cache'

export function transformWords() {
const len = words.length
let i = 1
let w = words[0]

while (i < len) {
const char = words[i]
i++
if (!w) {
w = char
continue
}
if (char === ' ') {
w = ''
continue
}

!st.has(w) && st.set(w, char)
ts.set(char, w)
}
}

0 comments on commit 90efcfe

Please sign in to comment.