# 如何扩充词头（将各种单词变形加入索引）

**URL:** <https://forum.freemdict.com/t/topic/5026>\
**Category:** 技术交流与词典编修\
**Tags:** 词头, mdx, mdx改版, 改版, 求助\
**Created:** [2021 年2 月 20 日 13:39 UTC](https://forum.freemdict.com/t/topic/5026 "2021-02-20T13:39:12Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![xjw](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/x/e19adc/32.png) [@xjw](https://forum.freemdict.com/u/xjw)\
**Post date:** [2021 年2 月 20 日 13:39 UTC](https://forum.freemdict.com/t/topic/5026/1 "2021-02-20T13:39:12Z")

</div>

**查词遇到的困难：**  
在查询单词的过去式或者其他变形时无法重定向到单词原型，例如查找wanted时无法自动重定向到want。

**可能的解决方法：**  
经过学习和搜索，目前解决这类问题有以下两种常见的方法：

1. 使用goldendict和mdict软件，里面自带的词典可以实现此功能
2. 在制作词典的过程中，把单词变形作为一个单独的词条加入mdx源文件中。以want和wanted为例，词头为单词变形wanted，词条为@@@LINK=want。

方法一的普适性不够强，大家常用的另外一款软件欧路词典是不能自动跳转的，而是出现一个提示——“是否要查询want”（还是以查询wanted举例）。本人在电脑端使用goldendict而手机端则是欧路词典（ios系统上最好用的应该就是欧路词典了），所以这种方法对我来说不够理想。而第二种方法则需要一定的编程基础，我自己目前已经大致学习了mdx词典制作的基础知识，在查找扩充词头的教程无果后特来此求助。

PS：学习此技术主要是想扩充牛津搭配词典的词头

---

<div class="post-metadata">

**Author:** ![jns](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/jns/32/55368_2.png) [@jns](https://forum.freemdict.com/u/jns)\
**Post date:** [2021 年2 月 21 日 01:37 UTC](https://forum.freemdict.com/t/topic/5026/2 "2021-02-21T01:37:49Z")

</div>

我说一下我的思路，如果词条内已经存在变体是最方便的，直接设置LINK指向就行。如果没有，需要有一个对照表或者转换规则，这种推测单词原形的叫lemmatize。个人测试WordNetLemmatizer的转换结果比较好。  
下面是我写的一个简单的示例。  
**安装nltk**  
pip install nltk  
**运行test.py**  
python test.py  
**显示：**  
apples  
单词： apples 原形推测： apple 词性： n.  
buses  
单词： buses 原形推测： bus 词性： n.  
单词： buses 原形推测： bus 词性： v.  
quizzes  
单词： quizzes 原形推测： quiz 词性： n.  
单词： quizzes 原形推测： quiz 词性： v.  
candies  
单词： candies 原形推测： candy 词性： n.  
单词： candies 原形推测： candy 词性： v.  
abaci  
单词： abaci 原形推测： abacus 词性： n.  
gone  
单词： gone 原形推测： go 词性： v.  
better  
单词： better 原形推测： good 词性： adj.  
单词： better 原形推测： well 词性： adv.  
wanted  
单词： wanted 原形推测： want 词性： v.  
would  
doing  
单词： doing 原形推测： do 词性： v.  
具体的使用就是调用lemmatize\_word.py中的lemmatize\_word函数，获得推测的原形，然后自己再进行其他处理。  
[lemmatize\_word.zip](https://forum.freemdict.com/uploads/short-url/hkLZwUHpv2LhQn6lAzcT0Z9fKi4.zip) (10.3 MB)

---

<div class="post-metadata">

**Author:** ![xjw](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/x/e19adc/32.png) [@xjw](https://forum.freemdict.com/u/xjw)\
**Post date:** [2021 年2 月 21 日 02:56 UTC](https://forum.freemdict.com/t/topic/5026/3 "2021-02-21T02:56:27Z")

</div>

非常感谢jns大佬！！！牛津搭配词典词条内没有变体，对照表或者转换规则我也没有积累。不知道大佬有对照表的推荐吗？

---

<div class="post-metadata">

**Author:** ![jns](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/jns/32/55368_2.png) [@jns](https://forum.freemdict.com/u/jns)\
**Post date:** [2021 年2 月 21 日 03:04 UTC](https://forum.freemdict.com/t/topic/5026/4 "2021-02-21T03:04:21Z")

</div>

不是大佬，也是自学自用，我了解的方法就是用WordNetLemmatizer，代码都在上面，有没有其他更好的方法我也不太清楚。

---

<div class="post-metadata">

**Author:** ![xjw](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/x/e19adc/32.png) [@xjw](https://forum.freemdict.com/u/xjw)\
**Post date:** [2021 年2 月 21 日 03:05 UTC](https://forum.freemdict.com/t/topic/5026/5 "2021-02-21T03:05:40Z")

</div>

谢谢，我去研究一下代码

---

<div class="post-metadata">

**Author:** ![jns](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/jns/32/55368_2.png) [@jns](https://forum.freemdict.com/u/jns)\
**Post date:** [2021 年2 月 21 日 06:55 UTC](https://forum.freemdict.com/t/topic/5026/6 "2021-02-21T06:55:56Z")

</div>

我好像理解错了，你大概是要在不知道变体的情况下获得变体，而不是反过来。  
[data.txt](https://forum.freemdict.com/uploads/short-url/ymBXa3ONYvxkpTjVI91jHGtDAcu.txt) (379.6 KB)  
从pattern.en的en-verbs.txt提取了这个数据，第一列是基本型，然后是一个制表符\t，后面是变体，用逗号,分开。  
一共8400个词

---

<div class="post-metadata">

**Author:** ![xjw](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/x/e19adc/32.png) [@xjw](https://forum.freemdict.com/u/xjw)\
**Post date:** [2021 年2 月 21 日 07:38 UTC](https://forum.freemdict.com/t/topic/5026/7 "2021-02-21T07:38:01Z")

</div>

再次感谢！！！

---

<div class="post-metadata">

**Author:** ![xjw](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/x/e19adc/32.png) [@xjw](https://forum.freemdict.com/u/xjw)\
**Post date:** [2021 年2 月 22 日 14:14 UTC](https://forum.freemdict.com/t/topic/5026/8 "2021-02-22T14:14:41Z")

</div>

不知道有没有形容词和名词的变形对照表。我下了pattern.en这个包，发现里面有 Comparative() 等函数可以查找形容词的比较级，还有其它的函数可以找形容词和名词的变形。但是我暂时没有发现类似于en-verbs.txt类似的对照表，抱歉再次麻烦您。好像可以直接通过编程实现而不用对照表，或者提取别的词典中的变形生成一份变形对照表。请问一下这两种方法比较常见的是哪一种啊，感觉编程实现方便快捷，但是我看很多人都是从某个词典中提取变形对照表再去扩充词头。(PS:刚刚尝试了一下直接编程实现问题有点多，主要是pattern内置的函数效果不好，例如查找单词复数的函数plurilaze()，输入介词with也会出现结果withs。而且pattern中查找单词词性的函数貌似只有引用wordnet库的pos函数，试了一下没法很好的找出单词的词性，所以也就没法先确定单词词性再调用对应的函数。)

---

<div class="post-metadata">

**Author:** ![jns](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/jns/32/55368_2.png) [@jns](https://forum.freemdict.com/u/jns)\
**Post date:** [2021 年2 月 22 日 23:21 UTC](https://forum.freemdict.com/t/topic/5026/9 "2021-02-22T23:21:08Z")

</div>

我百度了一下，有个pos\_tag判断词性的，你试试效果怎么样。  
nltk.pos\_tag([‘with’,‘apple’,‘good’,‘do’,‘best’])  
[(‘with’, ‘IN’), (‘apple’, ‘NN’), (‘good’, ‘JJ’), (‘do’, ‘VBP’), (‘best’, ‘JJS’)]  
IN介词连词，N开头名词，J开头形容词，VB开头副词，JJS形容词最高级

---

<div class="post-metadata">

**Author:** ![xjw](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/x/e19adc/32.png) [@xjw](https://forum.freemdict.com/u/xjw)\
**Post date:** [2021 年2 月 23 日 02:53 UTC](https://forum.freemdict.com/t/topic/5026/10 "2021-02-23T02:53:14Z")

</div>

谢谢，还是有点不理想，一个单词可能有多重词性。我从简明英汉词典里提取了一份变形对照表，提取完才发现它只有动词和形容词的变形，我再去找本词典提取下名词。[adj\_and\_verb.txt](https://forum.freemdict.com/uploads/short-url/7R7p8JrgX8J1yHnTlju3LEQqRx4.txt) (496.3 KB)
