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

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

新規登録して質問してみよう
ただいま回答率
85.48%
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

4220閲覧

python defで定義した関数をfor文の中で使いたい

hoitori-

総合スコア4

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/01/04 13:07

前提・実現したいこと

現在私は文節分けした単語から言語情報を取り出そうとしています。
取り出そうとしているのは品詞、単語の原型、類義語です。
品詞、単語の原型は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
プログラム初心者のため配列の名前など分かりづらいかもしれません

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

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

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

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

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

meg_

2020/01/04 13:18

「途中ちょっとしたエラーのようなメッセージが出ますが」こちらも質問に追記しましょう。
meg_

2020/01/04 13:22

「しかしプログラムを回そうとするとものすごい量の類義語情報が2次元配列の一つの要素に格納されてしまい」の状況が分かりません。関数:mecab_listは完成済なのですか?
hoitori-

2020/01/04 13:47

返信ありがとうございます。 エラーメッセージについては最初にmglearnはもう少しで使えなくなるよとおうものと関数:SearchSimilarWordsの出力結果を必要ない部分を消したときに出たものです。 関数:Mecablistは関数外で出力の結果をいじってますが関数自体は完成しています。
meg_

2020/01/05 02:09

おそらくそれはエラーではなくWarningでしょう。
hoitori-

2020/01/05 10:16

はい、mglearnのwarningです。 自分の実現したいことはglobal変数を使い解決出来ました。
guest

回答1

0

自己解決

def関数内にgroal変数を入れ、関数外でもリストに格納できるようにする。

投稿2020/01/05 10:19

hoitori-

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問