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

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

ただいまの
回答率

89.69%

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

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 647

takich

score 9

  •   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'

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • quiqui

    2018/10/30 19:15

    最低限、コードは読めるようにしましょう。 https://teratail.com/help/question-tips#questionTips3-5-1 このコードをどのようにして書いたのか? を書かないのはなぜですか。

    キャンセル

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

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

  • ただいまの回答率 89.69%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る