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

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

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

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

Python

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

Q&A

解決済

1回答

415閲覧

二次元配列のデータの変換

rrrrrrrry

総合スコア20

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/09/11 09:30

前提・実現したいこと

実現したいこと:二次元配列のデータの変換

apiを利用して、データを二次元配列に変換し保存しています。このデータをn-gram解析したいためテキストデータにするか、このまま効率の良いngramを実装するかの意見を頂戴したく質問させていただきました。
textデータをngramにするプログラムは持っているため、それを利用するのが時間効率的には早いのですが、このプログラムに少し書き足せば、ngramが実装できるのであればその方法も教えていただきたいです。

ソースコードと結果を載せさせていただきます。

該当のソースコード

Python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3import sys 4import requests 5import urllib 6import json 7import re #正規表現で特定のワードを検索 8 9menu_name = "とんかつ" 10 11def gnavi_api(): 12 keyid = "" 13 url = "https://api.gnavi.co.jp/PhotoSearchAPI/v3/" 14 #input("メニュー名を入力してください:") 15 encoding = 'utf-8' 16 query = [ 17 ("format", "json"), 18 ("keyid", keyid), 19 ("menu_name", menu_name.encode(encoding)), 20 ("hit_per_page", 50), # default:15, max:50 21 ("offset", 1), # 検索開始位置(デフォルト:1) 22 ] 23 24 # Generate URL. 25 url += "?{0}".format(urllib.parse.urlencode(query)) 26 27 # Execute API 28 try: 29 result = urllib.request.urlopen(url).read() 30 return result 31 except: 32 raise Exception("APIアクセスに失敗しました。") 33 34def parse_json(json_f): 35 # parse json 36 parsed_json = json.loads(json_f) 37 38 # Check error. 39 if 'error' in parsed_json: 40 if 'message' in parsed_json: 41 raise Exception('{0}'.format(parsed_json['message'])) 42 else: 43 raise Exception('データ取得に失敗しました') 44 45 # Save json. 46 with open('output.json', 'w') as f: 47 json.dump(parsed_json, f) 48 49 # 該当件数 50 total_hit_count = parsed_json['response'].get('total_hit_count', 0) 51 52 # 1回のリクエストで得る最大投稿件数(デフォルト:15、上限:50) 53 hit_per_page = parsed_json['response'].get('hit_per_page', 0) 54 55 # ヒット件数が0以下なら終了 56 if total_hit_count <= 0 or hit_per_page <= 0: 57 raise Exception("指定した内容ではヒットしませんでした。") 58 59 # ヒット件数表示 60 print("{0}件ヒットしました。".format(min(total_hit_count, hit_per_page))) 61 62 #input_num = int(input("追加で取得するコメントの文章数を入力してください: ")) 63 64 f = open('answer.txt', 'w') 65 66 line = [] 67 # 応援口コミデータ取得 68 for (_, seq) in enumerate(parsed_json['response']): 69 70 try: 71 photo = parsed_json["response"]["{0}".format(seq)]["photo"] 72 except: 73 continue 74 75 # コメント 76 if(photo.get('comment', None)): 77 userComment = photo.get('comment') 78 removeCharacters = str.maketrans({ 79 '\r': '', 80 '\n': '', 81 '\t': '' 82 }) 83 userComment = userComment.translate(removeCharacters) 84 commentLines = re.split('。|!|♪', userComment) #とりあえず'。'と'!'と'♪'(この部分は記号に改善する必要あり)で分割 85 REPEAT = 3 86 for i, commentLine in enumerate(commentLines): 87 if menu_name in commentLine: 88 line.append([commentLine]) 89 90 offset = 1 91 while True: 92 # マイナスのindexにならないようにする 93 if i - offset >= 0: 94 tmp = commentLines[i-offset] 95 else: 96 tmp = "" 97 line[-1].append(tmp) 98 99 ''' 100 # menu_nameが含まれたら探索を終了する終了条件(必要ない) 101 if (any(menu_name in t for t in line[-1][1:]) 102 and (offset >= REPEAT) 103 ): 104 break 105 ''' 106 107 # プラス側のインデックスは例外処理で対処 108 try: 109 tmp = commentLines[i+offset] 110 except IndexError: 111 tmp = "" 112 line[-1].append(tmp) 113 114 ''' 115 # menu_nameが含まれたら探索を終了する終了条件(必要ない) 116 if (any(menu_name in t for t in line[-1][1:]) 117 and (offset >= REPEAT) 118 ): 119 break 120 ''' 121 122 # 終了条件 123 if offset == REPEAT: 124 break 125 126 offset += 1 127 128 #改行区切りで出力 129 #f.write("\n".join(line[0])) #lineはリストのリストになっているはず(?) 130 print("キーワードが含まれる文章は{0}件ヒットしました。".format(len(line))) 131 print(line) 132 f.write("\n".join(line)) 133 f.close() 134 135def main(): 136 try: 137 result = gnavi_api() 138 parse_json(result) 139 except Exception as e: 140 print(e) 141 142if __name__ == '__main__': 143 sys.exit(main()) 144

