質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

1830閲覧

wordnetで単語間の類似度を求めたいのですが・・・

takich

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/10/30 09:51

jwn_driver.py

fin1 = 'TagExamples.txt' #入力ファイル1
fin2 = 'WordExamples.txt' #入力ファイル2
fout = 'Output.txt' #出力ファイル

import sim
wordLists = sim.makeWordLists(fin1,fin2) #単語リストを作成
synLists = sim.convWords2Synsets(wordLists[0], wordLists[1]) #概念リストを作成
simMatrix = sim.calcSim(synLists[0], synLists[1]) #類似度行列を作成
sim.writeSim(wordLists[0],wordLists[1],simMatrix,fout) #ファイルへの書き込み

sim.py

import codecs

def makeWordLists(fin1,fin2):
""" ファイル名を2つ受け取って単語リストのリストを返す """
fins = [fin1, fin2]
wordLists = [[ ], [ ]]
for i in [0,1]:
f=codecs.open(fins[i], encoding="utf-8")
for line in f:
wordLists[i].append(line.strip("\r\n").strip("\n"))
f.close()
return wordLists

def convWords2Synsets(wordList1, wordList2):
""" 単語リストを2つ受け取って概念リストのリストを返す """
import jwn_corpusreader
jwn = jwn_corpusreader.JapaneseWordNetCorpusReader('C:/Users/NADA21/Documents/wordnet', 'C:/Users/NADA21/Documents/wnjpn-ok.tab') #英語WordNetと日本語WordNetを指定する
synLists = [[ ],[ ]]
wordLists = [wordList1, wordList2]
for i in [0,1]:
for j in range(len(wordLists[i])):
synLists[i].append(jwn.synsets(wordLists[i][j]))
return synLists

def calcSim(synList1,synList2):
""" 概念リストを2つ受け取って類似度の行列を返す """
import numpy as np
simMatrix = np.zeros( (len(synList1), len(synList2)))
for i in range(len(synList1)):
for j in range(len(synList2)):
sims = [ ]
for syn1 in synList1[i]:
for syn2 in synList2[j]:
sims.append(syn1.path_similarity(syn2))
simMatrix[i,j] = max(sims)
return simMatrix

def writeSim(wordList1, wordList2, simMatrix,fout):
""" 単語リストを2つと類似度行列とファイル名を受け取ってファイルに出力する """
f = codecs.open(fout,'w', encoding="utf-8")
for i in range(len(wordList1)):
for j in range(len(wordList2)):
f.write(wordList1[i] + "-" + wordList2[j] +": " + str(simMatrix[i][j])+"\r\n")
f.close()

jwn_corpusreader.py

from nltk.corpus.reader.wordnet import WordNetCorpusReader
class JapaneseWordNetCorpusReader(WordNetCorpusReader):
def init(self, root, filename):
WordNetCorpusReader.init(self, root)
import codecs
f=codecs.open(filename, encoding="utf-8")
self._jword2offset = {}
for line in f:
_cells = line.strip().split('\t')
_offset_pos = _cells[0]
_word = _cells[1]
if len(_cells)>2: _tag = _cells[2]
_offset, _pos = _offset_pos.split('-')
try:
self._jword2offset[_word].append({'offset': int(_offset), 'pos': _pos})
except:
self._jword2offset[_word]=[{'offset': int(_offset), 'pos': _pos}]
def synsets(self, word):
if word in self._jword2offset:
results = [ ]
for offset in (self._jword2offset[word]):
results.append(WordNetCorpusReader._synset_from_pos_and_offset(
self, offset['pos'], offset['offset']
))
return results
else:
return None

エラー文

Traceback (most recent call last):
File "C:\Users***\Documents\jwn_driver.py", line 10, in <module>
synLists = sim.convWords2Synsets(wordLists[0], wordLists[1]) #概念リストを作成
File "C:\Users***\Documents\sim.py", line 17, in convWords2Synsets
jwn = jwn_corpusreader.JapaneseWordNetCorpusReader('C:/Users//Documents/wordnet', 'C:/Users//Documents/wnjpn-ok.tab') #英語WordNetと日本語WordNetを指定する
File "C:\Users***\Documents\jwn_corpusreader.py", line 8, in init
WordNetCorpusReader.init(self, root)
TypeError: init() missing 1 required positional argument: 'omw_reader'

というエラーが出てきてどこをどう直したら良いのかわかりません。
非常に長くなってしまい申し訳ございません。
良ければ教えていただけないでしょうか・・・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問