前提・実現したいこと
現在私は文節分けした単語から言語情報を取り出そうとしています。
取り出そうとしているのは品詞、単語の原型、類義語です。
品詞、単語の原型はMeCabを使いなんとか取り出すことが出来ました。
しかし類義語はMeCabでは取り出せないのでネットで見つけたWordNetを利用した類義語を返してくれる関数を
自分のソースに組み込みました。
もともと、入力は短い文(1~5個の文節)にしているので文節分けした単語は2次元配列の中に格納しています。
2次元配列のまま品詞、単語の原型は格納することが出来ました。
ここからが本題なのですが類義語を返していくれる関数(すでに返す文字列は配列に格納済み)をfor文の中に組み込み
品詞、単語の原型の後に統合したいです。
しかしプログラムを回そうとするとものすごい量の類義語情報が2次元配列の一つの要素に格納されてしまい困っています。
また最後にresultwpに格納されるはずの類義語情報がNoneになってしまいます。
ex} resultwp[1] = ["名詞”,”月”,"moon"...]
こんな感じになることが理想です。
解決方法がわかる方がいらっしゃれば教えて頂けたら幸いです。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
エラーメッセージ
特にエラーは出ていません。
途中ちょっとしたエラーのようなメッセージが出ますがコードは動きます
該当のソースコード
Python
1import sqlite3 2import MeCab 3import csv 4 5list = [] 6list2 = [] 7resultw = [] 8resultwp = [] 9a = [] 10conn = sqlite3.connect("C:\Users\hoitori\Desktop\thesauras\wnjpn.db") 11cur = conn.execute("select name from sqlite_master where type='table'") 12 13def SearchSimilarWords(word): 14 x = [] 15 16 # 問い合わせしたい単語がWordnetに存在するか確認する 17 cur = conn.execute("select wordid from word where lemma='%s'" % word) 18 word_id = 99999999 #temp 19 for row in cur: 20 word_id = row[0] 21 22 # Wordnetに存在する語であるかの判定 23 24 if word_id==99999999: 25 print(["なし"]) 26 return 27 #else: 28 #print("【「%s」の類似語を出力します】\n" % word) 29 30 # 入力された単語を含む概念を検索する 31 cur = conn.execute("select synset from sense where wordid='%s'" % word_id) 32 synsets = [] 33 for row in cur: 34 synsets.append(row[0]) 35 36 # 概念に含まれる単語を検索して画面出力する 37 no = 1 38 for synset in synsets: 39 cur1 = conn.execute("select name from synset where synset='%s'" % synset) 40 #for row1 in cur1: 41 #print("%sつめの概念 : %s" %(no, row1[0])) 42 cur2 = conn.execute("select def from synset_def where (synset='%s' and lang='jpn')" % synset) 43 sub_no = 1 44 for row2 in cur2: 45 #print("意味%s : %s" %(sub_no, row2[0])) 46 sub_no += 1 47 cur3 = conn.execute("select wordid from sense where (synset='%s' and wordid!=%s)" % (synset,word_id)) 48 sub_no = 1 49 for row3 in cur3: 50 target_word_id = row3[0] 51 cur3_1 = conn.execute("select lemma from word where wordid=%s" % target_word_id) 52 for row3_1 in cur3_1: 53 #print("類義語%s : %s" % (sub_no, row3_1[0]),end="") 54 x.append(row3_1[0]) 55 #print(row3_1[0],end="") 56 sub_no += 1 57 #print("\n") 58 no += 1 59 print(x) 60 61 62 63 64 65import MeCab 66import csv 67list = [] 68list2 = [] 69resultw = [] 70resultwp = [] 71 72 73with open("C:\Users\hoitori\Desktop\text.csv", "r", newline='', encoding="utf-8")as rf: 74 csv.reader(rf, lineterminator="\n") 75 for row in rf: 76 list.append(row) 77 78for i in range(len(list)): 79 list2.append(list[i].replace("\r\n",""))#改行コードを取り除く 80#形態素解析結果を2次元配列に格納する関数 81def mecab_list(text): 82 tagger = MeCab.Tagger("-Ochasen") 83 tagger.parse('') 84 node = tagger.parseToNode(text) 85 word_class = [] 86 while node: 87 word = node.surface 88 wclass = node.feature.split(',') 89 if wclass[0] != u'BOS/EOS': 90 if wclass[6] == None: 91 word_class.append((word,wclass[0],wclass[1],wclass[2],"")) 92 else: 93 word_class.append((word,wclass[0],wclass[1],wclass[2],wclass[6])) 94 node = node.next 95 return word_class 96 97for i in range(len(list2)): 98 result = mecab_list(list2[i]) 99 resultw.append(result) 100 101 102 103for j in range(len(resultw)): 104 resultwp.append([])#空の配列を作る 105 a.append([]) 106 for k in range(len(resultw[j])): 107 108 resultwp[j].append(resultw[j][k][1])#品詞 109 resultwp[j].append(resultw[j][k][4])#原型 110 a[j] = SearchSimilarWords(resultw[j][k][4]) 111 resultwp[j].append(a[j]) 112 113 114print(resultwp[2])
試したこと
初めappendで試しましたがSearchSimilarWords("text")の関数を()で囲むとよくないのは何となくわかりました。
なので先に別のaという2次元配列に突っ込んでからresultwpに代入しようとしましたが
うまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
python3.7/win10/Anaconda3/VSCode
プログラム初心者のため配列の名前など分かりづらいかもしれません
回答1件
あなたの回答
tips
プレビュー