二次元配列の結果

[['ソースではなくしょっぱく味付けされたキャベツでいただく風変わりなとんかつ', '', 'シメはお茶をかけてお茶漬けにしてサッパリと', '', '', '', ''], ['日本人大好き黒豚とんかつ', '', '', '', '', '', ''], ['厚切りとんかつ', '', '食べ応え満点', '', '', '', ''], ['わらじとんかつは大きさも味のよさも横綱級', '横綱の豚が目印のお店', '名古屋にきたら立ち寄るべし', '', '', '', ''], ['この日はひれとんかつをいただきました', '', 'お肉もとても柔らかいし、とてもボリュームがあり、お値段以上の満足度でした', '', 'でももうちょっと味噌だれがほしかったかな…次は味噌だれとソースのハーフ&ハーフという贅沢メニューにトライしようかな~っと思っています☆', '', ''], ['ジューシーなとんかつ', '', 'ボリュームも丁度良くて美味', '', '', '', ''], ['リーズナブルでガッツりととんかつが食べられます', '', '', '', '', '', ''], ['とんかつが食べたくなるなら絶対ココ', '', 'お肉もジューシーです', '', '', '', ''], ['普通のとんかつソースも選べましたがやはり味噌で食べました', '初味噌かつ', '', '', '', '', ''], ['矢場とんと言えば、やっぱり「わらじとんかつ」でしょう', '', '独特のソースがたまりません', '', 'かなりのボリュームなのにペロリです', '', ''], ['ボリューム満点のミルフィーユのとんかつ', '', 'あっさりと食べられました', '', '', '', ''], ['とんかつで有名な「かっぱ」のお手頃・ちょうど良い量のトンカツのセットと言えば「ミニとんかつ定食」', '', 'ミニと言っても十分な大きさがあり、ライスと千切りキャベツ、ポテト&マカロニサラダとお味噌汁がついています', '', 'ソースはカレー風味に感じ、スパイシーで、サクサクの衣に熱々のお肉がとても美味しかったです', '', 'ちなみに名代とんかつの単品は900円です'], ['ちなみに名代とんかつの単品は900円です', 'ソースはカレー風味に感じ、スパイシーで、サクサクの衣に熱々のお肉がとても美味しかったです', '', 'ミニと言っても十分な大きさがあり、ライスと千切りキャベツ、ポテト&マカロニサラダとお味噌汁がついています', '', 'とんかつで有名な「かっぱ」のお手頃・ちょうど良い量のトンカツのセットと言えば「ミニとんかつ定食」', ''], ['看板通りおすすめのとんかつが嬉しい定食に', '', 'とんかつは肉にコダワリが有るらしいが、揚げ油がサッパリしているので、良質の豚肉の味がしっかりと味わえる', '', 'ごはん、味噌汁、キャベツはお代わり自由', '', '味噌汁は+50円で豚汁に変更出来るのも嬉しい'], ['とんかつは肉にコダワリが有るらしいが、揚げ油がサッパリしているので、良質の豚肉の味がしっかりと味わえる', '看板通りおすすめのとんかつが嬉しい定食に', 'ごはん、味噌汁、キャベツはお代わり自由', '', '味噌汁は+50円で豚汁に変更出来るのも嬉しい', '', ''], ['名古屋名物の味噌のソースがかかった巨大なとんかつです', '', '味が濃い目で、白いご飯がすすみます', '', 'お肉はとてもやわらかいです', '', 'おなかをペコペコにしていきたいお店です'], ['とんかつがかなりさくさく感があり、お肉が柔らかくて、ルーとの相性がいいですよね', 'なんと言ってもボリューム満点なところがいいですね', '', '', '', '', ''], ['1350円と少々値段はしますが今まで食べたとんかつの中で一番美味しいです', '', '', '', '', '', ''], ['とんかつのお茶漬けは、賛否両論がありそうかも', 'すずや名物の「とん茶」、画像は「大サイズ」\u3000食べ方は、初めに普通に食べて残り3切れぐらいになったらお茶漬けにします', '?すずやに行ったら、1度は注文したいメニューだと思います', '', '', '', ''], ['ちょっとレトロな店内で、とんかつをお茶漬けにするなんて、と過去にショックを受けたメニューのひとつです', '', '最初は鉄板に乗ったそのままで、次にほうじ茶をかけてお茶漬けにして', '', 'ごはん、キャベツがおかわり自由なので足りない人は追加できます', '', 'さくさくのとんかつは、やっぱりできたてがおいしい'], ['さくさくのとんかつは、やっぱりできたてがおいしい', 'ごはん、キャベツがおかわり自由なので足りない人は追加できます', '', '最初は鉄板に乗ったそのままで、次にほうじ茶をかけてお茶漬けにして', '', 'ちょっとレトロな店内で、とんかつをお茶漬けにするなんて、と過去にショックを受けたメニューのひとつです', ''], ['とんかつとキャベツをご飯に乗っけてお茶漬けで食べるというジャンクフードのノリで食べられる料理でした', '名物と聞いていただきました', '量がけっこうガッツリです', '', '', '', ''], ['とんかつのソースはお味噌かソース選べます', '', '迷って両方用意してくださいました', '', '', '', ''], ['わらじとんかつ定食1680円味噌ソースのカツと普通のトンカツの2枚がセットになった定食味噌ソースは甘めの八町味噌でごはんがすすみます', '', '', '', '', '', ''], ['とんかつ盛合せライス950円を食しました', '', 'ロースカツとヒレカツ、そしてライスが付いてきます', '', 'とんかつは上品で柔らかい豚肉を使って、カリカリジューシーに揚げてあります', '', 'この場所でこのボリュームでこの値段は、かなりお得ですよね'], ['とんかつは上品で柔らかい豚肉を使って、カリカリジューシーに揚げてあります', 'ロースカツとヒレカツ、そしてライスが付いてきます', 'この場所でこのボリュームでこの値段は、かなりお得ですよね', 'とんかつ盛合せライス950円を食しました', '美味しいランチを楽しめました', '', ''], ['甘めの味噌がとんかつと合っていると思います', 'アツアツで提供されてくるのも嬉しいですね', '', '値段の割には結構なボリュームがあります', '', '', ''], ['名前のとおり、「わらじ」かと思うくらい大きいとんかつがのっています', '', 'みそだれとソースの二種類がかかっていて2つの味を楽しめます', '', 'ご飯もたっぷりでかなりボリュームのある一品でした', '', ''], ['鉄板に焼けたしょうゆの匂いと味が、とんかつの衣とキャベツに絡み合って食欲をそそります', '', '', '', '', '', ''], ['サクサクの衣をまとった揚げたてのとんかつは、ごはんにピッタリ', 'お肉が柔らかくてジューシー', 'ごはんやお味噌汁もとっても美味しいです', '', '', '', '']]

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

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

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

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

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

guest

回答1

0

ベストアンサー

解析のたびにAPI叩いてデータ持って来るんですか? という観点からすると、とりあえずpickleかなにかでダンプした方が良いでしょう。

あとはtextデータをngramにするプログラムがどんなものになっているのか次第ですが、フォーマットが独特なので、少なくとも入力の部分はそれなりに新しく書く必要があるのでは。

投稿2018/09/11 09:52

編集2018/09/11 09:53
hayataka2049

総合スコア30933

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

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

rrrrrrrry

2018/09/11 09:56

二次元配列の[]や''などどのように取り除くのがいいですかね... 一旦その作業含め試験的にやっていきたいので
hayataka2049

2018/09/11 09:59

pickleで出力して、二次元リストのまま読み込めるプログラムをまず書きましょう テキスト処理でどうこうするのは大変なので、データ構造として読み込んでプログラムで取り扱えばよいのですが
rrrrrrrry

2018/09/11 10:06

何か参考となるサイトを列挙していただけると助かります。自分自身pickleというものを取り扱うのは初めてなので。
hayataka2049

2018/09/11 10:17

たぶんご自身で検索された方が手っ取り早いです。私が貼るにしても検索で出てきたのを適当に貼るだけなので
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問