這篇記錄一下 WordNet 的使用。

WordNet® is a large lexical database of English. Nouns, verbs, adjectives and adverbs are grouped into sets of cognitive synonyms (synsets), each expressing a distinct concept.

今天要來玩的是 NLTK 所提供的 WordNet。這時候又要請出 官方文件 了。

使用之前,當然要先 import,這個語料庫放在 nltk.corpus 裡:

1
from nltk.corpus import wordnet as wn

Words

當要查詢一個字的時候,直接使用 synsets() 這個函式就可以了,比如說我要查 ‘dog’ 這個字:

1
wn.synsets('dog')

同時這個函式也有一個參數可以讓你指定這個字的詞性,比如我要查 ‘dog’ 當動詞的時候和哪些字意思相近,可以這樣寫:

1
wn.synsets('dog', pos=wn.VERB)

結果會給你一堆 synset,意思就是這個字都分別屬於這些 synset 裡的字,就是這個字同時在這些 synset 裡:

以這個例子來說,’dog’ 當動詞的時候,和 ‘chase’ 屬於同一個 synset,代表他們意思相近,由此可知 ‘dog’ 在當動詞的時候有追的意思。(長知識欸XD

而 ‘dog’ 這個字在 Synset('dog.n.01') 也同時在 Synset('dog.n.03') 裡。那這兩個 synset 有什麼不同呢?為什麼有兩個 synset 都叫作 ‘dog’?其實是因為兩組 synset 的意思不一樣。怎麼知道不一樣,又是哪裡不一樣呢?繼續看下去吧。

想要知道某個 synset 到底是什麼意思,可以這樣寫:

1
wn.synset('dog.n.01').definition()

那就來看一下 Synset('dog.n.01')Synset('dog.n.03') 分別是什麼意思吧:

很明顯地,兩個是完全不同的意思。除此之外,還可以用 examples() 看例句呢:

那要怎麼看這個Synset裡到底有哪些字呢?用 lemmas()

1
2
wn.synset('dog.n.01').lemmas()
[str(lemma.name()) for lemma in wn.synset('dog.n.01').lemmas()]

lemmas() 可以看到完整的 ‘dog.n.01.domestic_dog’,而如果只要抓字詞,就要用 lemma.name() 來抓了,結果如下:

除了同義詞,WordNet 也可以讓你查反義詞,不過這只定義在 lemma 中:

1
2
good = wn.synset('good.a.01')
good.lemmas()[0].antonyms()

所以可以看到,直接用 synset 去 call 反義詞 antonyms() 是行不通的:

Synsets

講了這麼多,到底什麼事 Synset 呢?

Synset: a set of synonyms that share a common meaning.

Synset 就是 synonym set,簡單來說就是一組同義詞,也叫做同義詞組,這也是 WordNet 這個語意導向的強大字典的根基。

….to be continued