如何从 CC-EDICT 词典中提取中文单词的定义?

如何从 CC-EDICT 词典中提取中文单词的定义?

我想在 LaTeX 中创建一个命令,如下所示:

\chinese{炒面}

并让它创建一个脚注,其中包含编辑字典。

炒麵 炒面 [chao3 mian4] /stir-fried noodles/"chow mein"/

CC-EDICT 词典...

字典是可下载的文本文件,有约 118,000 行,例如

...
炒雞蛋 炒鸡蛋 [chao3 ji1 dan4] /scrambled eggs/
炒飯 炒饭 [chao3 fan4] /fried rice/(slang) (Tw) to have sex/
炒魷魚 炒鱿鱼 [chao3 you2 yu2] /(coll.) to fire sb/to sack sb/
炒麵 炒面 [chao3 mian4] /stir-fried noodles/"chow mein"/
...

第一个字是繁体中文,第二个字是简体中文。括号里是读音。斜线中间是释义。

我试过了\usepackage{datatool},它可以处理前 1000 行左右,但无法处理大约 118,000 行。它似乎试图将整个文件加载到内存中。

grep我可以使用来grep " 炒面 " cedict_ts.u8获取适合简体中文的行,但我不知道如何在 LaTeX 中做到这一点。

多重定义...

有时会有多个定义:

得 得 [de2] /to obtain/to get/to gain/to catch (a disease)/proper/suitable/proud/contented/to allow/to permit/ready/finished/
得 得 [de5] /structural particle: used after a verb (or adjective as main verb), linking it to following phrase indicating effect, degree, possibility etc/
得 得 [dei3] /to have to/must/ought to/to need to/

理想情况下,这些都应该被包括在内,并以某种方式分开。

问题:如何从 CC-EDICT 词典中提取中文单词的定义?

答案1

我为 LuaLaTeX 创建了一个简单的包ccedict.sty::

\ProvidesPackage{ccedict}
\RequirePackage{luacode}
\RequirePackage{luatexja-fontspec}
\setmainjfont{FandolSong}

\begin{luacode*}
local dict = {}

function load_ccedict(filename)
  for line in io.lines(filename) do
  local traditional, simplified, spelling, description = line:match("^(.+)%s+(.+)%s+%[(.-)%]%s*(.+)")
    if traditional then
      -- insert new record for the current header
      local rec = dict[simplified] or {}
      table.insert(rec, {spelling = spelling, description = description, simplified = simplified, traditional = traditional})
      dict[simplified] = rec
    end
  end
end

function ccedict_get_term(term)
  local rec = dict[term] or {{spelling="cannot find term", description = "", simplified = term, traditional=""}}
  local new = {}
  local traditional, simplified 
  for _, v in ipairs(rec) do
  -- this will be printed in the footnote
  new[#new+1] = " [" .. v.spelling  .. "] " .. v.description 
  -- save the simplified and traditional terms
  traditional, simplified = v.traditional, v.simplified
  end
  -- you may want to add some separator betweend traditional and simplified terms
  -- the multiple terms will be separated using semicolon
  return traditional .. ": " .. simplified .. " " ..table.concat(new, "; ")
end

\end{luacode*}

\newcommand\loadccedict[1]{\directlua{load_ccedict("\detokenize{#1}")}}

\loadccedict{cedict_ts.u8}

\newcommand\chinese[1]{#1\footnote{\directlua{tex.sprint(ccedict_get_term("\detokenize{#1}"))}}}


\endinput

有两个 Lua 函数 -load_ccedict加载字典并制作查询表,并ccedict_get_term返回术语信息。该命令\chinese使用此信息打印脚注。

它使用luatexja-fontspec带有FandolSong字体的软件包来获得对中文的开箱即用支持。您可能想使用其他字体,因为我发现它不支持所有繁体中文字符。

以下是一个示例文档:

\documentclass{article}
\usepackage{ccedict}
\begin{document}

Hello \chinese{炒面}, \chinese{得}
\end{document}

结果是:

在此处输入图片描述

(您可以在第一个脚注中看到缺失的字符。我对中文字体一无所知,所以我无法判断哪一个对繁体中文的支持更好)

相关内容