[[ノート/テキストマイニング]]
[[ノート/テキストマイニング]]~
&counter(); &lastmod();~
**WordNet 3.0を使ってみる [#i05aee4b]
***WordNet 3.0のインストール [#mb6ec3f5]
***余談: 日本語のWordNet [#m869813d]
NICTのプロジェクト
***Cから使う? [#gccc9466]
***Pythonから使う [#d381cdcb]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。oregano上のバージョンは古い(0.9.8)ので、最新(2.0-b6)に入換えた。
≫ [[ノート/テキストマイニング/NLTK]]
-http://www.nltk.org/downloadを見ながら、http://nltk.googlecode.com/files/nltk-2.0b6.zipよりnltk-2.0b6.zipをダウンロード、zipコマンドにて展開。その後、展開先で、"sudo python setup.py install" によりインストール。
-同ページによるとデータもダウンロードの必要あり。http://www.nltk.org/dataによると Interactive Installer でインストールできる。Pythonを起動して、
>>> import nltk
>>> nltk.download()
コマンドプロンプトが出るので、"all" を選んで全データをインストール。
実際に使っている様子は、[[HowToの中にあるサンプル:http://nltk.googlecode.com/svn/trunk/doc/howto/wordnet.html]]を見るとよい。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')
***Pythonから使う(別のインターフェース、nltkの方が本流だと思うので勧められない) [#pdbc85e0]
Pythonから使うためのプログラムが、http://sourceforge.jp/projects/sfnet_pywn/ からダウンロード可能。これは、WordNetのデータのみを使う(Cのライブラリは使わず、直接データベースをアクセスする)。
oreganoでは、/usr/local/pywn に置いた。
環境変数 WNHOMEとWNDICT を自分の実行環境で設定。また、pythonの実行検索パス PYTHONPATH を自分の実行環境で設定~
bashであれば<自分のHOME>/.bash_profile の中に、
WNHOME=/usr/local/WordNet-3.0
WNDICT=/usr/local/WordNet-3.0/dict
export WNHOME
export WNDICT
PYTHONPATH=/usr/local/pywn:$PYTHONPATH
export PYTHONPATH
これで使える。たとえば、pythonをインタラクティブモードで起動して使ってみる。
[yamanouc@oregano pywn]$ python
Python 2.5.2 (r252:60911, Sep 30 2008, 15:41:38)
[GCC 4.3.2 20080917 (Red Hat 4.3.2-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from stdwn import impl
>>> synsets = impl.lookupSynsetsByForm("aspirin")
>>> synsets[0].gloss
' the acetylated derivative of salicylic acid'
>>> for fn in synsets[0].synonyms:
... print fn.form,
...
aspirin acetylsalicylic_acid Bayer Empirin St._Joseph
>>> quit()
のようにできる。
ファイル /usr/local/pywn/pywn.py に、impl内のAPIが定義されている。
-lookupWordSenseByKey(key) WordSenseをkeyで検索<br>
keyは検索する文字列<br>
結果はsynonyms
-lookupSynsetByKey(key) Synsetをkeyで検索<br>
if key in self.ssHash:
return self.ssHash[key]
ss = self.grabSynset(key)
if ss == None:
return None
ss.impl = self
self.ssHash[key] = ss
return ss
def lookupSynsetsByFormAndPOS(self, word, pos):
f = lambda x, p=pos: x.pos==p or not p
return filter(f, self.lookupSynsetsByForm(word))
def lookupSynsetsByForm(self, word):
words = self.grabBaseForms(word)
words.append(word)
keys = []
for word in words:
keys += self.grabKeys(word)
syns = []
for key in keys:
syns.append(self.lookupSynsetByKey(key))
return syns
def toCanonicalForm(self, word):
try:
word = word[:word.index('(')]
except ValueError:
pass
return word.replace(' ', '_')
[[ノート/テキストマイニング]]~
&counter(); &lastmod();~
**WordNet 3.0を使ってみる [#i05aee4b]
***WordNet 3.0のインストール [#mb6ec3f5]
***余談: 日本語のWordNet [#m869813d]
NICTのプロジェクト
***Cから使う? [#gccc9466]
***Pythonから使う [#d381cdcb]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。oregano上のバージョンは古い(0.9.8)ので、最新(2.0-b6)に入換えた。
≫ [[ノート/テキストマイニング/NLTK]]
-http://www.nltk.org/downloadを見ながら、http://nltk.googlecode.com/files/nltk-2.0b6.zipよりnltk-2.0b6.zipをダウンロード、zipコマンドにて展開。その後、展開先で、"sudo python setup.py install" によりインストール。
-同ページによるとデータもダウンロードの必要あり。http://www.nltk.org/dataによると Interactive Installer でインストールできる。Pythonを起動して、
>>> import nltk
>>> nltk.download()
コマンドプロンプトが出るので、"all" を選んで全データをインストール。
実際に使っている様子は、[[HowToの中にあるサンプル:http://nltk.googlecode.com/svn/trunk/doc/howto/wordnet.html]]を見るとよい。
実際に使っている様子は、[[HowToの中にあるサンプル:http://www.nltk.org/howto/wordnet.html]]を見るとよい。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')
***Pythonから使う(別のインターフェース、nltkの方が本流だと思うので勧められない) [#pdbc85e0]
Pythonから使うためのプログラムが、http://sourceforge.jp/projects/sfnet_pywn/ からダウンロード可能。これは、WordNetのデータのみを使う(Cのライブラリは使わず、直接データベースをアクセスする)。
oreganoでは、/usr/local/pywn に置いた。
環境変数 WNHOMEとWNDICT を自分の実行環境で設定。また、pythonの実行検索パス PYTHONPATH を自分の実行環境で設定~
bashであれば<自分のHOME>/.bash_profile の中に、
WNHOME=/usr/local/WordNet-3.0
WNDICT=/usr/local/WordNet-3.0/dict
export WNHOME
export WNDICT
PYTHONPATH=/usr/local/pywn:$PYTHONPATH
export PYTHONPATH
これで使える。たとえば、pythonをインタラクティブモードで起動して使ってみる。
[yamanouc@oregano pywn]$ python
Python 2.5.2 (r252:60911, Sep 30 2008, 15:41:38)
[GCC 4.3.2 20080917 (Red Hat 4.3.2-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from stdwn import impl
>>> synsets = impl.lookupSynsetsByForm("aspirin")
>>> synsets[0].gloss
' the acetylated derivative of salicylic acid'
>>> for fn in synsets[0].synonyms:
... print fn.form,
...
aspirin acetylsalicylic_acid Bayer Empirin St._Joseph
>>> quit()
のようにできる。
ファイル /usr/local/pywn/pywn.py に、impl内のAPIが定義されている。
-lookupWordSenseByKey(key) WordSenseをkeyで検索<br>
keyは検索する文字列<br>
結果はsynonyms
-lookupSynsetByKey(key) Synsetをkeyで検索<br>
if key in self.ssHash:
return self.ssHash[key]
ss = self.grabSynset(key)
if ss == None:
return None
ss.impl = self
self.ssHash[key] = ss
return ss
def lookupSynsetsByFormAndPOS(self, word, pos):
f = lambda x, p=pos: x.pos==p or not p
return filter(f, self.lookupSynsetsByForm(word))
def lookupSynsetsByForm(self, word):
words = self.grabBaseForms(word)
words.append(word)
keys = []
for word in words:
keys += self.grabKeys(word)
syns = []
for key in keys:
syns.append(self.lookupSynsetByKey(key))
return syns
def toCanonicalForm(self, word):
try:
word = word[:word.index('(')]
except ValueError:
pass
return word.replace(' ', '_')
[[ノート/テキストマイニング]]~
&counter(); &lastmod();~
**WordNet 3.0を使ってみる [#i05aee4b]
**Python/NLTKからWordNet 3.0を使ってみる [#i05aee4b]
***WordNet 3.0のインストール [#mb6ec3f5]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。日本語対応のためには新しいバージョンが必要。
***余談: 日本語のWordNet [#m869813d]
NICTのプロジェクト
***Cから使う? [#gccc9466]
***Pythonから使う [#d381cdcb]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。oregano上のバージョンは古い(0.9.8)ので、最新(2.0-b6)に入換えた。
≫ [[ノート/テキストマイニング/NLTK]]
-http://www.nltk.org/downloadを見ながら、http://nltk.googlecode.com/files/nltk-2.0b6.zipよりnltk-2.0b6.zipをダウンロード、zipコマンドにて展開。その後、展開先で、"sudo python setup.py install" によりインストール。
-同ページによるとデータもダウンロードの必要あり。http://www.nltk.org/dataによると Interactive Installer でインストールできる。Pythonを起動して、
-インストールについて参照ページは [[Installing NLTK:http://www.nltk.org/install.html]]
-pip install -U nltk にて新しいバージョンをダウンロード
-同ページによるとデータもダウンロードの必要あり。[[Installing NLTK Data:http://www.nltk.org/data]]によると Interactive Installer でインストールできる。Pythonを起動して、
>>> import nltk
>>> nltk.download()
コマンドプロンプトが出るので、"all" を選んで全データをインストール。
実際に使っている様子は、[[HowToの中にあるサンプル:http://www.nltk.org/howto/wordnet.html]]を見るとよい。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')
***日本語の対応について [#y81c96c8]
いろいろとあったが、新しい目のバージョンのNLTKでは多言語サポートが入っている。
***Pythonから使う(別のインターフェース、nltkの方が本流だと思うので勧められない) [#pdbc85e0]
Pythonから使うためのプログラムが、http://sourceforge.jp/projects/sfnet_pywn/ からダウンロード可能。これは、WordNetのデータのみを使う(Cのライブラリは使わず、直接データベースをアクセスする)。
参照ページはBond先生らの [[Open Multilingual Wordnet:http://compling.hss.ntu.edu.sg/omw/]] で、日本語WordNetの研究の延長で多言語(からのリンク)にしたものらしい。
oreganoでは、/usr/local/pywn に置いた。
このページに記述されているようなデータやインターフェースは、NLTK(少なくとも3.2.4には)に入っているようだ。
環境変数 WNHOMEとWNDICT を自分の実行環境で設定。また、pythonの実行検索パス PYTHONPATH を自分の実行環境で設定~
bashであれば<自分のHOME>/.bash_profile の中に、
WNHOME=/usr/local/WordNet-3.0
WNDICT=/usr/local/WordNet-3.0/dict
export WNHOME
export WNDICT
PYTHONPATH=/usr/local/pywn:$PYTHONPATH
export PYTHONPATH
使い方は、
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('鯨', lang='jpn')
[Synset('whale.n.02')]
>>> wn.synset('spy.n.01').lemma_names('jpn')
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬', '秘密捜査員',
'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']
というところ。使い方の説明は NLTKのHOWTOsの [[wordnet HOWTO:http://www.nltk.org/howto/wordnet.html]] に例が出ている。曰く
これで使える。たとえば、pythonをインタラクティブモードで起動して使ってみる。
[yamanouc@oregano pywn]$ python
Python 2.5.2 (r252:60911, Sep 30 2008, 15:41:38)
[GCC 4.3.2 20080917 (Red Hat 4.3.2-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from stdwn import impl
>>> synsets = impl.lookupSynsetsByForm("aspirin")
>>> synsets[0].gloss
' the acetylated derivative of salicylic acid'
>>> for fn in synsets[0].synonyms:
... print fn.form,
...
aspirin acetylsalicylic_acid Bayer Empirin St._Joseph
>>> quit()
のようにできる。
The WordNet corpus reader gives access to the Open Multilingual WordNet, using ISO-639 language codes.
>>> sorted(wn.langs())
['als', 'arb', 'cat', 'cmn', 'dan', 'eng', 'eus', 'fas', 'fin', 'fra', 'fre', 'glg', 'heb', 'ind', 'ita', 'jpn', 'nno',
'nob', 'pol', 'por', 'spa', 'tha', 'zsm']
>>> wn.synsets(b'\xe7\x8a\xac'.decode('utf-8'), lang='jpn')
[Synset('dog.n.01'), Synset('spy.n.01')]
(以下略)
ファイル /usr/local/pywn/pywn.py に、impl内のAPIが定義されている。
-lookupWordSenseByKey(key) WordSenseをkeyで検索<br>
keyは検索する文字列<br>
結果はsynonyms
-lookupSynsetByKey(key) Synsetをkeyで検索<br>
if key in self.ssHash:
return self.ssHash[key]
ss = self.grabSynset(key)
if ss == None:
return None
ss.impl = self
self.ssHash[key] = ss
return ss
def lookupSynsetsByFormAndPOS(self, word, pos):
f = lambda x, p=pos: x.pos==p or not p
return filter(f, self.lookupSynsetsByForm(word))
def lookupSynsetsByForm(self, word):
words = self.grabBaseForms(word)
words.append(word)
keys = []
for word in words:
keys += self.grabKeys(word)
syns = []
for key in keys:
syns.append(self.lookupSynsetByKey(key))
return syns
def toCanonicalForm(self, word):
try:
word = word[:word.index('(')]
except ValueError:
pass
return word.replace(' ', '_')
裏は、[[corpus reader:http://www.nltk.org/api/nltk.corpus.reader.html]]の
class nltk.corpus.reader.wordnet.WordNetCorpusReader(root, omw_reader)
のところに、omw_reader (omw=open multilingual wordnet) が追加されていること。
(これが新し目のバージョンが必要な理由)
「歴史的には」もともとBond先生らを中心にした研究の成果として[[日本語WordNet:http://compling.hss.ntu.edu.sg/wnja/]] として公開されていたものがあり、
[[ダウンロードページ:http://compling.hss.ntu.edu.sg/wnja/jpn/downloads.html]]も整備されていた。
また、本「」の翻訳に当たってXX氏らが第12章 日本語 を追加した中で、これを取り上げているが、この時はWordNetの外側に自前のリーダーを作っていた。(Example II.1 (12_1_5_jpwordnet.py)) その後、NLTK側にインターフェースを追加したようで、現在の形になっているようだ。
[[ノート/テキストマイニング]]~
&counter(); &lastmod();~
**Python/NLTKからWordNet 3.0を使ってみる [#i05aee4b]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。日本語対応のためには新しいバージョンが必要。
≫ [[ノート/テキストマイニング/NLTK]]
-インストールについて参照ページは [[Installing NLTK:http://www.nltk.org/install.html]]
-pip install -U nltk にて新しいバージョンをダウンロード
-同ページによるとデータもダウンロードの必要あり。[[Installing NLTK Data:http://www.nltk.org/data]]によると Interactive Installer でインストールできる。Pythonを起動して、
>>> import nltk
>>> nltk.download()
コマンドプロンプトが出るので、"all" を選んで全データをインストール。
実際に使っている様子は、[[HowToの中にあるサンプル:http://www.nltk.org/howto/wordnet.html]]を見るとよい。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')
***日本語の対応について [#y81c96c8]
いろいろとあったが、新しい目のバージョンのNLTKでは多言語サポートが入っている。
参照ページはBond先生らの [[Open Multilingual Wordnet:http://compling.hss.ntu.edu.sg/omw/]] で、日本語WordNetの研究の延長で多言語(からのリンク)にしたものらしい。
このページに記述されているようなデータやインターフェースは、NLTK(少なくとも3.2.4には)に入っているようだ。
使い方は、
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('鯨', lang='jpn')
[Synset('whale.n.02')]
>>> wn.synset('spy.n.01').lemma_names('jpn')
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬', '秘密捜査員',
'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']
というところ。使い方の説明は NLTKのHOWTOsの [[wordnet HOWTO:http://www.nltk.org/howto/wordnet.html]] に例が出ている。曰く
The WordNet corpus reader gives access to the Open Multilingual WordNet, using ISO-639 language codes.
>>> sorted(wn.langs())
['als', 'arb', 'cat', 'cmn', 'dan', 'eng', 'eus', 'fas', 'fin', 'fra', 'fre', 'glg', 'heb', 'ind', 'ita', 'jpn', 'nno',
'nob', 'pol', 'por', 'spa', 'tha', 'zsm']
>>> wn.synsets(b'\xe7\x8a\xac'.decode('utf-8'), lang='jpn')
[Synset('dog.n.01'), Synset('spy.n.01')]
(以下略)
裏は、[[corpus reader:http://www.nltk.org/api/nltk.corpus.reader.html]]の
class nltk.corpus.reader.wordnet.WordNetCorpusReader(root, omw_reader)
のところに、omw_reader (omw=open multilingual wordnet) が追加されていること。
(これが新し目のバージョンが必要な理由)
「歴史的には」もともとBond先生らを中心にした研究の成果として[[日本語WordNet:http://compling.hss.ntu.edu.sg/wnja/]] として公開されていたものがあり、
[[ダウンロードページ:http://compling.hss.ntu.edu.sg/wnja/jpn/downloads.html]]も整備されていた。
また、本「」の翻訳に当たってXX氏らが第12章 日本語 を追加した中で、これを取り上げているが、この時はWordNetの外側に自前のリーダーを作っていた。(Example II.1 (12_1_5_jpwordnet.py)) その後、NLTK側にインターフェースを追加したようで、現在の形になっているようだ。
また、本 Steven Bird, Ewan Klein, Edward Loper: Natural Language Processing with Python の翻訳に当たって、訳者の萩原正人氏らが第12章「Python による日本語自然言語処理」を追加した(この章はWebでも公開されている。[[Python による日本語自然言語処理:http://www.nltk.org/book-jp/ch12.html]])中で、WordNetの日本語対応を取り上げているが、この時はWordNetの外側に自前のリーダーを作っていた(Example II.1 (12_1_5_jpwordnet.py))ため、それなりの手順が必要であった。 その後、NLTK側にインターフェースを追加したようで、現在の簡単な形になっているようだ。
[[ノート/テキストマイニング]]~
&counter(); &lastmod();~
**Python/NLTKからWordNet 3.0を使ってみる [#i05aee4b]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。日本語対応のためには新しいバージョンが必要。
≫ [[ノート/テキストマイニング/NLTK]]
-インストールについて参照ページは [[Installing NLTK:http://www.nltk.org/install.html]]
-pip install -U nltk にて新しいバージョンをダウンロード
-同ページによるとデータもダウンロードの必要あり。[[Installing NLTK Data:http://www.nltk.org/data]]によると Interactive Installer でインストールできる。Pythonを起動して、
>>> import nltk
>>> nltk.download()
コマンドプロンプトが出るので、"all" を選んで全データをインストール。
実際に使っている様子は、[[HowToの中にあるサンプル:http://www.nltk.org/howto/wordnet.html]]を見るとよい。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')
***日本語の対応について [#y81c96c8]
いろいろとあったが、新しい目のバージョンのNLTKでは多言語サポートが入っている。
参照ページはBond先生らの [[Open Multilingual Wordnet:http://compling.hss.ntu.edu.sg/omw/]] で、日本語WordNetの研究の延長で多言語(からのリンク)にしたものらしい。
このページに記述されているようなデータやインターフェースは、NLTK(少なくとも3.2.4には)に入っているようだ。
使い方は、
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('鯨', lang='jpn')
[Synset('whale.n.02')]
>>> wn.synset('spy.n.01').lemma_names('jpn')
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬', '秘密捜査員',
'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']
というところ。使い方の説明は NLTKのHOWTOsの [[wordnet HOWTO:http://www.nltk.org/howto/wordnet.html]] に例が出ている。曰く
The WordNet corpus reader gives access to the Open Multilingual WordNet, using ISO-639 language codes.
>>> sorted(wn.langs())
['als', 'arb', 'cat', 'cmn', 'dan', 'eng', 'eus', 'fas', 'fin', 'fra', 'fre', 'glg', 'heb', 'ind', 'ita', 'jpn', 'nno',
'nob', 'pol', 'por', 'spa', 'tha', 'zsm']
>>> wn.synsets(b'\xe7\x8a\xac'.decode('utf-8'), lang='jpn')
[Synset('dog.n.01'), Synset('spy.n.01')]
(以下略)
裏は、[[corpus reader:http://www.nltk.org/api/nltk.corpus.reader.html]]の
class nltk.corpus.reader.wordnet.WordNetCorpusReader(root, omw_reader)
のところに、omw_reader (omw=open multilingual wordnet) が追加されていること。
(これが新し目のバージョンが必要な理由)
「歴史的には」もともとBond先生らを中心にした研究の成果として[[日本語WordNet:http://compling.hss.ntu.edu.sg/wnja/]] として公開されていたものがあり、
[[ダウンロードページ:http://compling.hss.ntu.edu.sg/wnja/jpn/downloads.html]]も整備されていた。
また、本 Steven Bird, Ewan Klein, Edward Loper: Natural Language Processing with Python の翻訳に当たって、訳者の萩原正人氏らが第12章「Python による日本語自然言語処理」を追加した(この章はWebでも公開されている。[[Python による日本語自然言語処理:http://www.nltk.org/book-jp/ch12.html]])中で、WordNetの日本語対応を取り上げているが、この時はWordNetの外側に自前のリーダーを作っていた(Example II.1 (12_1_5_jpwordnet.py))ため、それなりの手順が必要であった。 その後、NLTK側にインターフェースを追加したようで、現在の簡単な形になっているようだ。
また、本 Steven Bird, Ewan Klein, Edward Loper: Natural Language Processing with Python の翻訳「入門 自然言語処理」(2010年)に当たって、訳者の萩原正人氏らが第12章「Python による日本語自然言語処理」を追加した(この章はWebでも公開されている。[[Python による日本語自然言語処理:http://www.nltk.org/book-jp/ch12.html]])が、その中で日本語WordNetの使い方を取り上げている。この時はWordNetの外側に自前のリーダーを作っていた(Example II.1 (12_1_5_jpwordnet.py))ため、それなりの手順が必要であった。 その後、NLTK側にインターフェースを追加したようで、現在の簡単な形になっているようだ。
[[ノート/テキストマイニング]]~
&counter(); &lastmod();~
**Python/NLTKからWordNet 3.0を使ってみる [#i05aee4b]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。日本語対応のためには新しいバージョンが必要。
≫ [[ノート/テキストマイニング/NLTK]]
-インストールについて参照ページは [[Installing NLTK:http://www.nltk.org/install.html]]
-pip install -U nltk にて新しいバージョンをダウンロード
-同ページによるとデータもダウンロードの必要あり。[[Installing NLTK Data:http://www.nltk.org/data]]によると Interactive Installer でインストールできる。Pythonを起動して、
>>> import nltk
>>> nltk.download()
コマンドプロンプトが出るので、"all" を選んで全データをインストール。
実際に使っている様子は、[[HowToの中にあるサンプル:http://www.nltk.org/howto/wordnet.html]]を見るとよい。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')
***日本語の対応について [#y81c96c8]
いろいろとあったが、新しい目のバージョンのNLTKでは多言語サポートが入っている。
参照ページはBond先生らの [[Open Multilingual Wordnet:http://compling.hss.ntu.edu.sg/omw/]] で、日本語WordNetの研究の延長で多言語(からのリンク)にしたものらしい。
このページに記述されているようなデータやインターフェースは、NLTK(少なくとも3.2.4には)に入っているようだ。
使い方は、
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('鯨', lang='jpn')
[Synset('whale.n.02')]
>>> wn.synset('spy.n.01').lemma_names('jpn')
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬', '秘密捜査員',
'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']
というところ。使い方の説明は NLTKのHOWTOsの [[wordnet HOWTO:http://www.nltk.org/howto/wordnet.html]] に例が出ている。曰く
The WordNet corpus reader gives access to the Open Multilingual WordNet, using ISO-639 language codes.
>>> sorted(wn.langs())
['als', 'arb', 'cat', 'cmn', 'dan', 'eng', 'eus', 'fas', 'fin', 'fra', 'fre', 'glg', 'heb', 'ind', 'ita', 'jpn', 'nno',
'nob', 'pol', 'por', 'spa', 'tha', 'zsm']
>>> wn.synsets(b'\xe7\x8a\xac'.decode('utf-8'), lang='jpn')
[Synset('dog.n.01'), Synset('spy.n.01')]
(以下略)
裏は、[[corpus reader:http://www.nltk.org/api/nltk.corpus.reader.html]]の
class nltk.corpus.reader.wordnet.WordNetCorpusReader(root, omw_reader)
のところに、omw_reader (omw=open multilingual wordnet) が追加されていること。
(これが新し目のバージョンが必要な理由)
「歴史的には」もともとBond先生らを中心にした研究の成果として[[日本語WordNet:http://compling.hss.ntu.edu.sg/wnja/]] として公開されていたものがあり、
[[ダウンロードページ:http://compling.hss.ntu.edu.sg/wnja/jpn/downloads.html]]も整備されていた。
また、本 Steven Bird, Ewan Klein, Edward Loper: Natural Language Processing with Python の翻訳「入門 自然言語処理」(2010年)に当たって、訳者の萩原正人氏らが第12章「Python による日本語自然言語処理」を追加した(この章はWebでも公開されている。[[Python による日本語自然言語処理:http://www.nltk.org/book-jp/ch12.html]])が、その中で日本語WordNetの使い方を取り上げている。この時はWordNetの外側に自前のリーダーを作っていた(Example II.1 (12_1_5_jpwordnet.py))ため、それなりの手順が必要であった。 その後、NLTK側にインターフェースを追加したようで、現在の簡単な形になっているようだ。
また、本 Steven Bird, Ewan Klein, Edward Loper: Natural Language Processing with Python の翻訳「入門 自然言語処理」(2010年)に当たって、訳者の萩原正人氏らが第12章「Python による日本語自然言語処理」を追加した(この章はWebでも公開されている。[[Python による日本語自然言語処理:http://www.nltk.org/book-jp/ch12.html]])が、その中で日本語WordNetの使い方を取り上げている。この時はNLTKのWordNetリーダーの外側に自前のリーダーを作っていた(Example II.1 (12_1_5_jpwordnet.py))ため、それなりの手順が必要であった。 (ちなみに、このコードは、NLTKのWordNetCorpusReaderの__init__に(このomw対応の改変のために)パラメタ(まさにomw_reader)が追加されたため、そのままでは動かないようだ。)
その後、NLTK側にインターフェースを追加したようで、現在の簡単な形になっているようだ。
[[ノート/テキストマイニング]]~
&counter(); &lastmod();~
**Python/NLTKからWordNet 3.0を使ってみる [#i05aee4b]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。日本語対応のためには新しいバージョンが必要。
≫ [[ノート/テキストマイニング/NLTK]]
-インストールについて参照ページは [[Installing NLTK:http://www.nltk.org/install.html]]
-pip install -U nltk にて新しいバージョンをダウンロード
-同ページによるとデータもダウンロードの必要あり。[[Installing NLTK Data:http://www.nltk.org/data]]によると Interactive Installer でインストールできる。Pythonを起動して、
>>> import nltk
>>> nltk.download()
コマンドプロンプトが出るので、"all" を選んで全データをインストール。
実際に使っている様子は、[[HowToの中にあるサンプル:http://www.nltk.org/howto/wordnet.html]]を見るとよい。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')
***日本語の対応について [#y81c96c8]
いろいろとあったが、新しい目のバージョンのNLTKでは多言語サポートが入っている。
参照ページはBond先生らの [[Open Multilingual Wordnet:http://compling.hss.ntu.edu.sg/omw/]] で、日本語WordNetの研究の延長で多言語(からのリンク)にしたものらしい。
このページに記述されているようなデータやインターフェースは、NLTK(少なくとも3.2.4には)に入っているようだ。
使い方は、
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('鯨', lang='jpn')
[Synset('whale.n.02')]
>>> wn.synset('spy.n.01').lemma_names('jpn')
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬', '秘密捜査員',
'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']
というところ。使い方の説明は NLTKのHOWTOsの [[wordnet HOWTO:http://www.nltk.org/howto/wordnet.html]] に例が出ている。曰く
というところ。
使い方の説明は NLTKのHOWTOsの [[wordnet HOWTO:http://www.nltk.org/howto/wordnet.html]] に例が出ている。曰く
The WordNet corpus reader gives access to the Open Multilingual WordNet, using ISO-639 language codes.
>>> sorted(wn.langs())
['als', 'arb', 'cat', 'cmn', 'dan', 'eng', 'eus', 'fas', 'fin', 'fra', 'fre', 'glg', 'heb', 'ind', 'ita', 'jpn', 'nno',
'nob', 'pol', 'por', 'spa', 'tha', 'zsm']
>>> wn.synsets(b'\xe7\x8a\xac'.decode('utf-8'), lang='jpn')
[Synset('dog.n.01'), Synset('spy.n.01')]
(以下略)
実際に使ってみた例
>>> wp.synsets('リンゴ', lang='jpn')
[Synset('apple.n.01'), Synset('apple.n.02')]
>>> wp.synset('リンゴ', lang='jpn') <-- synsetSではなくsynsetの場合はダメ
TypeError: synset() got an unexpected keyword argument 'lang'
>>> wp.synsets('りんご', lang='jpn')
[] <-- ひらがなの'りんご'では登録されていない
>>> wn.synsets('ミカン', lang='jpn')[0]
Synset('orange.n.01') <-- 'ミカン'は1つだけ
>>> wn.synsets('リンゴ', lang='jpn')[0].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.25 <-- 経路距離メソッド path_simlarityを使ってみる。どちらも[0]の単一要素にして問うた
>>> wn.synsets('リンゴ', lang='jpn')[1].path_similarity(wn.synsets('ミカン', lan
g='jpn')[0])
0.05263157894736842 <-- 'リンゴ'の2要素目を試してみた
裏は、[[corpus reader:http://www.nltk.org/api/nltk.corpus.reader.html]]の
class nltk.corpus.reader.wordnet.WordNetCorpusReader(root, omw_reader)
のところに、omw_reader (omw=open multilingual wordnet) が追加されていること。
(これが新し目のバージョンが必要な理由)
「歴史的には」もともとBond先生らを中心にした研究の成果として[[日本語WordNet:http://compling.hss.ntu.edu.sg/wnja/]] として公開されていたものがあり、
[[ダウンロードページ:http://compling.hss.ntu.edu.sg/wnja/jpn/downloads.html]]も整備されていた。
また、本 Steven Bird, Ewan Klein, Edward Loper: Natural Language Processing with Python の翻訳「入門 自然言語処理」(2010年)に当たって、訳者の萩原正人氏らが第12章「Python による日本語自然言語処理」を追加した(この章はWebでも公開されている。[[Python による日本語自然言語処理:http://www.nltk.org/book-jp/ch12.html]])が、その中で日本語WordNetの使い方を取り上げている。この時はNLTKのWordNetリーダーの外側に自前のリーダーを作っていた(Example II.1 (12_1_5_jpwordnet.py))ため、それなりの手順が必要であった。 (ちなみに、このコードは、NLTKのWordNetCorpusReaderの__init__に(このomw対応の改変のために)パラメタ(まさにomw_reader)が追加されたため、そのままでは動かないようだ。)
その後、NLTK側にインターフェースを追加したようで、現在の簡単な形になっているようだ。
[[ノート/テキストマイニング]]~
&counter(); &lastmod();~
**Python/NLTKからWordNet 3.0を使ってみる [#i05aee4b]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。日本語対応のためには新しいバージョンが必要。
≫ [[ノート/テキストマイニング/NLTK]]
-インストールについて参照ページは [[Installing NLTK:http://www.nltk.org/install.html]]
-pip install -U nltk にて新しいバージョンをダウンロード
-同ページによるとデータもダウンロードの必要あり。[[Installing NLTK Data:http://www.nltk.org/data]]によると Interactive Installer でインストールできる。Pythonを起動して、
>>> import nltk
>>> nltk.download()
コマンドプロンプトが出るので、"all" を選んで全データをインストール。
実際に使っている様子は、[[HowToの中にあるサンプル:http://www.nltk.org/howto/wordnet.html]]を見るとよい。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')
***日本語の対応について [#y81c96c8]
いろいろとあったが、新しい目のバージョンのNLTKでは多言語サポートが入っている。
参照ページはBond先生らの [[Open Multilingual Wordnet:http://compling.hss.ntu.edu.sg/omw/]] で、日本語WordNetの研究の延長で多言語(からのリンク)にしたものらしい。
このページに記述されているようなデータやインターフェースは、NLTK(少なくとも3.2.4には)に入っているようだ。
使い方は、
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('鯨', lang='jpn')
[Synset('whale.n.02')]
>>> wn.synset('spy.n.01').lemma_names('jpn')
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬', '秘密捜査員',
'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']
というところ。
使い方の説明は NLTKのHOWTOsの [[wordnet HOWTO:http://www.nltk.org/howto/wordnet.html]] に例が出ている。曰く
The WordNet corpus reader gives access to the Open Multilingual WordNet, using ISO-639 language codes.
>>> sorted(wn.langs())
['als', 'arb', 'cat', 'cmn', 'dan', 'eng', 'eus', 'fas', 'fin', 'fra', 'fre', 'glg', 'heb', 'ind', 'ita', 'jpn', 'nno',
'nob', 'pol', 'por', 'spa', 'tha', 'zsm']
>>> wn.synsets(b'\xe7\x8a\xac'.decode('utf-8'), lang='jpn')
[Synset('dog.n.01'), Synset('spy.n.01')]
(以下略)
実際に使ってみた例
>>> wp.synsets('リンゴ', lang='jpn')
[Synset('apple.n.01'), Synset('apple.n.02')]
>>> wp.synset('リンゴ', lang='jpn') <-- synsetSではなくsynsetの場合はダメ
TypeError: synset() got an unexpected keyword argument 'lang'
>>> wp.synsets('りんご', lang='jpn')
[] <-- ひらがなの'りんご'では登録されていない
>>> wn.synsets('ミカン', lang='jpn')[0]
Synset('orange.n.01') <-- 'ミカン'は1つだけ
>>> wn.synsets('リンゴ', lang='jpn')[0].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.25 <-- 経路距離メソッド path_simlarityを使ってみる。どちらも[0]の単一要素にして問うた
>>> wn.synsets('リンゴ', lang='jpn')[1].path_similarity(wn.synsets('ミカン', lan
g='jpn')[0])
0.25 <-- 経路距離メソッド path_simlarityを使ってみる。どちらも[0]の単一要素にして問うた
>>> wn.synsets('リンゴ', lang='jpn')[1].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.05263157894736842 <-- 'リンゴ'の2要素目を試してみた
裏は、[[corpus reader:http://www.nltk.org/api/nltk.corpus.reader.html]]の
class nltk.corpus.reader.wordnet.WordNetCorpusReader(root, omw_reader)
のところに、omw_reader (omw=open multilingual wordnet) が追加されていること。
(これが新し目のバージョンが必要な理由)
「歴史的には」もともとBond先生らを中心にした研究の成果として[[日本語WordNet:http://compling.hss.ntu.edu.sg/wnja/]] として公開されていたものがあり、
[[ダウンロードページ:http://compling.hss.ntu.edu.sg/wnja/jpn/downloads.html]]も整備されていた。
また、本 Steven Bird, Ewan Klein, Edward Loper: Natural Language Processing with Python の翻訳「入門 自然言語処理」(2010年)に当たって、訳者の萩原正人氏らが第12章「Python による日本語自然言語処理」を追加した(この章はWebでも公開されている。[[Python による日本語自然言語処理:http://www.nltk.org/book-jp/ch12.html]])が、その中で日本語WordNetの使い方を取り上げている。この時はNLTKのWordNetリーダーの外側に自前のリーダーを作っていた(Example II.1 (12_1_5_jpwordnet.py))ため、それなりの手順が必要であった。 (ちなみに、このコードは、NLTKのWordNetCorpusReaderの__init__に(このomw対応の改変のために)パラメタ(まさにomw_reader)が追加されたため、そのままでは動かないようだ。)
その後、NLTK側にインターフェースを追加したようで、現在の簡単な形になっているようだ。
[[ノート/テキストマイニング]]~
&counter(); &lastmod();~
**Python/NLTKからWordNet 3.0を使ってみる [#i05aee4b]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。日本語対応のためには新しいバージョンが必要。
≫ [[ノート/テキストマイニング/NLTK]]
-インストールについて参照ページは [[Installing NLTK:http://www.nltk.org/install.html]]
-pip install -U nltk にて新しいバージョンをダウンロード
-同ページによるとデータもダウンロードの必要あり。[[Installing NLTK Data:http://www.nltk.org/data]]によると Interactive Installer でインストールできる。Pythonを起動して、
>>> import nltk
>>> nltk.download()
コマンドプロンプトが出るので、"all" を選んで全データをインストール。
実際に使っている様子は、[[HowToの中にあるサンプル:http://www.nltk.org/howto/wordnet.html]]を見るとよい。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')
***日本語の対応について [#y81c96c8]
いろいろとあったが、新しい目のバージョンのNLTKでは多言語サポートが入っている。
参照ページはBond先生らの [[Open Multilingual Wordnet:http://compling.hss.ntu.edu.sg/omw/]] で、日本語WordNetの研究の延長で多言語(からのリンク)にしたものらしい。
このページに記述されているようなデータやインターフェースは、NLTK(少なくとも3.2.4には)に入っているようだ。
使い方は、
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('鯨', lang='jpn')
[Synset('whale.n.02')]
>>> wn.synset('spy.n.01').lemma_names('jpn')
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬', '秘密捜査員',
'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']
というところ。
使い方の説明は NLTKのHOWTOsの [[wordnet HOWTO:http://www.nltk.org/howto/wordnet.html]] に例が出ている。曰く
The WordNet corpus reader gives access to the Open Multilingual WordNet, using ISO-639 language codes.
>>> sorted(wn.langs())
['als', 'arb', 'cat', 'cmn', 'dan', 'eng', 'eus', 'fas', 'fin', 'fra', 'fre', 'glg', 'heb', 'ind', 'ita', 'jpn', 'nno',
'nob', 'pol', 'por', 'spa', 'tha', 'zsm']
>>> wn.synsets(b'\xe7\x8a\xac'.decode('utf-8'), lang='jpn')
[Synset('dog.n.01'), Synset('spy.n.01')]
(以下略)
実際に使ってみた例
>>> wp.synsets('リンゴ', lang='jpn')
[Synset('apple.n.01'), Synset('apple.n.02')]
>>> wp.synset('リンゴ', lang='jpn') <-- synsetSではなくsynsetの場合はダメ
TypeError: synset() got an unexpected keyword argument 'lang'
>>> wp.synsets('りんご', lang='jpn')
[] <-- ひらがなの'りんご'では登録されていない
>>> wn.synsets('ミカン', lang='jpn')[0]
Synset('orange.n.01') <-- 'ミカン'は1つだけ
>>> wn.synsets('リンゴ', lang='jpn')[0].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.25 <-- 経路距離メソッド path_simlarityを使ってみる。どちらも[0]の単一要素にして問うた
>>> wn.synsets('リンゴ', lang='jpn')[1].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.05263157894736842 <-- 'リンゴ'の2要素目を試してみた
>>> orange = wn.synsets('ミカン', lang='jpn')[0]
>>> orange.hypernyms() <-- [Synset('citrus.n.01')]
>>> orange.hyponyms()
[Synset('bitter_orange.n.02'), Synset('sweet_orange.n.01'), Synset('temple_orange.n.02')]
>>> orange.member_holonyms()
[]
>>> orange.root_hypernyms() <-- [Synset('entity.n.01')]
>>> apple = wn.synsets('リンゴ', lang='jpn')[0]
>>> orange.lowest_common_hypernyms(apple) <-- [Synset('edible_fruit.n.01')]
>>> wn.synset('orange.n.01').lowest_common_hypernyms(wn.synset('apple.n.01'))
[Synset('edible_fruit.n.01')]
裏は、[[corpus reader:http://www.nltk.org/api/nltk.corpus.reader.html]]の
class nltk.corpus.reader.wordnet.WordNetCorpusReader(root, omw_reader)
のところに、omw_reader (omw=open multilingual wordnet) が追加されていること。
(これが新し目のバージョンが必要な理由)
「歴史的には」もともとBond先生らを中心にした研究の成果として[[日本語WordNet:http://compling.hss.ntu.edu.sg/wnja/]] として公開されていたものがあり、
[[ダウンロードページ:http://compling.hss.ntu.edu.sg/wnja/jpn/downloads.html]]も整備されていた。
また、本 Steven Bird, Ewan Klein, Edward Loper: Natural Language Processing with Python の翻訳「入門 自然言語処理」(2010年)に当たって、訳者の萩原正人氏らが第12章「Python による日本語自然言語処理」を追加した(この章はWebでも公開されている。[[Python による日本語自然言語処理:http://www.nltk.org/book-jp/ch12.html]])が、その中で日本語WordNetの使い方を取り上げている。この時はNLTKのWordNetリーダーの外側に自前のリーダーを作っていた(Example II.1 (12_1_5_jpwordnet.py))ため、それなりの手順が必要であった。 (ちなみに、このコードは、NLTKのWordNetCorpusReaderの__init__に(このomw対応の改変のために)パラメタ(まさにomw_reader)が追加されたため、そのままでは動かないようだ。)
その後、NLTK側にインターフェースを追加したようで、現在の簡単な形になっているようだ。
[[ノート/テキストマイニング]]~
&counter(); &lastmod();~
**Python/NLTKからWordNet 3.0を使ってみる [#i05aee4b]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。日本語対応のためには新しいバージョンが必要。
≫ [[ノート/テキストマイニング/NLTK]]
-インストールについて参照ページは [[Installing NLTK:http://www.nltk.org/install.html]]
-pip install -U nltk にて新しいバージョンをダウンロード
-同ページによるとデータもダウンロードの必要あり。[[Installing NLTK Data:http://www.nltk.org/data]]によると Interactive Installer でインストールできる。Pythonを起動して、
>>> import nltk
>>> nltk.download()
コマンドプロンプトが出るので、"all" を選んで全データをインストール。
実際に使っている様子は、[[HowToの中にあるサンプル:http://www.nltk.org/howto/wordnet.html]]を見るとよい。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')
***日本語の対応について [#y81c96c8]
いろいろとあったが、新しい目のバージョンのNLTKでは多言語サポートが入っている。
参照ページはBond先生らの [[Open Multilingual Wordnet:http://compling.hss.ntu.edu.sg/omw/]] で、日本語WordNetの研究の延長で多言語(からのリンク)にしたものらしい。
このページに記述されているようなデータやインターフェースは、NLTK(少なくとも3.2.4には)に入っているようだ。
使い方は、
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('鯨', lang='jpn')
[Synset('whale.n.02')]
>>> wn.synset('spy.n.01').lemma_names('jpn')
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬', '秘密捜査員',
'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']
というところ。
使い方の説明は NLTKのHOWTOsの [[wordnet HOWTO:http://www.nltk.org/howto/wordnet.html]] に例が出ている。曰く
The WordNet corpus reader gives access to the Open Multilingual WordNet, using ISO-639 language codes.
>>> sorted(wn.langs())
['als', 'arb', 'cat', 'cmn', 'dan', 'eng', 'eus', 'fas', 'fin', 'fra', 'fre', 'glg', 'heb', 'ind', 'ita', 'jpn', 'nno',
'nob', 'pol', 'por', 'spa', 'tha', 'zsm']
>>> wn.synsets(b'\xe7\x8a\xac'.decode('utf-8'), lang='jpn')
[Synset('dog.n.01'), Synset('spy.n.01')]
(以下略)
実際に使ってみた例
>>> wp.synsets('リンゴ', lang='jpn')
[Synset('apple.n.01'), Synset('apple.n.02')]
>>> wp.synset('リンゴ', lang='jpn') <-- synsetSではなくsynsetの場合はダメ
TypeError: synset() got an unexpected keyword argument 'lang'
>>> wp.synsets('りんご', lang='jpn')
[] <-- ひらがなの'りんご'では登録されていない
>>> wn.synsets('ミカン', lang='jpn')[0]
Synset('orange.n.01') <-- 'ミカン'は1つだけ
>>> wn.synsets('リンゴ', lang='jpn')[0].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.25 <-- 経路距離メソッド path_simlarityを使ってみる。どちらも[0]の単一要素にして問うた
>>> wn.synsets('リンゴ', lang='jpn')[1].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.05263157894736842 <-- 'リンゴ'の2要素目を試してみた
>>> orange = wn.synsets('ミカン', lang='jpn')[0]
>>> orange.hypernyms() <-- [Synset('citrus.n.01')]
>>> orange.hyponyms()
[Synset('bitter_orange.n.02'), Synset('sweet_orange.n.01'), Synset('temple_orange.n.02')]
>>> orange.member_holonyms()
[]
>>> orange.root_hypernyms() <-- [Synset('entity.n.01')]
>>> apple = wn.synsets('リンゴ', lang='jpn')[0]
>>> orange.lowest_common_hypernyms(apple) <-- [Synset('edible_fruit.n.01')]
>>> wn.synset('orange.n.01').lowest_common_hypernyms(wn.synset('apple.n.01'))
[Synset('edible_fruit.n.01')]
>>> [u.lemma_names('jpn') for u in list(wn.synsets('犬', lang='jpn'))]
[['イヌ', 'ドッグ', '洋犬', '犬', '飼犬', '飼い犬'],
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬',
'秘密捜査員', 'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']]
裏は、[[corpus reader:http://www.nltk.org/api/nltk.corpus.reader.html]]の
class nltk.corpus.reader.wordnet.WordNetCorpusReader(root, omw_reader)
のところに、omw_reader (omw=open multilingual wordnet) が追加されていること。
(これが新し目のバージョンが必要な理由)
「歴史的には」もともとBond先生らを中心にした研究の成果として[[日本語WordNet:http://compling.hss.ntu.edu.sg/wnja/]] として公開されていたものがあり、
[[ダウンロードページ:http://compling.hss.ntu.edu.sg/wnja/jpn/downloads.html]]も整備されていた。
また、本 Steven Bird, Ewan Klein, Edward Loper: Natural Language Processing with Python の翻訳「入門 自然言語処理」(2010年)に当たって、訳者の萩原正人氏らが第12章「Python による日本語自然言語処理」を追加した(この章はWebでも公開されている。[[Python による日本語自然言語処理:http://www.nltk.org/book-jp/ch12.html]])が、その中で日本語WordNetの使い方を取り上げている。この時はNLTKのWordNetリーダーの外側に自前のリーダーを作っていた(Example II.1 (12_1_5_jpwordnet.py))ため、それなりの手順が必要であった。 (ちなみに、このコードは、NLTKのWordNetCorpusReaderの__init__に(このomw対応の改変のために)パラメタ(まさにomw_reader)が追加されたため、そのままでは動かないようだ。)
その後、NLTK側にインターフェースを追加したようで、現在の簡単な形になっているようだ。
[[ノート/テキストマイニング]]~
&counter(); &lastmod();~
**Python/NLTKからWordNet 3.0を使ってみる [#i05aee4b]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。日本語対応のためには新しいバージョンが必要。
≫ [[ノート/テキストマイニング/NLTK]]
-インストールについて参照ページは [[Installing NLTK:http://www.nltk.org/install.html]]
-pip install -U nltk にて新しいバージョンをダウンロード
-同ページによるとデータもダウンロードの必要あり。[[Installing NLTK Data:http://www.nltk.org/data]]によると Interactive Installer でインストールできる。Pythonを起動して、
>>> import nltk
>>> nltk.download()
コマンドプロンプトが出るので、"all" を選んで全データをインストール。
実際に使っている様子は、[[HowToの中にあるサンプル:http://www.nltk.org/howto/wordnet.html]]を見るとよい。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')
***日本語の対応について [#y81c96c8]
いろいろとあったが、新しい目のバージョンのNLTKでは多言語サポートが入っている。
参照ページはBond先生らの [[Open Multilingual Wordnet:http://compling.hss.ntu.edu.sg/omw/]] で、日本語WordNetの研究の延長で多言語(からのリンク)にしたものらしい。
このページに記述されているようなデータやインターフェースは、NLTK(少なくとも3.2.4には)に入っているようだ。
使い方は、
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('鯨', lang='jpn')
[Synset('whale.n.02')]
>>> wn.synset('spy.n.01').lemma_names('jpn')
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬', '秘密捜査員',
'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']
というところ。
使い方の説明は NLTKのHOWTOsの [[wordnet HOWTO:http://www.nltk.org/howto/wordnet.html]] に例が出ている。曰く
The WordNet corpus reader gives access to the Open Multilingual WordNet, using ISO-639 language codes.
>>> sorted(wn.langs())
['als', 'arb', 'cat', 'cmn', 'dan', 'eng', 'eus', 'fas', 'fin', 'fra', 'fre', 'glg', 'heb', 'ind', 'ita', 'jpn', 'nno',
'nob', 'pol', 'por', 'spa', 'tha', 'zsm']
>>> wn.synsets(b'\xe7\x8a\xac'.decode('utf-8'), lang='jpn')
[Synset('dog.n.01'), Synset('spy.n.01')]
(以下略)
実際に使ってみた例
>>> wp.synsets('リンゴ', lang='jpn')
[Synset('apple.n.01'), Synset('apple.n.02')]
>>> wp.synset('リンゴ', lang='jpn') <-- synsetSではなくsynsetの場合はダメ
TypeError: synset() got an unexpected keyword argument 'lang'
>>> wp.synsets('りんご', lang='jpn')
[] <-- ひらがなの'りんご'では登録されていない
>>> wn.synsets('ミカン', lang='jpn')[0]
Synset('orange.n.01') <-- 'ミカン'は1つだけ
>>> wn.synsets('リンゴ', lang='jpn')[0].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.25 <-- 経路距離メソッド path_simlarityを使ってみる。どちらも[0]の単一要素にして問うた
>>> wn.synsets('リンゴ', lang='jpn')[1].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.05263157894736842 <-- 'リンゴ'の2要素目を試してみた
>>> orange = wn.synsets('ミカン', lang='jpn')[0]
>>> orange.hypernyms() <-- [Synset('citrus.n.01')]
>>> orange.hyponyms()
[Synset('bitter_orange.n.02'), Synset('sweet_orange.n.01'), Synset('temple_orange.n.02')]
>>> orange.member_holonyms()
[]
>>> orange.root_hypernyms() <-- [Synset('entity.n.01')]
>>> apple = wn.synsets('リンゴ', lang='jpn')[0]
>>> orange.lowest_common_hypernyms(apple) <-- [Synset('edible_fruit.n.01')]
>>> wn.synset('orange.n.01').lowest_common_hypernyms(wn.synset('apple.n.01'))
[Synset('edible_fruit.n.01')]
>>> [u.lemma_names('jpn') for u in list(wn.synsets('犬', lang='jpn'))]
[['イヌ', 'ドッグ', '洋犬', '犬', '飼犬', '飼い犬'],
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬',
'秘密捜査員', 'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']]
NLTK/corpus/wordnet.pyの中に含まれているデモプログラムを抜き出して、単独で走るようにimportなどを追加したもの。
######################################################################
# Demo
######################################################################
from nltk.corpus import wordnet
from nltk.corpus.reader import WordNetCorpusReader, WordNetICCorpusReader
def demo():
import nltk
print('loading wordnet')
wn = WordNetCorpusReader(nltk.data.find('corpora/wordnet'), None)
print('done loading')
S = wn.synset
L = wn.lemma
print('getting a synset for go')
move_synset = S('go.v.21')
print(move_synset.name(), move_synset.pos(), move_synset.lexname())
print(move_synset.lemma_names())
print(move_synset.definition())
print(move_synset.examples())
zap_n = ['zap.n.01']
zap_v = ['zap.v.01', 'zap.v.02', 'nuke.v.01', 'microwave.v.01']
def _get_synsets(synset_strings):
return [S(synset) for synset in synset_strings]
zap_n_synsets = _get_synsets(zap_n)
zap_v_synsets = _get_synsets(zap_v)
print(zap_n_synsets)
print(zap_v_synsets)
print("Navigations:")
print(S('travel.v.01').hypernyms())
print(S('travel.v.02').hypernyms())
print(S('travel.v.03').hypernyms())
print(L('zap.v.03.nuke').derivationally_related_forms())
print(L('zap.v.03.atomize').derivationally_related_forms())
print(L('zap.v.03.atomise').derivationally_related_forms())
print(L('zap.v.03.zap').derivationally_related_forms())
print(S('dog.n.01').member_holonyms())
print(S('dog.n.01').part_meronyms())
print(S('breakfast.n.1').hypernyms())
print(S('meal.n.1').hyponyms())
print(S('Austen.n.1').instance_hypernyms())
print(S('composer.n.1').instance_hyponyms())
print(S('faculty.n.2').member_meronyms())
print(S('copilot.n.1').member_holonyms())
print(S('table.n.2').part_meronyms())
print(S('course.n.7').part_holonyms())
print(S('water.n.1').substance_meronyms())
print(S('gin.n.1').substance_holonyms())
# 以下3行は、エラーが出る
# print(L('leader.n.1.leader')) # Have some error possibly in data?
# print(L('leader.n.1.leader').antonyms())
# print(L('increase.v.1.increase').antonyms())
print(S('snore.v.1').entailments())
print(S('heavy.a.1').similar_tos())
print(S('light.a.1').attributes())
print(S('heavy.a.1').attributes())
# print(L('English.a.1.English').pertainyms()) # Same error as above
print(S('person.n.01').root_hypernyms())
print(S('sail.v.01').root_hypernyms())
print(S('fall.v.12').root_hypernyms())
print(S('person.n.01').lowest_common_hypernyms(S('dog.n.01')))
print(S('woman.n.01').lowest_common_hypernyms(S('girlfriend.n.02')))
print(S('dog.n.01').path_similarity(S('cat.n.01')))
print(S('dog.n.01').lch_similarity(S('cat.n.01')))
print(S('dog.n.01').wup_similarity(S('cat.n.01')))
wnic = WordNetICCorpusReader(nltk.data.find('corpora/wordnet_ic'),
'.*\.dat')
ic = wnic.ic('ic-brown.dat')
print(S('dog.n.01').jcn_similarity(S('cat.n.01'), ic))
ic = wnic.ic('ic-semcor.dat')
print(S('dog.n.01').lin_similarity(S('cat.n.01'), ic))
print(S('code.n.03').topic_domains())
print(S('pukka.a.01').region_domains())
print(S('freaky.a.01').usage_domains())
if __name__ == '__main__':
demo()
実行結果は、
loading wordnet
done loading
getting a synset for go
move.v.15 v verb.competition
['move', 'go']
have a turn; make one's move in a game
['Can I go now?']
[Synset('zap.n.01')]
[Synset('zap.v.01'), Synset('zap.v.02'), Synset('nuke.v.01'), Synset('microwave.v.01')]
Navigations:
[]
[Synset('travel.v.03')]
[]
[Lemma('atomic_warhead.n.01.nuke')]
[Lemma('atomization.n.02.atomization')]
[Lemma('atomization.n.02.atomisation')]
[]
[Synset('canis.n.01'), Synset('pack.n.06')]
[Synset('flag.n.07')]
[Synset('meal.n.01')]
[Synset('banquet.n.02'), Synset('bite.n.04'), Synset('breakfast.n.01'),
Synset('brunch.n.01'), Synset('buffet.n.02'), Synset('dinner.n.01'), Synset('lunch.n.01'),
Synset('mess.n.04'), Synset('nosh-up.n.01'), Synset('picnic.n.03'),
Synset('ploughman's_lunch.n.01'), Synset('potluck.n.01'), Synset('refection.n.01'),
Synset('square_meal.n.01'), Synset('supper.n.01'), Synset('tea.n.02')]
[Synset('writer.n.01')]
[Synset('ambrose.n.01'), Synset('bach.n.01'), Synset('barber.n.01'),
Synset('bartok.n.01'), Synset('beethoven.n.01'), Synset('bellini.n.01'),
Synset('berg.n.02'), Synset('berlioz.n.01'), Synset('bernstein.n.01'),
Synset('bizet.n.01'), Synset('blitzstein.n.01'), Synset('bloch.n.01'),
Synset('borodin.n.01'), Synset('boulez.n.01'), Synset('brahms.n.01'),
Synset('britten.n.01'), Synset('bruch.n.01'), Synset('bruckner.n.01'),
Synset('byrd.n.01'), Synset('cage.n.03'), Synset('chavez.n.01'),
Synset('cherubini.n.01'), Synset('chopin.n.03'), Synset('copland.n.01'),
Synset('corelli.n.01'), Synset('couperin.n.01'), Synset('coward.n.02'),
Synset('czerny.n.01'), Synset('debussy.n.01'), Synset('delibes.n.01'),
Synset('delius.n.01'), Synset('donizetti.n.01'), Synset('dowland.n.01'),
Synset('dukas.n.01'), Synset('dvorak.n.01'), Synset('elgar.n.01'), Synset('enesco.n.01'),
Synset('falla.n.01'), Synset('franck.n.01'), Synset('gershwin.n.02'),
Synset('glinka.n.01'), Synset('gluck.n.01'), Synset('gounod.n.01'),
Synset('grainger.n.01'), Synset('grieg.n.01'), Synset('halevy.n.01'),
Synset('handel.n.01'), Synset('handy.n.01'), Synset('haydn.n.01'),
Synset('hindemith.n.01'), Synset('honegger.n.01'), Synset('humperdinck.n.01'),
Synset('ibert.n.01'), Synset('ives.n.01'), Synset('joachim.n.01'), Synset('joplin.n.02'),
Synset('kachaturian.n.01'), Synset('kern.n.01'), Synset('khachaturian.n.01'),
Synset('lambert.n.02'), Synset('lasso.n.01'), Synset('ledbetter.n.01'),
Synset('lehar.n.01'), Synset('liszt.n.01'), Synset('lloyd_webber.n.01'),
Synset('loewe.n.01'), Synset('lully.n.02'), Synset('macdowell.n.01'),
Synset('mahler.n.01'), Synset('massenet.n.01'), Synset('mendelssohn.n.01'),
Synset('menotti.n.01'), Synset('meyerbeer.n.01'), Synset('milhaud.n.01'),
Synset('monteverdi.n.01'), Synset('moore.n.01'), Synset('mozart.n.01'),
Synset('mussorgsky.n.01'), Synset('nielsen.n.01'), Synset('offenbach.n.01'),
Synset('orbison.n.01'), Synset('palestrina.n.01'), Synset('piston.n.01'),
Synset('porter.n.04'), Synset('poulenc.n.01'), Synset('prokofiev.n.01'),
Synset('puccini.n.01'), Synset('purcell.n.01'), Synset('rachmaninoff.n.01'),
Synset('rameau.n.01'), Synset('ravel.n.01'), Synset('reich.n.03'),
Synset('respighi.n.01'), Synset('rimsky-korsakov.n.01'), Synset('rodgers.n.01'),
Synset('romberg.n.01'), Synset('rossini.n.01'), Synset('rubinstein.n.02'), Synset('saint-saens.n.01'),
Synset('satie.n.01'), Synset('schnabel.n.01'), Synset('schonberg.n.01'),
Synset('schubert.n.01'), Synset('schumann.n.01'), Synset('schumann.n.02'),
Synset('scriabin.n.01'), Synset('segovia.n.01'), Synset('sessions.n.01'),
Synset('shostakovich.n.01'), Synset('sibelius.n.01'), Synset('smetana.n.01'),
Synset('sondheim.n.01'), Synset('sousa.n.01'), Synset('strauss.n.01'),
Synset('strauss.n.02'), Synset('strauss.n.03'), Synset('stravinsky.n.01'),
Synset('sullivan.n.05'), Synset('tallis.n.01'), Synset('taylor.n.01'),
Synset('tchaikovsky.n.01'), Synset('telemann.n.01'), Synset('thomson.n.01'),
Synset('varese.n.01'), Synset('vaughan_williams.n.01'), Synset('verdi.n.01'),
Synset('villa-lobos.n.01'), Synset('vivaldi.n.01'), Synset('wagner.n.02'),
Synset('walton.n.01'), Synset('weber.n.05'), Synset('weill.n.01'), Synset('wolf.n.02')]
[Synset('professor.n.01')]
[Synset('crew.n.01')]
[Synset('leg.n.03'), Synset('tabletop.n.01'), Synset('tableware.n.01')]
[Synset('meal.n.01')]
[Synset('hydrogen.n.01'), Synset('oxygen.n.01')]
[Synset('gin_and_it.n.01'), Synset('gin_and_tonic.n.01'), Synset('martini.n.01'), Synset('pink_lady.n.01')]
[Synset('sleep.v.01')]
[Synset('dense.s.03'), Synset('doughy.s.01'), Synset('heavier-than-air.s.01'), Synset('hefty.s.02'), Synset('massive.s.04'), Synset('non-buoyant.s.01'),
Synset('ponderous.s.02')]
[Synset('weight.n.01')]
[Synset('weight.n.01')]
[Synset('entity.n.01')]
[Synset('travel.v.01')]
[Synset('act.v.01'), Synset('fall.v.17')]
[Synset('organism.n.01')]
[Synset('woman.n.01')]
0.2
2.0281482472922856
0.8571428571428571
0.4497755285516739
0.8863288628086228
[Synset('computer_science.n.01')]
[Synset('india.n.01')]
[Synset('slang.n.02')]
裏は、[[corpus reader:http://www.nltk.org/api/nltk.corpus.reader.html]]の
class nltk.corpus.reader.wordnet.WordNetCorpusReader(root, omw_reader)
のところに、omw_reader (omw=open multilingual wordnet) が追加されていること。
(これが新し目のバージョンが必要な理由)
「歴史的には」もともとBond先生らを中心にした研究の成果として[[日本語WordNet:http://compling.hss.ntu.edu.sg/wnja/]] として公開されていたものがあり、
[[ダウンロードページ:http://compling.hss.ntu.edu.sg/wnja/jpn/downloads.html]]も整備されていた。
また、本 Steven Bird, Ewan Klein, Edward Loper: Natural Language Processing with Python の翻訳「入門 自然言語処理」(2010年)に当たって、訳者の萩原正人氏らが第12章「Python による日本語自然言語処理」を追加した(この章はWebでも公開されている。[[Python による日本語自然言語処理:http://www.nltk.org/book-jp/ch12.html]])が、その中で日本語WordNetの使い方を取り上げている。この時はNLTKのWordNetリーダーの外側に自前のリーダーを作っていた(Example II.1 (12_1_5_jpwordnet.py))ため、それなりの手順が必要であった。 (ちなみに、このコードは、NLTKのWordNetCorpusReaderの__init__に(このomw対応の改変のために)パラメタ(まさにomw_reader)が追加されたため、そのままでは動かないようだ。)
その後、NLTK側にインターフェースを追加したようで、現在の簡単な形になっているようだ。
[[ノート/テキストマイニング]]~
&counter(); &lastmod();~
**Python/NLTKからWordNet 3.0を使ってみる [#i05aee4b]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。日本語対応のためには新しいバージョンが必要。
≫ [[ノート/テキストマイニング/NLTK]]
-インストールについて参照ページは [[Installing NLTK:http://www.nltk.org/install.html]]
-pip install -U nltk にて新しいバージョンをダウンロード
-同ページによるとデータもダウンロードの必要あり。[[Installing NLTK Data:http://www.nltk.org/data]]によると Interactive Installer でインストールできる。Pythonを起動して、
>>> import nltk
>>> nltk.download()
コマンドプロンプトが出るので、"all" を選んで全データをインストール。
実際に使っている様子は、[[HowToの中にあるサンプル:http://www.nltk.org/howto/wordnet.html]]を見るとよい。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')
***日本語の対応について [#y81c96c8]
いろいろとあったが、新しい目のバージョンのNLTKでは多言語サポートが入っている。
参照ページはBond先生らの [[Open Multilingual Wordnet:http://compling.hss.ntu.edu.sg/omw/]] で、日本語WordNetの研究の延長で多言語(からのリンク)にしたものらしい。
このページに記述されているようなデータやインターフェースは、NLTK(少なくとも3.2.4には)に入っているようだ。
使い方は、
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('鯨', lang='jpn')
[Synset('whale.n.02')]
>>> wn.synset('spy.n.01').lemma_names('jpn')
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬', '秘密捜査員',
'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']
というところ。
使い方の説明は NLTKのHOWTOsの [[wordnet HOWTO:http://www.nltk.org/howto/wordnet.html]] に例が出ている。曰く
The WordNet corpus reader gives access to the Open Multilingual WordNet, using ISO-639 language codes.
>>> sorted(wn.langs())
['als', 'arb', 'cat', 'cmn', 'dan', 'eng', 'eus', 'fas', 'fin', 'fra', 'fre', 'glg', 'heb', 'ind', 'ita', 'jpn', 'nno',
'nob', 'pol', 'por', 'spa', 'tha', 'zsm']
>>> wn.synsets(b'\xe7\x8a\xac'.decode('utf-8'), lang='jpn')
[Synset('dog.n.01'), Synset('spy.n.01')]
(以下略)
実際に使ってみた例
>>> wp.synsets('リンゴ', lang='jpn')
[Synset('apple.n.01'), Synset('apple.n.02')]
>>> wp.synset('リンゴ', lang='jpn') <-- synsetSではなくsynsetの場合はダメ
TypeError: synset() got an unexpected keyword argument 'lang'
>>> wp.synsets('りんご', lang='jpn')
[] <-- ひらがなの'りんご'では登録されていない
>>> wn.synsets('ミカン', lang='jpn')[0]
Synset('orange.n.01') <-- 'ミカン'は1つだけ
>>> wn.synsets('リンゴ', lang='jpn')[0].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.25 <-- 経路距離メソッド path_simlarityを使ってみる。どちらも[0]の単一要素にして問うた
>>> wn.synsets('リンゴ', lang='jpn')[1].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.05263157894736842 <-- 'リンゴ'の2要素目を試してみた
>>> orange = wn.synsets('ミカン', lang='jpn')[0]
>>> orange.hypernyms() <-- [Synset('citrus.n.01')]
>>> orange.hyponyms()
[Synset('bitter_orange.n.02'), Synset('sweet_orange.n.01'), Synset('temple_orange.n.02')]
>>> orange.member_holonyms()
[]
>>> orange.root_hypernyms() <-- [Synset('entity.n.01')]
>>> apple = wn.synsets('リンゴ', lang='jpn')[0]
>>> orange.lowest_common_hypernyms(apple) <-- [Synset('edible_fruit.n.01')]
>>> wn.synset('orange.n.01').lowest_common_hypernyms(wn.synset('apple.n.01'))
[Synset('edible_fruit.n.01')]
>>> [u.lemma_names('jpn') for u in list(wn.synsets('犬', lang='jpn'))]
[['イヌ', 'ドッグ', '洋犬', '犬', '飼犬', '飼い犬'],
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬',
'秘密捜査員', 'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']]
NLTK/corpus/wordnet.pyの中に含まれているデモプログラムを抜き出して、単独で走るようにimportなどを追加したもの。
######################################################################
# Demo
######################################################################
from nltk.corpus import wordnet
from nltk.corpus.reader import WordNetCorpusReader, WordNetICCorpusReader
def demo():
import nltk
print('loading wordnet')
wn = WordNetCorpusReader(nltk.data.find('corpora/wordnet'), None)
print('done loading')
S = wn.synset
L = wn.lemma
print('getting a synset for go')
move_synset = S('go.v.21')
print(move_synset.name(), move_synset.pos(), move_synset.lexname())
print(move_synset.lemma_names())
print(move_synset.definition())
print(move_synset.examples())
zap_n = ['zap.n.01']
zap_v = ['zap.v.01', 'zap.v.02', 'nuke.v.01', 'microwave.v.01']
def _get_synsets(synset_strings):
return [S(synset) for synset in synset_strings]
zap_n_synsets = _get_synsets(zap_n)
zap_v_synsets = _get_synsets(zap_v)
print(zap_n_synsets)
print(zap_v_synsets)
print("Navigations:")
print(S('travel.v.01').hypernyms())
print(S('travel.v.02').hypernyms())
print(S('travel.v.03').hypernyms())
print(L('zap.v.03.nuke').derivationally_related_forms())
print(L('zap.v.03.atomize').derivationally_related_forms())
print(L('zap.v.03.atomise').derivationally_related_forms())
print(L('zap.v.03.zap').derivationally_related_forms())
print(S('dog.n.01').member_holonyms())
print(S('dog.n.01').part_meronyms())
print(S('breakfast.n.1').hypernyms())
print(S('meal.n.1').hyponyms())
print(S('Austen.n.1').instance_hypernyms())
print(S('composer.n.1').instance_hyponyms())
print(S('faculty.n.2').member_meronyms())
print(S('copilot.n.1').member_holonyms())
print(S('table.n.2').part_meronyms())
print(S('course.n.7').part_holonyms())
print(S('water.n.1').substance_meronyms())
print(S('gin.n.1').substance_holonyms())
# 以下3行は、エラーが出る
# print(L('leader.n.1.leader')) # Have some error possibly in data?
# print(L('leader.n.1.leader').antonyms())
# print(L('increase.v.1.increase').antonyms())
print(S('snore.v.1').entailments())
print(S('heavy.a.1').similar_tos())
print(S('light.a.1').attributes())
print(S('heavy.a.1').attributes())
# print(L('English.a.1.English').pertainyms()) # Same error as above
print(S('person.n.01').root_hypernyms())
print(S('sail.v.01').root_hypernyms())
print(S('fall.v.12').root_hypernyms())
print(S('person.n.01').lowest_common_hypernyms(S('dog.n.01')))
print(S('woman.n.01').lowest_common_hypernyms(S('girlfriend.n.02')))
print(S('dog.n.01').path_similarity(S('cat.n.01')))
print(S('dog.n.01').lch_similarity(S('cat.n.01')))
print(S('dog.n.01').wup_similarity(S('cat.n.01')))
wnic = WordNetICCorpusReader(nltk.data.find('corpora/wordnet_ic'),
'.*\.dat')
ic = wnic.ic('ic-brown.dat')
print(S('dog.n.01').jcn_similarity(S('cat.n.01'), ic))
ic = wnic.ic('ic-semcor.dat')
print(S('dog.n.01').lin_similarity(S('cat.n.01'), ic))
print(S('code.n.03').topic_domains())
print(S('pukka.a.01').region_domains())
print(S('freaky.a.01').usage_domains())
if __name__ == '__main__':
demo()
実行結果は、
loading wordnet
done loading
getting a synset for go
move.v.15 v verb.competition
['move', 'go']
have a turn; make one's move in a game
['Can I go now?']
[Synset('zap.n.01')]
[Synset('zap.v.01'), Synset('zap.v.02'), Synset('nuke.v.01'), Synset('microwave.v.01')]
Navigations:
[]
[Synset('travel.v.03')]
[]
[Lemma('atomic_warhead.n.01.nuke')]
[Lemma('atomization.n.02.atomization')]
[Lemma('atomization.n.02.atomisation')]
[]
[Synset('canis.n.01'), Synset('pack.n.06')]
[Synset('flag.n.07')]
[Synset('meal.n.01')]
[Synset('banquet.n.02'), Synset('bite.n.04'), Synset('breakfast.n.01'),
Synset('brunch.n.01'), Synset('buffet.n.02'), Synset('dinner.n.01'), Synset('lunch.n.01'),
Synset('mess.n.04'), Synset('nosh-up.n.01'), Synset('picnic.n.03'),
Synset('ploughman's_lunch.n.01'), Synset('potluck.n.01'), Synset('refection.n.01'),
Synset('square_meal.n.01'), Synset('supper.n.01'), Synset('tea.n.02')]
[Synset('writer.n.01')]
[Synset('ambrose.n.01'), Synset('bach.n.01'), Synset('barber.n.01'),
Synset('bartok.n.01'), Synset('beethoven.n.01'), Synset('bellini.n.01'),
Synset('berg.n.02'), Synset('berlioz.n.01'), Synset('bernstein.n.01'),
Synset('bizet.n.01'), Synset('blitzstein.n.01'), Synset('bloch.n.01'),
Synset('borodin.n.01'), Synset('boulez.n.01'), Synset('brahms.n.01'),
Synset('britten.n.01'), Synset('bruch.n.01'), Synset('bruckner.n.01'),
Synset('byrd.n.01'), Synset('cage.n.03'), Synset('chavez.n.01'),
Synset('cherubini.n.01'), Synset('chopin.n.03'), Synset('copland.n.01'),
Synset('corelli.n.01'), Synset('couperin.n.01'), Synset('coward.n.02'),
Synset('czerny.n.01'), Synset('debussy.n.01'), Synset('delibes.n.01'),
Synset('delius.n.01'), Synset('donizetti.n.01'), Synset('dowland.n.01'),
Synset('dukas.n.01'), Synset('dvorak.n.01'), Synset('elgar.n.01'), Synset('enesco.n.01'),
Synset('falla.n.01'), Synset('franck.n.01'), Synset('gershwin.n.02'),
Synset('glinka.n.01'), Synset('gluck.n.01'), Synset('gounod.n.01'),
Synset('grainger.n.01'), Synset('grieg.n.01'), Synset('halevy.n.01'),
Synset('handel.n.01'), Synset('handy.n.01'), Synset('haydn.n.01'),
Synset('hindemith.n.01'), Synset('honegger.n.01'), Synset('humperdinck.n.01'),
Synset('ibert.n.01'), Synset('ives.n.01'), Synset('joachim.n.01'), Synset('joplin.n.02'),
Synset('kachaturian.n.01'), Synset('kern.n.01'), Synset('khachaturian.n.01'),
Synset('lambert.n.02'), Synset('lasso.n.01'), Synset('ledbetter.n.01'),
Synset('lehar.n.01'), Synset('liszt.n.01'), Synset('lloyd_webber.n.01'),
Synset('loewe.n.01'), Synset('lully.n.02'), Synset('macdowell.n.01'),
Synset('mahler.n.01'), Synset('massenet.n.01'), Synset('mendelssohn.n.01'),
Synset('menotti.n.01'), Synset('meyerbeer.n.01'), Synset('milhaud.n.01'),
Synset('monteverdi.n.01'), Synset('moore.n.01'), Synset('mozart.n.01'),
Synset('mussorgsky.n.01'), Synset('nielsen.n.01'), Synset('offenbach.n.01'),
Synset('orbison.n.01'), Synset('palestrina.n.01'), Synset('piston.n.01'),
Synset('porter.n.04'), Synset('poulenc.n.01'), Synset('prokofiev.n.01'),
Synset('puccini.n.01'), Synset('purcell.n.01'), Synset('rachmaninoff.n.01'),
Synset('rameau.n.01'), Synset('ravel.n.01'), Synset('reich.n.03'),
Synset('respighi.n.01'), Synset('rimsky-korsakov.n.01'), Synset('rodgers.n.01'),
Synset('romberg.n.01'), Synset('rossini.n.01'), Synset('rubinstein.n.02'), Synset('saint-saens.n.01'),
Synset('satie.n.01'), Synset('schnabel.n.01'), Synset('schonberg.n.01'),
Synset('schubert.n.01'), Synset('schumann.n.01'), Synset('schumann.n.02'),
Synset('scriabin.n.01'), Synset('segovia.n.01'), Synset('sessions.n.01'),
Synset('shostakovich.n.01'), Synset('sibelius.n.01'), Synset('smetana.n.01'),
Synset('sondheim.n.01'), Synset('sousa.n.01'), Synset('strauss.n.01'),
Synset('strauss.n.02'), Synset('strauss.n.03'), Synset('stravinsky.n.01'),
Synset('sullivan.n.05'), Synset('tallis.n.01'), Synset('taylor.n.01'),
Synset('tchaikovsky.n.01'), Synset('telemann.n.01'), Synset('thomson.n.01'),
Synset('varese.n.01'), Synset('vaughan_williams.n.01'), Synset('verdi.n.01'),
Synset('villa-lobos.n.01'), Synset('vivaldi.n.01'), Synset('wagner.n.02'),
Synset('walton.n.01'), Synset('weber.n.05'), Synset('weill.n.01'), Synset('wolf.n.02')]
[Synset('professor.n.01')]
[Synset('crew.n.01')]
[Synset('leg.n.03'), Synset('tabletop.n.01'), Synset('tableware.n.01')]
[Synset('meal.n.01')]
[Synset('hydrogen.n.01'), Synset('oxygen.n.01')]
[Synset('gin_and_it.n.01'), Synset('gin_and_tonic.n.01'), Synset('martini.n.01'), Synset('pink_lady.n.01')]
[Synset('sleep.v.01')]
[Synset('dense.s.03'), Synset('doughy.s.01'), Synset('heavier-than-air.s.01'), Synset('hefty.s.02'), Synset('massive.s.04'), Synset('non-buoyant.s.01'),
Synset('ponderous.s.02')]
[Synset('weight.n.01')]
[Synset('weight.n.01')]
[Synset('entity.n.01')]
[Synset('travel.v.01')]
[Synset('act.v.01'), Synset('fall.v.17')]
[Synset('organism.n.01')]
[Synset('woman.n.01')]
0.2
2.0281482472922856
0.8571428571428571
0.4497755285516739
0.8863288628086228
[Synset('computer_science.n.01')]
[Synset('india.n.01')]
[Synset('slang.n.02')]
***日本語の対応について [#y81c96c8]
いろいろとあったが、新しい目のバージョンのNLTKでは多言語サポートが入っている。
参照ページはBond先生らの [[Open Multilingual Wordnet:http://compling.hss.ntu.edu.sg/omw/]] で、日本語WordNetの研究の延長で多言語(からのリンク)にしたものらしい。
このページに記述されているようなデータやインターフェースは、NLTK(少なくとも3.2.4には)に入っているようだ。
使い方は、
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('鯨', lang='jpn')
[Synset('whale.n.02')]
>>> wn.synset('spy.n.01').lemma_names('jpn')
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬', '秘密捜査員',
'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']
というところ。
使い方の説明は NLTKのHOWTOsの [[wordnet HOWTO:http://www.nltk.org/howto/wordnet.html]] に例が出ている。曰く
The WordNet corpus reader gives access to the Open Multilingual WordNet, using ISO-639 language codes.
>>> sorted(wn.langs())
['als', 'arb', 'cat', 'cmn', 'dan', 'eng', 'eus', 'fas', 'fin', 'fra', 'fre', 'glg', 'heb', 'ind', 'ita', 'jpn', 'nno',
'nob', 'pol', 'por', 'spa', 'tha', 'zsm']
>>> wn.synsets(b'\xe7\x8a\xac'.decode('utf-8'), lang='jpn')
[Synset('dog.n.01'), Synset('spy.n.01')]
(以下略)
日本語WordNetを使ってみた例
>>> wp.synsets('リンゴ', lang='jpn')
[Synset('apple.n.01'), Synset('apple.n.02')]
>>> wp.synset('リンゴ', lang='jpn') <-- synsetSではなくsynsetの場合はダメ
TypeError: synset() got an unexpected keyword argument 'lang'
>>> wp.synsets('りんご', lang='jpn')
[] <-- ひらがなの'りんご'では登録されていない
>>> wn.synsets('ミカン', lang='jpn')[0]
Synset('orange.n.01') <-- 'ミカン'は1つだけ
>>> wn.synsets('リンゴ', lang='jpn')[0].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.25 <-- 経路距離メソッド path_simlarityを使ってみる。どちらも[0]の単一要素にして問うた
>>> wn.synsets('リンゴ', lang='jpn')[1].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.05263157894736842 <-- 'リンゴ'の2要素目を試してみた
>>> orange = wn.synsets('ミカン', lang='jpn')[0]
>>> orange.hypernyms() <-- [Synset('citrus.n.01')]
>>> orange.hyponyms()
[Synset('bitter_orange.n.02'), Synset('sweet_orange.n.01'), Synset('temple_orange.n.02')]
>>> orange.member_holonyms()
[]
>>> orange.root_hypernyms() <-- [Synset('entity.n.01')]
>>> apple = wn.synsets('リンゴ', lang='jpn')[0]
>>> orange.lowest_common_hypernyms(apple) <-- [Synset('edible_fruit.n.01')]
>>> wn.synset('orange.n.01').lowest_common_hypernyms(wn.synset('apple.n.01'))
[Synset('edible_fruit.n.01')]
>>> [u.lemma_names('jpn') for u in list(wn.synsets('犬', lang='jpn'))]
[['イヌ', 'ドッグ', '洋犬', '犬', '飼犬', '飼い犬'],
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬',
'秘密捜査員', 'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']]
裏は、[[corpus reader:http://www.nltk.org/api/nltk.corpus.reader.html]]の
class nltk.corpus.reader.wordnet.WordNetCorpusReader(root, omw_reader)
のところに、omw_reader (omw=open multilingual wordnet) が追加されていること。
(これが新し目のバージョンが必要な理由)
「歴史的には」もともとBond先生らを中心にした研究の成果として[[日本語WordNet:http://compling.hss.ntu.edu.sg/wnja/]] として公開されていたものがあり、
[[ダウンロードページ:http://compling.hss.ntu.edu.sg/wnja/jpn/downloads.html]]も整備されていた。
また、本 Steven Bird, Ewan Klein, Edward Loper: Natural Language Processing with Python の翻訳「入門 自然言語処理」(2010年)に当たって、訳者の萩原正人氏らが第12章「Python による日本語自然言語処理」を追加した(この章はWebでも公開されている。[[Python による日本語自然言語処理:http://www.nltk.org/book-jp/ch12.html]])が、その中で日本語WordNetの使い方を取り上げている。この時はNLTKのWordNetリーダーの外側に自前のリーダーを作っていた(Example II.1 (12_1_5_jpwordnet.py))ため、それなりの手順が必要であった。 (ちなみに、このコードは、NLTKのWordNetCorpusReaderの__init__に(このomw対応の改変のために)パラメタ(まさにomw_reader)が追加されたため、そのままでは動かないようだ。)
その後、NLTK側にインターフェースを追加したようで、現在の簡単な形になっているようだ。
[[ノート/テキストマイニング]]~
&counter(); &lastmod();~
**Python/NLTKからWordNet 3.0を使ってみる [#i05aee4b]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。日本語対応のためには新しいバージョンが必要。
≫ [[ノート/テキストマイニング/NLTK]]
-インストールについて参照ページは [[Installing NLTK:http://www.nltk.org/install.html]]
-pip install -U nltk にて新しいバージョンをダウンロード
-同ページによるとデータもダウンロードの必要あり。[[Installing NLTK Data:http://www.nltk.org/data]]によると Interactive Installer でインストールできる。Pythonを起動して、
>>> import nltk
>>> nltk.download()
コマンドプロンプトが出るので、"all" を選んで全データをインストール。
実際に使っている様子は、[[HowToの中にあるサンプル:http://www.nltk.org/howto/wordnet.html]]を見るとよい。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')
NLTK/corpus/wordnet.pyの中に含まれているデモプログラムを抜き出して、単独で走るようにimportなどを追加したもの。
######################################################################
# Demo
######################################################################
from nltk.corpus import wordnet
from nltk.corpus.reader import WordNetCorpusReader, WordNetICCorpusReader
def demo():
import nltk
print('loading wordnet')
wn = WordNetCorpusReader(nltk.data.find('corpora/wordnet'), None)
print('done loading')
S = wn.synset
L = wn.lemma
print('getting a synset for go')
move_synset = S('go.v.21')
print(move_synset.name(), move_synset.pos(), move_synset.lexname())
print(move_synset.lemma_names())
print(move_synset.definition())
print(move_synset.examples())
zap_n = ['zap.n.01']
zap_v = ['zap.v.01', 'zap.v.02', 'nuke.v.01', 'microwave.v.01']
def _get_synsets(synset_strings):
return [S(synset) for synset in synset_strings]
zap_n_synsets = _get_synsets(zap_n)
zap_v_synsets = _get_synsets(zap_v)
print(zap_n_synsets)
print(zap_v_synsets)
print("Navigations:")
print(S('travel.v.01').hypernyms())
print(S('travel.v.02').hypernyms())
print(S('travel.v.03').hypernyms())
print(L('zap.v.03.nuke').derivationally_related_forms())
print(L('zap.v.03.atomize').derivationally_related_forms())
print(L('zap.v.03.atomise').derivationally_related_forms())
print(L('zap.v.03.zap').derivationally_related_forms())
print(S('dog.n.01').member_holonyms())
print(S('dog.n.01').part_meronyms())
print(S('breakfast.n.1').hypernyms())
print(S('meal.n.1').hyponyms())
print(S('Austen.n.1').instance_hypernyms())
print(S('composer.n.1').instance_hyponyms())
print(S('faculty.n.2').member_meronyms())
print(S('copilot.n.1').member_holonyms())
print(S('table.n.2').part_meronyms())
print(S('course.n.7').part_holonyms())
print(S('water.n.1').substance_meronyms())
print(S('gin.n.1').substance_holonyms())
# 以下3行は、エラーが出る
# print(L('leader.n.1.leader')) # Have some error possibly in data?
# print(L('leader.n.1.leader').antonyms())
# print(L('increase.v.1.increase').antonyms())
print(S('snore.v.1').entailments())
print(S('heavy.a.1').similar_tos())
print(S('light.a.1').attributes())
print(S('heavy.a.1').attributes())
# print(L('English.a.1.English').pertainyms()) # Same error as above
print(S('person.n.01').root_hypernyms())
print(S('sail.v.01').root_hypernyms())
print(S('fall.v.12').root_hypernyms())
print(S('person.n.01').lowest_common_hypernyms(S('dog.n.01')))
print(S('woman.n.01').lowest_common_hypernyms(S('girlfriend.n.02')))
print(S('dog.n.01').path_similarity(S('cat.n.01')))
print(S('dog.n.01').lch_similarity(S('cat.n.01')))
print(S('dog.n.01').wup_similarity(S('cat.n.01')))
wnic = WordNetICCorpusReader(nltk.data.find('corpora/wordnet_ic'),
'.*\.dat')
ic = wnic.ic('ic-brown.dat')
print(S('dog.n.01').jcn_similarity(S('cat.n.01'), ic))
ic = wnic.ic('ic-semcor.dat')
print(S('dog.n.01').lin_similarity(S('cat.n.01'), ic))
print(S('code.n.03').topic_domains())
print(S('pukka.a.01').region_domains())
print(S('freaky.a.01').usage_domains())
if __name__ == '__main__':
demo()
実行結果は、
loading wordnet
done loading
getting a synset for go
move.v.15 v verb.competition
['move', 'go']
have a turn; make one's move in a game
['Can I go now?']
[Synset('zap.n.01')]
[Synset('zap.v.01'), Synset('zap.v.02'), Synset('nuke.v.01'), Synset('microwave.v.01')]
Navigations:
[]
[Synset('travel.v.03')]
[]
[Lemma('atomic_warhead.n.01.nuke')]
[Lemma('atomization.n.02.atomization')]
[Lemma('atomization.n.02.atomisation')]
[]
[Synset('canis.n.01'), Synset('pack.n.06')]
[Synset('flag.n.07')]
[Synset('meal.n.01')]
[Synset('banquet.n.02'), Synset('bite.n.04'), Synset('breakfast.n.01'),
Synset('brunch.n.01'), Synset('buffet.n.02'), Synset('dinner.n.01'), Synset('lunch.n.01'),
Synset('mess.n.04'), Synset('nosh-up.n.01'), Synset('picnic.n.03'),
Synset('ploughman's_lunch.n.01'), Synset('potluck.n.01'), Synset('refection.n.01'),
Synset('square_meal.n.01'), Synset('supper.n.01'), Synset('tea.n.02')]
[Synset('writer.n.01')]
[Synset('ambrose.n.01'), Synset('bach.n.01'), Synset('barber.n.01'),
Synset('bartok.n.01'), Synset('beethoven.n.01'), Synset('bellini.n.01'),
Synset('berg.n.02'), Synset('berlioz.n.01'), Synset('bernstein.n.01'),
Synset('bizet.n.01'), Synset('blitzstein.n.01'), Synset('bloch.n.01'),
Synset('borodin.n.01'), Synset('boulez.n.01'), Synset('brahms.n.01'),
Synset('britten.n.01'), Synset('bruch.n.01'), Synset('bruckner.n.01'),
Synset('byrd.n.01'), Synset('cage.n.03'), Synset('chavez.n.01'),
Synset('cherubini.n.01'), Synset('chopin.n.03'), Synset('copland.n.01'),
Synset('corelli.n.01'), Synset('couperin.n.01'), Synset('coward.n.02'),
Synset('czerny.n.01'), Synset('debussy.n.01'), Synset('delibes.n.01'),
Synset('delius.n.01'), Synset('donizetti.n.01'), Synset('dowland.n.01'),
Synset('dukas.n.01'), Synset('dvorak.n.01'), Synset('elgar.n.01'), Synset('enesco.n.01'),
Synset('falla.n.01'), Synset('franck.n.01'), Synset('gershwin.n.02'),
Synset('glinka.n.01'), Synset('gluck.n.01'), Synset('gounod.n.01'),
Synset('grainger.n.01'), Synset('grieg.n.01'), Synset('halevy.n.01'),
Synset('handel.n.01'), Synset('handy.n.01'), Synset('haydn.n.01'),
Synset('hindemith.n.01'), Synset('honegger.n.01'), Synset('humperdinck.n.01'),
Synset('ibert.n.01'), Synset('ives.n.01'), Synset('joachim.n.01'), Synset('joplin.n.02'),
Synset('kachaturian.n.01'), Synset('kern.n.01'), Synset('khachaturian.n.01'),
Synset('lambert.n.02'), Synset('lasso.n.01'), Synset('ledbetter.n.01'),
Synset('lehar.n.01'), Synset('liszt.n.01'), Synset('lloyd_webber.n.01'),
Synset('loewe.n.01'), Synset('lully.n.02'), Synset('macdowell.n.01'),
Synset('mahler.n.01'), Synset('massenet.n.01'), Synset('mendelssohn.n.01'),
Synset('menotti.n.01'), Synset('meyerbeer.n.01'), Synset('milhaud.n.01'),
Synset('monteverdi.n.01'), Synset('moore.n.01'), Synset('mozart.n.01'),
Synset('mussorgsky.n.01'), Synset('nielsen.n.01'), Synset('offenbach.n.01'),
Synset('orbison.n.01'), Synset('palestrina.n.01'), Synset('piston.n.01'),
Synset('porter.n.04'), Synset('poulenc.n.01'), Synset('prokofiev.n.01'),
Synset('puccini.n.01'), Synset('purcell.n.01'), Synset('rachmaninoff.n.01'),
Synset('rameau.n.01'), Synset('ravel.n.01'), Synset('reich.n.03'),
Synset('respighi.n.01'), Synset('rimsky-korsakov.n.01'), Synset('rodgers.n.01'),
Synset('romberg.n.01'), Synset('rossini.n.01'), Synset('rubinstein.n.02'), Synset('saint-saens.n.01'),
Synset('satie.n.01'), Synset('schnabel.n.01'), Synset('schonberg.n.01'),
Synset('schubert.n.01'), Synset('schumann.n.01'), Synset('schumann.n.02'),
Synset('scriabin.n.01'), Synset('segovia.n.01'), Synset('sessions.n.01'),
Synset('shostakovich.n.01'), Synset('sibelius.n.01'), Synset('smetana.n.01'),
Synset('sondheim.n.01'), Synset('sousa.n.01'), Synset('strauss.n.01'),
Synset('strauss.n.02'), Synset('strauss.n.03'), Synset('stravinsky.n.01'),
Synset('sullivan.n.05'), Synset('tallis.n.01'), Synset('taylor.n.01'),
Synset('tchaikovsky.n.01'), Synset('telemann.n.01'), Synset('thomson.n.01'),
Synset('varese.n.01'), Synset('vaughan_williams.n.01'), Synset('verdi.n.01'),
Synset('villa-lobos.n.01'), Synset('vivaldi.n.01'), Synset('wagner.n.02'),
Synset('walton.n.01'), Synset('weber.n.05'), Synset('weill.n.01'), Synset('wolf.n.02')]
[Synset('professor.n.01')]
[Synset('crew.n.01')]
[Synset('leg.n.03'), Synset('tabletop.n.01'), Synset('tableware.n.01')]
[Synset('meal.n.01')]
[Synset('hydrogen.n.01'), Synset('oxygen.n.01')]
[Synset('gin_and_it.n.01'), Synset('gin_and_tonic.n.01'), Synset('martini.n.01'), Synset('pink_lady.n.01')]
[Synset('sleep.v.01')]
[Synset('dense.s.03'), Synset('doughy.s.01'), Synset('heavier-than-air.s.01'), Synset('hefty.s.02'), Synset('massive.s.04'), Synset('non-buoyant.s.01'),
Synset('ponderous.s.02')]
[Synset('weight.n.01')]
[Synset('weight.n.01')]
[Synset('entity.n.01')]
[Synset('travel.v.01')]
[Synset('act.v.01'), Synset('fall.v.17')]
[Synset('organism.n.01')]
[Synset('woman.n.01')]
0.2
2.0281482472922856
0.8571428571428571
0.4497755285516739
0.8863288628086228
[Synset('computer_science.n.01')]
[Synset('india.n.01')]
[Synset('slang.n.02')]
***日本語の対応について [#y81c96c8]
いろいろとあったが、新しい目のバージョンのNLTKでは多言語サポートが入っている。
参照ページはBond先生らの [[Open Multilingual Wordnet:http://compling.hss.ntu.edu.sg/omw/]] で、日本語WordNetの研究の延長で多言語(からのリンク)にしたものらしい。
このページに記述されているようなデータやインターフェースは、NLTK(少なくとも3.2.4には)に入っているようだ。
使い方は、
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('鯨', lang='jpn')
[Synset('whale.n.02')]
>>> wn.synset('spy.n.01').lemma_names('jpn')
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬', '秘密捜査員',
'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']
というところ。
使い方の説明は NLTKのHOWTOsの [[wordnet HOWTO:http://www.nltk.org/howto/wordnet.html]] に例が出ている。曰く
The WordNet corpus reader gives access to the Open Multilingual WordNet, using ISO-639 language codes.
>>> sorted(wn.langs())
['als', 'arb', 'cat', 'cmn', 'dan', 'eng', 'eus', 'fas', 'fin', 'fra', 'fre', 'glg', 'heb', 'ind', 'ita', 'jpn', 'nno',
'nob', 'pol', 'por', 'spa', 'tha', 'zsm']
>>> wn.synsets(b'\xe7\x8a\xac'.decode('utf-8'), lang='jpn')
[Synset('dog.n.01'), Synset('spy.n.01')]
(以下略)
日本語WordNetを使ってみた例
>>> wp.synsets('リンゴ', lang='jpn')
[Synset('apple.n.01'), Synset('apple.n.02')]
>>> wp.synset('リンゴ', lang='jpn') <-- synsetSではなくsynsetの場合はダメ
TypeError: synset() got an unexpected keyword argument 'lang'
>>> wp.synsets('りんご', lang='jpn')
[] <-- ひらがなの'りんご'では登録されていない
>>> wn.synsets('ミカン', lang='jpn')[0]
Synset('orange.n.01') <-- 'ミカン'は1つだけ
>>> wn.synsets('リンゴ', lang='jpn')[0].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.25 <-- 経路距離メソッド path_simlarityを使ってみる。どちらも[0]の単一要素にして問うた
>>> wn.synsets('リンゴ', lang='jpn')[1].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.05263157894736842 <-- 'リンゴ'の2要素目を試してみた
>>> orange = wn.synsets('ミカン', lang='jpn')[0]
>>> orange.hypernyms() <-- [Synset('citrus.n.01')]
>>> orange.hyponyms()
[Synset('bitter_orange.n.02'), Synset('sweet_orange.n.01'), Synset('temple_orange.n.02')]
>>> orange.member_holonyms()
[]
>>> orange.root_hypernyms() <-- [Synset('entity.n.01')]
>>> apple = wn.synsets('リンゴ', lang='jpn')[0]
>>> orange.lowest_common_hypernyms(apple) <-- [Synset('edible_fruit.n.01')]
>>> wn.synset('orange.n.01').lowest_common_hypernyms(wn.synset('apple.n.01'))
[Synset('edible_fruit.n.01')]
>>> wn.lemmas('dpg', lang='jpn')
[]
>>> wn.lemmas('犬', lang='jpn')
[Lemma('dog.n.01.犬'), Lemma('spy.n.01.犬')]
>>> wn.synset('dog.n.01').lemmas('jpn')
[Lemma('dog.n.01.イヌ'), Lemma('dog.n.01.ドッグ'), Lemma('dog.n.01.洋犬'),
Lemma('dog.n.01.犬'), Lemma('dog.n.01.飼犬'), Lemma('dog.n.01.飼い犬')]
>>> [u.lemma_names('jpn') for u in list(wn.synsets('犬', lang='jpn'))]
[['イヌ', 'ドッグ', '洋犬', '犬', '飼犬', '飼い犬'],
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬',
'秘密捜査員', 'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']]
裏は、[[corpus reader:http://www.nltk.org/api/nltk.corpus.reader.html]]の
class nltk.corpus.reader.wordnet.WordNetCorpusReader(root, omw_reader)
のところに、omw_reader (omw=open multilingual wordnet) が追加されていること。
(これが新し目のバージョンが必要な理由)
「歴史的には」もともとBond先生らを中心にした研究の成果として[[日本語WordNet:http://compling.hss.ntu.edu.sg/wnja/]] として公開されていたものがあり、
[[ダウンロードページ:http://compling.hss.ntu.edu.sg/wnja/jpn/downloads.html]]も整備されていた。
また、本 Steven Bird, Ewan Klein, Edward Loper: Natural Language Processing with Python の翻訳「入門 自然言語処理」(2010年)に当たって、訳者の萩原正人氏らが第12章「Python による日本語自然言語処理」を追加した(この章はWebでも公開されている。[[Python による日本語自然言語処理:http://www.nltk.org/book-jp/ch12.html]])が、その中で日本語WordNetの使い方を取り上げている。この時はNLTKのWordNetリーダーの外側に自前のリーダーを作っていた(Example II.1 (12_1_5_jpwordnet.py))ため、それなりの手順が必要であった。 (ちなみに、このコードは、NLTKのWordNetCorpusReaderの__init__に(このomw対応の改変のために)パラメタ(まさにomw_reader)が追加されたため、そのままでは動かないようだ。)
その後、NLTK側にインターフェースを追加したようで、現在の簡単な形になっているようだ。
[[ノート/テキストマイニング]]~
&counter(); &lastmod();~
**Python/NLTKからWordNet 3.0を使ってみる [#i05aee4b]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。日本語対応のためには新しいバージョンが必要。
≫ [[ノート/テキストマイニング/NLTK]]
-インストールについて参照ページは [[Installing NLTK:http://www.nltk.org/install.html]]
-pip install -U nltk にて新しいバージョンをダウンロード
-同ページによるとデータもダウンロードの必要あり。[[Installing NLTK Data:http://www.nltk.org/data]]によると Interactive Installer でインストールできる。Pythonを起動して、
>>> import nltk
>>> nltk.download()
コマンドプロンプトが出るので、"all" を選んで全データをインストール。
実際に使っている様子は、[[HowToの中にあるサンプル:http://www.nltk.org/howto/wordnet.html]]を見るとよい。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')
NLTK/corpus/wordnet.pyの中に含まれているデモプログラムを抜き出して、単独で走るようにimportなどを追加したもの。
細かい説明は [[『入門 自然言語処理』2章 テキストコーパスと語彙資源へのアクセス (3):http://rn102.hatenablog.com/entry/2013/10/20/141409]]
######################################################################
# Demo
######################################################################
from nltk.corpus import wordnet
from nltk.corpus.reader import WordNetCorpusReader, WordNetICCorpusReader
def demo():
import nltk
print('loading wordnet')
wn = WordNetCorpusReader(nltk.data.find('corpora/wordnet'), None)
print('done loading')
S = wn.synset
L = wn.lemma
print('getting a synset for go')
move_synset = S('go.v.21')
print(move_synset.name(), move_synset.pos(), move_synset.lexname())
print(move_synset.lemma_names())
print(move_synset.definition())
print(move_synset.examples())
zap_n = ['zap.n.01']
zap_v = ['zap.v.01', 'zap.v.02', 'nuke.v.01', 'microwave.v.01']
def _get_synsets(synset_strings):
return [S(synset) for synset in synset_strings]
zap_n_synsets = _get_synsets(zap_n)
zap_v_synsets = _get_synsets(zap_v)
print(zap_n_synsets)
print(zap_v_synsets)
print("Navigations:")
print(S('travel.v.01').hypernyms())
print(S('travel.v.02').hypernyms())
print(S('travel.v.03').hypernyms())
print(L('zap.v.03.nuke').derivationally_related_forms())
print(L('zap.v.03.atomize').derivationally_related_forms())
print(L('zap.v.03.atomise').derivationally_related_forms())
print(L('zap.v.03.zap').derivationally_related_forms())
print(S('dog.n.01').member_holonyms())
print(S('dog.n.01').part_meronyms())
print(S('breakfast.n.1').hypernyms())
print(S('meal.n.1').hyponyms())
print(S('Austen.n.1').instance_hypernyms())
print(S('composer.n.1').instance_hyponyms())
print(S('faculty.n.2').member_meronyms())
print(S('copilot.n.1').member_holonyms())
print(S('table.n.2').part_meronyms())
print(S('course.n.7').part_holonyms())
print(S('water.n.1').substance_meronyms())
print(S('gin.n.1').substance_holonyms())
# 以下3行は、エラーが出る
# print(L('leader.n.1.leader')) # Have some error possibly in data?
# print(L('leader.n.1.leader').antonyms())
# print(L('increase.v.1.increase').antonyms())
print(S('snore.v.1').entailments())
print(S('heavy.a.1').similar_tos())
print(S('light.a.1').attributes())
print(S('heavy.a.1').attributes())
# print(L('English.a.1.English').pertainyms()) # Same error as above
print(S('person.n.01').root_hypernyms())
print(S('sail.v.01').root_hypernyms())
print(S('fall.v.12').root_hypernyms())
print(S('person.n.01').lowest_common_hypernyms(S('dog.n.01')))
print(S('woman.n.01').lowest_common_hypernyms(S('girlfriend.n.02')))
print(S('dog.n.01').path_similarity(S('cat.n.01')))
print(S('dog.n.01').lch_similarity(S('cat.n.01')))
print(S('dog.n.01').wup_similarity(S('cat.n.01')))
wnic = WordNetICCorpusReader(nltk.data.find('corpora/wordnet_ic'),
'.*\.dat')
ic = wnic.ic('ic-brown.dat')
print(S('dog.n.01').jcn_similarity(S('cat.n.01'), ic))
ic = wnic.ic('ic-semcor.dat')
print(S('dog.n.01').lin_similarity(S('cat.n.01'), ic))
print(S('code.n.03').topic_domains())
print(S('pukka.a.01').region_domains())
print(S('freaky.a.01').usage_domains())
if __name__ == '__main__':
demo()
実行結果は、
loading wordnet
done loading
getting a synset for go
move.v.15 v verb.competition
['move', 'go']
have a turn; make one's move in a game
['Can I go now?']
[Synset('zap.n.01')]
[Synset('zap.v.01'), Synset('zap.v.02'), Synset('nuke.v.01'), Synset('microwave.v.01')]
Navigations:
[]
[Synset('travel.v.03')]
[]
[Lemma('atomic_warhead.n.01.nuke')]
[Lemma('atomization.n.02.atomization')]
[Lemma('atomization.n.02.atomisation')]
[]
[Synset('canis.n.01'), Synset('pack.n.06')]
[Synset('flag.n.07')]
[Synset('meal.n.01')]
[Synset('banquet.n.02'), Synset('bite.n.04'), Synset('breakfast.n.01'),
Synset('brunch.n.01'), Synset('buffet.n.02'), Synset('dinner.n.01'), Synset('lunch.n.01'),
Synset('mess.n.04'), Synset('nosh-up.n.01'), Synset('picnic.n.03'),
Synset('ploughman's_lunch.n.01'), Synset('potluck.n.01'), Synset('refection.n.01'),
Synset('square_meal.n.01'), Synset('supper.n.01'), Synset('tea.n.02')]
[Synset('writer.n.01')]
[Synset('ambrose.n.01'), Synset('bach.n.01'), Synset('barber.n.01'),
Synset('bartok.n.01'), Synset('beethoven.n.01'), Synset('bellini.n.01'),
Synset('berg.n.02'), Synset('berlioz.n.01'), Synset('bernstein.n.01'),
Synset('bizet.n.01'), Synset('blitzstein.n.01'), Synset('bloch.n.01'),
Synset('borodin.n.01'), Synset('boulez.n.01'), Synset('brahms.n.01'),
Synset('britten.n.01'), Synset('bruch.n.01'), Synset('bruckner.n.01'),
Synset('byrd.n.01'), Synset('cage.n.03'), Synset('chavez.n.01'),
Synset('cherubini.n.01'), Synset('chopin.n.03'), Synset('copland.n.01'),
Synset('corelli.n.01'), Synset('couperin.n.01'), Synset('coward.n.02'),
Synset('czerny.n.01'), Synset('debussy.n.01'), Synset('delibes.n.01'),
Synset('delius.n.01'), Synset('donizetti.n.01'), Synset('dowland.n.01'),
Synset('dukas.n.01'), Synset('dvorak.n.01'), Synset('elgar.n.01'), Synset('enesco.n.01'),
Synset('falla.n.01'), Synset('franck.n.01'), Synset('gershwin.n.02'),
Synset('glinka.n.01'), Synset('gluck.n.01'), Synset('gounod.n.01'),
Synset('grainger.n.01'), Synset('grieg.n.01'), Synset('halevy.n.01'),
Synset('handel.n.01'), Synset('handy.n.01'), Synset('haydn.n.01'),
Synset('hindemith.n.01'), Synset('honegger.n.01'), Synset('humperdinck.n.01'),
Synset('ibert.n.01'), Synset('ives.n.01'), Synset('joachim.n.01'), Synset('joplin.n.02'),
Synset('kachaturian.n.01'), Synset('kern.n.01'), Synset('khachaturian.n.01'),
Synset('lambert.n.02'), Synset('lasso.n.01'), Synset('ledbetter.n.01'),
Synset('lehar.n.01'), Synset('liszt.n.01'), Synset('lloyd_webber.n.01'),
Synset('loewe.n.01'), Synset('lully.n.02'), Synset('macdowell.n.01'),
Synset('mahler.n.01'), Synset('massenet.n.01'), Synset('mendelssohn.n.01'),
Synset('menotti.n.01'), Synset('meyerbeer.n.01'), Synset('milhaud.n.01'),
Synset('monteverdi.n.01'), Synset('moore.n.01'), Synset('mozart.n.01'),
Synset('mussorgsky.n.01'), Synset('nielsen.n.01'), Synset('offenbach.n.01'),
Synset('orbison.n.01'), Synset('palestrina.n.01'), Synset('piston.n.01'),
Synset('porter.n.04'), Synset('poulenc.n.01'), Synset('prokofiev.n.01'),
Synset('puccini.n.01'), Synset('purcell.n.01'), Synset('rachmaninoff.n.01'),
Synset('rameau.n.01'), Synset('ravel.n.01'), Synset('reich.n.03'),
Synset('respighi.n.01'), Synset('rimsky-korsakov.n.01'), Synset('rodgers.n.01'),
Synset('romberg.n.01'), Synset('rossini.n.01'), Synset('rubinstein.n.02'), Synset('saint-saens.n.01'),
Synset('satie.n.01'), Synset('schnabel.n.01'), Synset('schonberg.n.01'),
Synset('schubert.n.01'), Synset('schumann.n.01'), Synset('schumann.n.02'),
Synset('scriabin.n.01'), Synset('segovia.n.01'), Synset('sessions.n.01'),
Synset('shostakovich.n.01'), Synset('sibelius.n.01'), Synset('smetana.n.01'),
Synset('sondheim.n.01'), Synset('sousa.n.01'), Synset('strauss.n.01'),
Synset('strauss.n.02'), Synset('strauss.n.03'), Synset('stravinsky.n.01'),
Synset('sullivan.n.05'), Synset('tallis.n.01'), Synset('taylor.n.01'),
Synset('tchaikovsky.n.01'), Synset('telemann.n.01'), Synset('thomson.n.01'),
Synset('varese.n.01'), Synset('vaughan_williams.n.01'), Synset('verdi.n.01'),
Synset('villa-lobos.n.01'), Synset('vivaldi.n.01'), Synset('wagner.n.02'),
Synset('walton.n.01'), Synset('weber.n.05'), Synset('weill.n.01'), Synset('wolf.n.02')]
[Synset('professor.n.01')]
[Synset('crew.n.01')]
[Synset('leg.n.03'), Synset('tabletop.n.01'), Synset('tableware.n.01')]
[Synset('meal.n.01')]
[Synset('hydrogen.n.01'), Synset('oxygen.n.01')]
[Synset('gin_and_it.n.01'), Synset('gin_and_tonic.n.01'), Synset('martini.n.01'), Synset('pink_lady.n.01')]
[Synset('sleep.v.01')]
[Synset('dense.s.03'), Synset('doughy.s.01'), Synset('heavier-than-air.s.01'), Synset('hefty.s.02'), Synset('massive.s.04'), Synset('non-buoyant.s.01'),
Synset('ponderous.s.02')]
[Synset('weight.n.01')]
[Synset('weight.n.01')]
[Synset('entity.n.01')]
[Synset('travel.v.01')]
[Synset('act.v.01'), Synset('fall.v.17')]
[Synset('organism.n.01')]
[Synset('woman.n.01')]
0.2
2.0281482472922856
0.8571428571428571
0.4497755285516739
0.8863288628086228
[Synset('computer_science.n.01')]
[Synset('india.n.01')]
[Synset('slang.n.02')]
***日本語の対応について [#y81c96c8]
いろいろとあったが、新しい目のバージョンのNLTKでは多言語サポートが入っている。
参照ページはBond先生らの [[Open Multilingual Wordnet:http://compling.hss.ntu.edu.sg/omw/]] で、日本語WordNetの研究の延長で多言語(からのリンク)にしたものらしい。
このページに記述されているようなデータやインターフェースは、NLTK(少なくとも3.2.4には)に入っているようだ。
使い方は、
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('鯨', lang='jpn')
[Synset('whale.n.02')]
>>> wn.synset('spy.n.01').lemma_names('jpn')
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬', '秘密捜査員',
'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']
というところ。
使い方の説明は NLTKのHOWTOsの [[wordnet HOWTO:http://www.nltk.org/howto/wordnet.html]] に例が出ている。曰く
The WordNet corpus reader gives access to the Open Multilingual WordNet, using ISO-639 language codes.
>>> sorted(wn.langs())
['als', 'arb', 'cat', 'cmn', 'dan', 'eng', 'eus', 'fas', 'fin', 'fra', 'fre', 'glg', 'heb', 'ind', 'ita', 'jpn', 'nno',
'nob', 'pol', 'por', 'spa', 'tha', 'zsm']
>>> wn.synsets(b'\xe7\x8a\xac'.decode('utf-8'), lang='jpn')
[Synset('dog.n.01'), Synset('spy.n.01')]
(以下略)
日本語WordNetを使ってみた例
>>> wp.synsets('リンゴ', lang='jpn')
[Synset('apple.n.01'), Synset('apple.n.02')]
>>> wp.synset('リンゴ', lang='jpn') <-- synsetSではなくsynsetの場合はダメ
TypeError: synset() got an unexpected keyword argument 'lang'
>>> wp.synsets('りんご', lang='jpn')
[] <-- ひらがなの'りんご'では登録されていない
>>> wn.synsets('ミカン', lang='jpn')[0]
Synset('orange.n.01') <-- 'ミカン'は1つだけ
>>> wn.synsets('リンゴ', lang='jpn')[0].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.25 <-- 経路距離メソッド path_simlarityを使ってみる。どちらも[0]の単一要素にして問うた
>>> wn.synsets('リンゴ', lang='jpn')[1].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.05263157894736842 <-- 'リンゴ'の2要素目を試してみた
>>> orange = wn.synsets('ミカン', lang='jpn')[0]
>>> orange.hypernyms() <-- [Synset('citrus.n.01')]
>>> orange.hyponyms()
[Synset('bitter_orange.n.02'), Synset('sweet_orange.n.01'), Synset('temple_orange.n.02')]
>>> orange.member_holonyms()
[]
>>> orange.root_hypernyms() <-- [Synset('entity.n.01')]
>>> apple = wn.synsets('リンゴ', lang='jpn')[0]
>>> orange.lowest_common_hypernyms(apple) <-- [Synset('edible_fruit.n.01')]
>>> wn.synset('orange.n.01').lowest_common_hypernyms(wn.synset('apple.n.01'))
[Synset('edible_fruit.n.01')]
>>> wn.lemmas('dpg', lang='jpn')
[]
>>> wn.lemmas('犬', lang='jpn')
[Lemma('dog.n.01.犬'), Lemma('spy.n.01.犬')]
>>> wn.synset('dog.n.01').lemmas('jpn')
[Lemma('dog.n.01.イヌ'), Lemma('dog.n.01.ドッグ'), Lemma('dog.n.01.洋犬'),
Lemma('dog.n.01.犬'), Lemma('dog.n.01.飼犬'), Lemma('dog.n.01.飼い犬')]
>>> [u.lemma_names('jpn') for u in list(wn.synsets('犬', lang='jpn'))]
[['イヌ', 'ドッグ', '洋犬', '犬', '飼犬', '飼い犬'],
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬',
'秘密捜査員', 'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']]
裏は、[[corpus reader:http://www.nltk.org/api/nltk.corpus.reader.html]]の
class nltk.corpus.reader.wordnet.WordNetCorpusReader(root, omw_reader)
のところに、omw_reader (omw=open multilingual wordnet) が追加されていること。
(これが新し目のバージョンが必要な理由)
「歴史的には」もともとBond先生らを中心にした研究の成果として[[日本語WordNet:http://compling.hss.ntu.edu.sg/wnja/]] として公開されていたものがあり、
[[ダウンロードページ:http://compling.hss.ntu.edu.sg/wnja/jpn/downloads.html]]も整備されていた。
また、本 Steven Bird, Ewan Klein, Edward Loper: Natural Language Processing with Python の翻訳「入門 自然言語処理」(2010年)に当たって、訳者の萩原正人氏らが第12章「Python による日本語自然言語処理」を追加した(この章はWebでも公開されている。[[Python による日本語自然言語処理:http://www.nltk.org/book-jp/ch12.html]])が、その中で日本語WordNetの使い方を取り上げている。この時はNLTKのWordNetリーダーの外側に自前のリーダーを作っていた(Example II.1 (12_1_5_jpwordnet.py))ため、それなりの手順が必要であった。 (ちなみに、このコードは、NLTKのWordNetCorpusReaderの__init__に(このomw対応の改変のために)パラメタ(まさにomw_reader)が追加されたため、そのままでは動かないようだ。)
その後、NLTK側にインターフェースを追加したようで、現在の簡単な形になっているようだ。
[[ノート/テキストマイニング]]~
&counter(); &lastmod();~
**Python/NLTKからWordNet 3.0を使ってみる [#i05aee4b]
[[nltk (Natural Language Took Kit):http://www.nltk.org/]]を使う。日本語対応のためには新しいバージョンが必要。
≫ [[ノート/テキストマイニング/NLTK]]
-インストールについて参照ページは [[Installing NLTK:http://www.nltk.org/install.html]]
-pip install -U nltk にて新しいバージョンをダウンロード
-同ページによるとデータもダウンロードの必要あり。[[Installing NLTK Data:http://www.nltk.org/data]]によると Interactive Installer でインストールできる。Pythonを起動して、
>>> import nltk
>>> nltk.download()
コマンドプロンプトが出るので、"all" を選んで全データをインストール。
実際に使っている様子は、[[HowToの中にあるサンプル:http://www.nltk.org/howto/wordnet.html]]を見るとよい。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')
NLTK/corpus/wordnet.pyの中に含まれているデモプログラムを抜き出して、単独で走るようにimportなどを追加したもの。
細かい説明は [[『入門 自然言語処理』2章 テキストコーパスと語彙資源へのアクセス (3):http://rn102.hatenablog.com/entry/2013/10/20/141409]]
######################################################################
# Demo
######################################################################
from nltk.corpus import wordnet
from nltk.corpus.reader import WordNetCorpusReader, WordNetICCorpusReader
def demo():
import nltk
print('loading wordnet')
wn = WordNetCorpusReader(nltk.data.find('corpora/wordnet'), None)
print('done loading')
S = wn.synset
L = wn.lemma
print('getting a synset for go')
move_synset = S('go.v.21')
print(move_synset.name(), move_synset.pos(), move_synset.lexname())
print(move_synset.lemma_names())
print(move_synset.definition())
print(move_synset.examples())
zap_n = ['zap.n.01']
zap_v = ['zap.v.01', 'zap.v.02', 'nuke.v.01', 'microwave.v.01']
def _get_synsets(synset_strings):
return [S(synset) for synset in synset_strings]
zap_n_synsets = _get_synsets(zap_n)
zap_v_synsets = _get_synsets(zap_v)
print(zap_n_synsets)
print(zap_v_synsets)
print("Navigations:")
print(S('travel.v.01').hypernyms())
print(S('travel.v.02').hypernyms())
print(S('travel.v.03').hypernyms())
print(L('zap.v.03.nuke').derivationally_related_forms())
print(L('zap.v.03.atomize').derivationally_related_forms())
print(L('zap.v.03.atomise').derivationally_related_forms())
print(L('zap.v.03.zap').derivationally_related_forms())
print(S('dog.n.01').member_holonyms())
print(S('dog.n.01').part_meronyms())
print(S('breakfast.n.1').hypernyms())
print(S('meal.n.1').hyponyms())
print(S('Austen.n.1').instance_hypernyms())
print(S('composer.n.1').instance_hyponyms())
print(S('faculty.n.2').member_meronyms())
print(S('copilot.n.1').member_holonyms())
print(S('table.n.2').part_meronyms())
print(S('course.n.7').part_holonyms())
print(S('water.n.1').substance_meronyms())
print(S('gin.n.1').substance_holonyms())
# 以下3行は、エラーが出る
# print(L('leader.n.1.leader')) # Have some error possibly in data?
# print(L('leader.n.1.leader').antonyms())
# print(L('increase.v.1.increase').antonyms())
print(S('snore.v.1').entailments())
print(S('heavy.a.1').similar_tos())
print(S('light.a.1').attributes())
print(S('heavy.a.1').attributes())
# print(L('English.a.1.English').pertainyms()) # Same error as above
print(S('person.n.01').root_hypernyms())
print(S('sail.v.01').root_hypernyms())
print(S('fall.v.12').root_hypernyms())
print(S('person.n.01').lowest_common_hypernyms(S('dog.n.01')))
print(S('woman.n.01').lowest_common_hypernyms(S('girlfriend.n.02')))
print(S('dog.n.01').path_similarity(S('cat.n.01')))
print(S('dog.n.01').lch_similarity(S('cat.n.01')))
print(S('dog.n.01').wup_similarity(S('cat.n.01')))
wnic = WordNetICCorpusReader(nltk.data.find('corpora/wordnet_ic'),
'.*\.dat')
ic = wnic.ic('ic-brown.dat')
print(S('dog.n.01').jcn_similarity(S('cat.n.01'), ic))
ic = wnic.ic('ic-semcor.dat')
print(S('dog.n.01').lin_similarity(S('cat.n.01'), ic))
print(S('code.n.03').topic_domains())
print(S('pukka.a.01').region_domains())
print(S('freaky.a.01').usage_domains())
if __name__ == '__main__':
demo()
実行結果は、
loading wordnet
done loading
getting a synset for go
move.v.15 v verb.competition
['move', 'go']
have a turn; make one's move in a game
['Can I go now?']
[Synset('zap.n.01')]
[Synset('zap.v.01'), Synset('zap.v.02'), Synset('nuke.v.01'), Synset('microwave.v.01')]
Navigations:
[]
[Synset('travel.v.03')]
[]
[Lemma('atomic_warhead.n.01.nuke')]
[Lemma('atomization.n.02.atomization')]
[Lemma('atomization.n.02.atomisation')]
[]
[Synset('canis.n.01'), Synset('pack.n.06')]
[Synset('flag.n.07')]
[Synset('meal.n.01')]
[Synset('banquet.n.02'), Synset('bite.n.04'), Synset('breakfast.n.01'),
Synset('brunch.n.01'), Synset('buffet.n.02'), Synset('dinner.n.01'), Synset('lunch.n.01'),
Synset('mess.n.04'), Synset('nosh-up.n.01'), Synset('picnic.n.03'),
Synset('ploughman's_lunch.n.01'), Synset('potluck.n.01'), Synset('refection.n.01'),
Synset('square_meal.n.01'), Synset('supper.n.01'), Synset('tea.n.02')]
[Synset('writer.n.01')]
[Synset('ambrose.n.01'), Synset('bach.n.01'), Synset('barber.n.01'),
Synset('bartok.n.01'), Synset('beethoven.n.01'), Synset('bellini.n.01'),
Synset('berg.n.02'), Synset('berlioz.n.01'), Synset('bernstein.n.01'),
Synset('bizet.n.01'), Synset('blitzstein.n.01'), Synset('bloch.n.01'),
Synset('borodin.n.01'), Synset('boulez.n.01'), Synset('brahms.n.01'),
Synset('britten.n.01'), Synset('bruch.n.01'), Synset('bruckner.n.01'),
Synset('byrd.n.01'), Synset('cage.n.03'), Synset('chavez.n.01'),
Synset('cherubini.n.01'), Synset('chopin.n.03'), Synset('copland.n.01'),
Synset('corelli.n.01'), Synset('couperin.n.01'), Synset('coward.n.02'),
Synset('czerny.n.01'), Synset('debussy.n.01'), Synset('delibes.n.01'),
Synset('delius.n.01'), Synset('donizetti.n.01'), Synset('dowland.n.01'),
Synset('dukas.n.01'), Synset('dvorak.n.01'), Synset('elgar.n.01'), Synset('enesco.n.01'),
Synset('falla.n.01'), Synset('franck.n.01'), Synset('gershwin.n.02'),
Synset('glinka.n.01'), Synset('gluck.n.01'), Synset('gounod.n.01'),
Synset('grainger.n.01'), Synset('grieg.n.01'), Synset('halevy.n.01'),
Synset('handel.n.01'), Synset('handy.n.01'), Synset('haydn.n.01'),
Synset('hindemith.n.01'), Synset('honegger.n.01'), Synset('humperdinck.n.01'),
Synset('ibert.n.01'), Synset('ives.n.01'), Synset('joachim.n.01'), Synset('joplin.n.02'),
Synset('kachaturian.n.01'), Synset('kern.n.01'), Synset('khachaturian.n.01'),
Synset('lambert.n.02'), Synset('lasso.n.01'), Synset('ledbetter.n.01'),
Synset('lehar.n.01'), Synset('liszt.n.01'), Synset('lloyd_webber.n.01'),
Synset('loewe.n.01'), Synset('lully.n.02'), Synset('macdowell.n.01'),
Synset('mahler.n.01'), Synset('massenet.n.01'), Synset('mendelssohn.n.01'),
Synset('menotti.n.01'), Synset('meyerbeer.n.01'), Synset('milhaud.n.01'),
Synset('monteverdi.n.01'), Synset('moore.n.01'), Synset('mozart.n.01'),
Synset('mussorgsky.n.01'), Synset('nielsen.n.01'), Synset('offenbach.n.01'),
Synset('orbison.n.01'), Synset('palestrina.n.01'), Synset('piston.n.01'),
Synset('porter.n.04'), Synset('poulenc.n.01'), Synset('prokofiev.n.01'),
Synset('puccini.n.01'), Synset('purcell.n.01'), Synset('rachmaninoff.n.01'),
Synset('rameau.n.01'), Synset('ravel.n.01'), Synset('reich.n.03'),
Synset('respighi.n.01'), Synset('rimsky-korsakov.n.01'), Synset('rodgers.n.01'),
Synset('romberg.n.01'), Synset('rossini.n.01'), Synset('rubinstein.n.02'), Synset('saint-saens.n.01'),
Synset('satie.n.01'), Synset('schnabel.n.01'), Synset('schonberg.n.01'),
Synset('schubert.n.01'), Synset('schumann.n.01'), Synset('schumann.n.02'),
Synset('scriabin.n.01'), Synset('segovia.n.01'), Synset('sessions.n.01'),
Synset('shostakovich.n.01'), Synset('sibelius.n.01'), Synset('smetana.n.01'),
Synset('sondheim.n.01'), Synset('sousa.n.01'), Synset('strauss.n.01'),
Synset('strauss.n.02'), Synset('strauss.n.03'), Synset('stravinsky.n.01'),
Synset('sullivan.n.05'), Synset('tallis.n.01'), Synset('taylor.n.01'),
Synset('tchaikovsky.n.01'), Synset('telemann.n.01'), Synset('thomson.n.01'),
Synset('varese.n.01'), Synset('vaughan_williams.n.01'), Synset('verdi.n.01'),
Synset('villa-lobos.n.01'), Synset('vivaldi.n.01'), Synset('wagner.n.02'),
Synset('walton.n.01'), Synset('weber.n.05'), Synset('weill.n.01'), Synset('wolf.n.02')]
[Synset('professor.n.01')]
[Synset('crew.n.01')]
[Synset('leg.n.03'), Synset('tabletop.n.01'), Synset('tableware.n.01')]
[Synset('meal.n.01')]
[Synset('hydrogen.n.01'), Synset('oxygen.n.01')]
[Synset('gin_and_it.n.01'), Synset('gin_and_tonic.n.01'), Synset('martini.n.01'), Synset('pink_lady.n.01')]
[Synset('sleep.v.01')]
[Synset('dense.s.03'), Synset('doughy.s.01'), Synset('heavier-than-air.s.01'), Synset('hefty.s.02'), Synset('massive.s.04'), Synset('non-buoyant.s.01'),
Synset('ponderous.s.02')]
[Synset('weight.n.01')]
[Synset('weight.n.01')]
[Synset('entity.n.01')]
[Synset('travel.v.01')]
[Synset('act.v.01'), Synset('fall.v.17')]
[Synset('organism.n.01')]
[Synset('woman.n.01')]
0.2
2.0281482472922856
0.8571428571428571
0.4497755285516739
0.8863288628086228
[Synset('computer_science.n.01')]
[Synset('india.n.01')]
[Synset('slang.n.02')]
***日本語の対応について [#y81c96c8]
いろいろとあったが、新しい目のバージョンのNLTKでは多言語サポートが入っている。
参照ページはBond先生らの [[Open Multilingual Wordnet:http://compling.hss.ntu.edu.sg/omw/]] で、日本語WordNetの研究の延長で多言語(からのリンク)にしたものらしい。
このページに記述されているようなデータやインターフェースは、NLTK(少なくとも3.2.4には)に入っているようだ。
使い方は、
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('鯨', lang='jpn')
[Synset('whale.n.02')]
>>> wn.synset('spy.n.01').lemma_names('jpn')
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬', '秘密捜査員',
'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']
というところ。
使い方の説明は NLTKのHOWTOsの [[wordnet HOWTO:http://www.nltk.org/howto/wordnet.html]] に例が出ている。曰く
The WordNet corpus reader gives access to the Open Multilingual WordNet, using ISO-639 language codes.
>>> sorted(wn.langs())
['als', 'arb', 'cat', 'cmn', 'dan', 'eng', 'eus', 'fas', 'fin', 'fra', 'fre', 'glg', 'heb', 'ind', 'ita', 'jpn', 'nno',
'nob', 'pol', 'por', 'spa', 'tha', 'zsm']
>>> wn.synsets(b'\xe7\x8a\xac'.decode('utf-8'), lang='jpn')
[Synset('dog.n.01'), Synset('spy.n.01')]
(以下略)
日本語WordNetを使ってみた例
>>> wp.synsets('リンゴ', lang='jpn')
[Synset('apple.n.01'), Synset('apple.n.02')]
>>> wp.synset('リンゴ', lang='jpn') <-- synsetSではなくsynsetの場合はダメ
TypeError: synset() got an unexpected keyword argument 'lang'
>>> wp.synsets('りんご', lang='jpn')
[] <-- ひらがなの'りんご'では登録されていない
>>> wn.synsets('ミカン', lang='jpn')[0]
Synset('orange.n.01') <-- 'ミカン'は1つだけ
>>> wn.synsets('リンゴ', lang='jpn')[0].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.25 <-- 経路距離メソッド path_simlarityを使ってみる。どちらも[0]の単一要素にして問うた
>>> wn.synsets('リンゴ', lang='jpn')[1].path_similarity(wn.synsets('ミカン', lang='jpn')[0])
0.05263157894736842 <-- 'リンゴ'の2要素目を試してみた
>>> orange = wn.synsets('ミカン', lang='jpn')[0]
>>> orange.hypernyms() <-- [Synset('citrus.n.01')]
>>> orange.hyponyms()
[Synset('bitter_orange.n.02'), Synset('sweet_orange.n.01'), Synset('temple_orange.n.02')]
>>> orange.member_holonyms()
[]
>>> orange.root_hypernyms() <-- [Synset('entity.n.01')]
>>> apple = wn.synsets('リンゴ', lang='jpn')[0]
>>> orange.lowest_common_hypernyms(apple) <-- [Synset('edible_fruit.n.01')]
>>> wn.synset('orange.n.01').lowest_common_hypernyms(wn.synset('apple.n.01'))
[Synset('edible_fruit.n.01')]
>>> wn.lemmas('dpg', lang='jpn')
>>> wn.lemmas('dog', lang='jpn')
[]
>>> wn.lemmas('犬', lang='jpn')
[Lemma('dog.n.01.犬'), Lemma('spy.n.01.犬')]
>>> wn.synset('dog.n.01').lemmas('jpn')
[Lemma('dog.n.01.イヌ'), Lemma('dog.n.01.ドッグ'), Lemma('dog.n.01.洋犬'),
Lemma('dog.n.01.犬'), Lemma('dog.n.01.飼犬'), Lemma('dog.n.01.飼い犬')]
>>> [u.lemma_names('jpn') for u in list(wn.synsets('犬', lang='jpn'))]
[['イヌ', 'ドッグ', '洋犬', '犬', '飼犬', '飼い犬'],
['いぬ', 'スパイ', '回者', '回し者', '密偵', '工作員', '廻者', '廻し者', '探', '探り', '犬',
'秘密捜査員', 'まわし者', '諜報員', '諜者', '間者', '間諜', '隠密']]
裏は、[[corpus reader:http://www.nltk.org/api/nltk.corpus.reader.html]]の
class nltk.corpus.reader.wordnet.WordNetCorpusReader(root, omw_reader)
のところに、omw_reader (omw=open multilingual wordnet) が追加されていること。
(これが新し目のバージョンが必要な理由)
「歴史的には」もともとBond先生らを中心にした研究の成果として[[日本語WordNet:http://compling.hss.ntu.edu.sg/wnja/]] として公開されていたものがあり、
[[ダウンロードページ:http://compling.hss.ntu.edu.sg/wnja/jpn/downloads.html]]も整備されていた。
また、本 Steven Bird, Ewan Klein, Edward Loper: Natural Language Processing with Python の翻訳「入門 自然言語処理」(2010年)に当たって、訳者の萩原正人氏らが第12章「Python による日本語自然言語処理」を追加した(この章はWebでも公開されている。[[Python による日本語自然言語処理:http://www.nltk.org/book-jp/ch12.html]])が、その中で日本語WordNetの使い方を取り上げている。この時はNLTKのWordNetリーダーの外側に自前のリーダーを作っていた(Example II.1 (12_1_5_jpwordnet.py))ため、それなりの手順が必要であった。 (ちなみに、このコードは、NLTKのWordNetCorpusReaderの__init__に(このomw対応の改変のために)パラメタ(まさにomw_reader)が追加されたため、そのままでは動かないようだ。)
その後、NLTK側にインターフェースを追加したようで、現在の簡単な形になっているようだ。