Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What are the problem?

posted at

updated at

【ぐるなびAPI】よしなにランチを決めてほしい

こんにちは。B4のサッチーです。これはMYJLab Advent Calendar 2020の12日目の記事です。
昨日まではM2の先輩, 同輩, 後輩が繋いでくださいました。ありがとうございます。
去年にひき続き、アドベントカレンダー頑張ります!!

これは

最近インターンやら卒論やらで忙しく、自分の勉強や開発が全くできていなかったので、あまりアウトプットすることがありません。
そこで何か困りごとがないかを考えてみたのですが、幸せなことに、出社したときにランチに何を食べるか悩むくらいしか困りごとがありませんでした。
なので今回は適当にランチで何を食べるか提案してくれるプログラムを書いてみました。

計画

  • ぐるなびAPIを使って会社から半径500m以内にある飲食店の口コミを収集
  • キーワードを入力して、レビューコメントにキーワードが含まれているお店を返す

クチコミを収集

ぐるなびのAPIを使います。ここからAPIの利用登録をします。
まず「レストラン検索API」で会社から半径500m以内にある飲食店を集めます。次に「応援口コミAPI」使って、集めた飲食店の口コミを収集します。

class Gnavi:
    def __init__(self, keyid, latitude, longtitude):
        self.keyid = keyid,
        self.latitude = latitude,
        self.longitude = longtitude, 

    # レストラン検索API
    def get_shop_info(self, url):
        shop_info_list = []

        params = {
            'keyid': self.keyid,
            'latitude': self.latitude,
            'longitude': self.longitude,
            'offset_page': 1
        }

        while True:
            result = requests.get(url, params).json()
            if 'error' in result:
                print(result['error'])
                return shop_info_list

            shop_info_list += result['rest']
            params['offset_page'] += 1

        return shop_Info_list

    # 応援口コミAPI
    def get_shop_review(self, url, shop_ids):
        shop_review_list = []

        params = {
            'keyid': self.keyid,
        }

        window_count = len(shop_ids) // 10 + 1

        for window_id in range(0, window_count):
            if window_id == window_count - 1:
                shop_id = ",".join(shop_ids[10*window_id:])
            else:
                shop_id = ",".join(shop_ids[10*window_id:10*window_id+10])

            params['shop_id'] = shop_id
            result = requests.get(url, params).json()

            if 'gnavi' in result:
                for error in result['gnavi']['error']:
                    if error['code'] == 429:
                        return error['message']
            else:
                shop_review_list.append(result)

        return shop_review_list


keyid = '<APIキー>'
lat, lon = '<会社の>', '<緯度経度>'
gnavi = Gnavi(keyid, lat, lon)

レストラン検索APIは1リクエストで10店舗分の情報しか返ってこないので、offset_pageを増やしながら店舗の取得ができなくなるまでリクエストしました。

url = "https://api.gnavi.co.jp/RestSearchAPI/v3/" ##レストラン検索APIのエンドポイント
shop_info_list = gnavi.get_shop_info(url)

構造が複雑なのでデータフレームにしてしまいます

import pandas as pd

df_shopinfo = pd.DataFrame(shop_info_list)
df_shopinfo.head()
@attributes id update_date name name_kana latitude longitude category url url_mobile ... access parking_lots pr code budget party lunch credit_card e_money flags
0 {'order': 0} gd39700 2020-12-08T01:20:02+09:00 言の葉 コトノハ 35.647908 139.712719 鉄板個室ダイニング https://r.gnavi.co.jp/gd39700/?ak=m%2Bqqz7dSuc... http://mobile.gnavi.co.jp/shop/gd39700/?ak=m%2... ... {'line': 'JR', 'station': '恵比寿駅', 'station_exi... {'pr_short': '平素より、言の葉をご利用頂き誠にありがとうございます。 当店の閉... {'areacode': 'AREA110', 'areaname': '関東', 'pre... 8000 8000 VISA,MasterCard,ダイナースクラブ,アメリカン・エキスプレス,JCB {'mobile_site': 1, 'mobile_coupon': 0, 'pc_cou...
1 {'order': 1} ggn6001 2020-12-07T09:35:09+09:00 Bistro Ame ビストロアム 35.647953 139.712559 肩肘張らないビストロ https://r.gnavi.co.jp/1uczv90e0000/?ak=m%2Bqqz... http://mobile.gnavi.co.jp/shop/ggn6001/?ak=m%2... ... {'line': 'JR', 'station': '恵比寿駅', 'station_exi... {'pr_short': '肩肘張らないビストロで旬のお料理を味わう 6月2日より営業を再開... {'areacode': 'AREA110', 'areaname': '関東', 'pre... 7000 5000 {'mobile_site': 1, 'mobile_coupon': 0, 'pc_cou...
2 {'order': 2} 7669791 2020-04-01T05:39:53+09:00 ガーデンテラス×イタリアン decollo デッコーロ 恵比寿 ガーデンテラスイタリアン デッコーロエビス 35.647956 139.712806 ビアガーデン https://r.gnavi.co.jp/p23gahsv0000/?ak=m%2Bqqz... http://mobile.gnavi.co.jp/shop/7669791/?ak=m%2... ... {'line': 'JR', 'station': '恵比寿駅', 'station_exi... {'pr_short': '', 'pr_long': ''} {'areacode': 'AREA110', 'areaname': '関東', 'pre... {'mobile_site': 1, 'mobile_coupon': 0, 'pc_cou...
3 {'order': 3} 6421849 2020-12-11T05:06:47+09:00 EBISU蓮 エビスレン 35.647943 139.712825 そば https://r.gnavi.co.jp/phuv78xj0000/?ak=m%2Bqqz... http://mobile.gnavi.co.jp/shop/6421849/?ak=m%2... ... {'line': 'JR埼京線', 'station': '恵比寿(東京都)駅', 'sta... {'pr_short': '', 'pr_long': ''} {'areacode': 'AREA110', 'areaname': '関東', 'pre... {'mobile_site': 1, 'mobile_coupon': 0, 'pc_cou...
4 {'order': 4} 1046494 2020-12-12T05:17:38+09:00 炉ばた 陣や ロバタジンヤ 35.647473 139.712244 居酒屋 https://r.gnavi.co.jp/knyezswz0000/?ak=m%2Bqqz... http://mobile.gnavi.co.jp/shop/1046494/?ak=m%2... ... {'line': 'JR山手線', 'station': '恵比寿駅', 'station_... {'pr_short': '', 'pr_long': ''} {'areacode': 'AREA110', 'areaname': '関東', 'pre... {'mobile_site': 1, 'mobile_coupon': 0, 'pc_cou...

5 rows × 28 columns

情報として使えそうなカラムだけ残します. prとimage_urlはさらに入れ子になっているので、pr_shortとshop_iamge1を残そうと思います

df_shopinfo = df_shopinfo[['id', 'name', 'longitude', 'latitude', 'holiday', 'opentime', 'category','pr', 'url_mobile', 'image_url']]
df_shopinfo['pr'] = df_shopinfo['pr'].apply(lambda x: x['pr_short'])
df_shopinfo['image_url'] = df_shopinfo['image_url'].apply(lambda x: x['shop_image1'])
df_shopinfo.head()
id name longitude latitude holiday opentime category pr url_mobile image_url
0 gd39700 言の葉 139.712719 35.647908 毎週日曜日\n年末年始(2019年1月1日) 月~土・祝前日・祝日 ディナー:18:00~24:00(L.O.23:00)(臨時休業有。) 鉄板個室ダイニング 平素より、言の葉をご利用頂き誠にありがとうございます。 当店の閉店時間は深夜0時とさせて頂きます。 http://mobile.gnavi.co.jp/shop/gd39700/?ak=m%2... https://rimage.gnst.jp/rest/img/h10d1ss30000/t...
1 ggn6001 Bistro Ame 139.712559 35.647953 毎週月曜日 第3火曜日\n※※月曜祝日の場合、翌日火曜は休み ディナー:18:00~23:00\n土・日・祝日 ランチ:12:00~15:00 肩肘張らないビストロ 肩肘張らないビストロで旬のお料理を味わう 6月2日より営業を再開させていただきます。 http://mobile.gnavi.co.jp/shop/ggn6001/?ak=m%2... https://rimage.gnst.jp/rest/img/1uczv90e0000/t...
2 7669791 ガーデンテラス×イタリアン decollo デッコーロ 恵比寿 139.712806 35.647956 金・土 ディナー:17:30~翌2:00(L.O.1:30)\n月~金 ランチ:11:30~... ビアガーデン http://mobile.gnavi.co.jp/shop/7669791/?ak=m%2...
3 6421849 EBISU蓮 139.712825 35.647943 毎週日曜日 祝日 月~金 ランチ:11:30~14:30(L.O.14:00)\n土 ランチ:12:00~17... そば http://mobile.gnavi.co.jp/shop/6421849/?ak=m%2...
4 1046494 炉ばた 陣や 139.712244 35.647473 月~金 ランチ:11:30~14:00(L.O.13:30)、ディナー:17:00~23:3... 居酒屋 http://mobile.gnavi.co.jp/shop/1046494/?ak=m%2...

次に取得した飲食店の口コミを収集します。shop_idは1リクエストにつき10個までカンマ区切りにして送ることができます。APIのリクエスト制限が開発モードでは1日に1000回なので、10個ずつ送ってリクエスト数を節約しました。返り値が少し複雑、、エラーが返ってくるときはキーが「gnavi」になって返ってくるので、gnaviが含まれる場合にエラーをキャッチして、それ以外は結果をとりあえず残すようにしました

shop_ids = df_shopinfo.id.values.tolist() ## 取得した飲食店のidのリスト
url = 'https://api.gnavi.co.jp/PhotoSearchAPI/v3/' ## 応援口コミAPIのエンドポイント 
reviews = gnavi.get_shop_review(url, shop_ids)
reviews[0]
{'response': {'@attributes': {'api_version': 'v3'},
  'total_hit_count': 12,
  'hit_per_page': 15,
  '0': {'photo': {'vote_id': '97774',
    'photo_genre_id': '1',
    'photo_genre_name': '料理・ドリンク',
    'photo_scene_id': '',
    'photo_scene_name': '',
    'nickname': 'cocoronron',
    'shop_id': '5237768',
    'shop_name': 'IL BOCCALONE',
    'shop_url': 'https://r.gnavi.co.jp/j9x8tn8b0000/?ak=m%2Bqqz7dSuc6%2FTCXqzE3tXC%2FHVysBRwNGyp5Ud0dSNe8%3D',
    'prefname': 'PREF13:東京都',
    'menu_id': 92658,
    'menu_name': '黒キャベツのパスタ',
    'menu_finish_flag': 0,
    'areaname_l': '恵比寿・中目黒・目黒',
    'areaname_m': '恵比寿',
    'areaname_s': '恵比寿(広尾・ガーデンプレイス方面)',
    'image_url': {'url_1024': 'https://mr.gnavi.co.jp/cont/menu_image/ce/83/97774_l.jpeg',
     'url_320': 'https://mr.gnavi.co.jp/cont/menu_image/ce/83/97774.jpeg',
     'url_250': 'https://mr.gnavi.co.jp/cont/menu_image/ce/83/97774_m.jpeg',
     'url_200': 'https://mr.gnavi.co.jp/cont/menu_image/ce/83/97774_s.jpeg'},
    'comment': 'フィットチーネが濃厚ソースに絡んでて美味しかったです!\r\n黒キャベツとはいえども、思ったより、重たい。',
    'total_score': '3.0',
    'category': 'イタリアン',
    'latitude': '35.647784',
    'longitude': '139.712111',
    'umaso_count': 0,
    'update_date': '2011-01-04T16:26:40+09:00',
    'messages': {'user_message_count': 0,
     'shop_message_count': 0,
     'first_shop_message': {'message_body': '', 'send_date': ''}}}},
  '1': {'photo': {'vote_id': '300779',
    'photo_genre_id': '1',
    'photo_genre_name': '料理・ドリンク',
    'photo_scene_id': '',
    'photo_scene_name': '',
    'nickname': 'yukikos',
    'shop_id': '5237768',
    'shop_name': 'IL BOCCALONE',
    'shop_url': 'https://r.gnavi.co.jp/j9x8tn8b0000/?ak=m%2Bqqz7dSuc6%2FTCXqzE3tXC%2FHVysBRwNGyp5Ud0dSNe8%3D',
    'prefname': 'PREF13:東京都',
    'menu_id': 29952,
    'menu_name': 'パルメザンチーズのリゾット',
    'menu_finish_flag': 0,
    'areaname_l': '恵比寿・中目黒・目黒',
    'areaname_m': '恵比寿',
    'areaname_s': '恵比寿(広尾・ガーデンプレイス方面)',
    'image_url': {'url_1024': 'https://mr.gnavi.co.jp/cont/menu_image/ce/83/300779_l.jpeg',
     'url_320': 'https://mr.gnavi.co.jp/cont/menu_image/ce/83/300779.jpeg',
     'url_250': 'https://mr.gnavi.co.jp/cont/menu_image/ce/83/300779_m.jpeg',
     'url_200': 'https://mr.gnavi.co.jp/cont/menu_image/ce/83/300779_s.jpeg'},
    'comment': '定番のパルメザンチーズのリゾットは、\r\nチーズ丸ごとの迫力だけじゃなく、濃い味もクセになる。',
    'total_score': '3.0',
    'category': 'イタリアン',
    'latitude': '35.647784',
    'longitude': '139.712111',
    'umaso_count': 0,
    'update_date': '2011-01-31T17:56:25+09:00',
    'messages': {'user_message_count': 0,
     'shop_message_count': 0,
     'first_shop_message': {'message_body': '', 'send_date': ''}}}},・・・以下省略}}

数字がキーになっているところがひとつひとつのお店の情報になっているっぽいので、強引ですが「attributes」、 「total_hit_count」、「hit_per_page」を避けてshop_idとcommentだけを取得します。(total_hit_countやhit_per_pageの値分、お店の情報があるわけでもなさそうでした)

shop_id_comment_list = []

for shop_reviews in reviews:
    for k, v in shop_reviews['response'].items():
        if k in ['@attributes', 'total_hit_count', 'hit_per_page']:
            continue

        shop_id = v['photo']['shop_id']
        comment = v['photo']['comment']

        shop_id_comment_list.append({
            'shop_id':shop_id,
            'comment':comment,
        })
df_shop_review = pd.DataFrame(shop_id_comment_list)
df_shop_review = df_shop_review.dropna(subset=['comment']) ## コメントがないところは削除
df_shop_review = df_shop_review.query('comment != ""') ## コメントがないところは削除
df_shop_review.head()
shop_id comment
0 5237768 フィットチーネが濃厚ソースに絡んでて美味しかったです!\r\n黒キャベツとはいえども、思った...
1 5237768 定番のパルメザンチーズのリゾットは、\r\nチーズ丸ごとの迫力だけじゃなく、濃い味もクセになる。
2 1046494 かき氷の上に小さな小瓶がさしてあり、しっかりと冷やしてあります。\r\nうにとオクラが入った...
3 g818801 サラダの取り放題がついてます!パエリヤなのに出てくるのが早くて、忙しい方にもオススメ!
4 1046494 食べごたえのある唐揚げと、温玉がのった鶏そぼろ丼でボリューム満点でした!

軽くクレンジング

そんなに汚いデータではなさそうですが、記号やurlの削除はしておきます

import re

def cleansing(text):
    text= re.sub(r'https?://[\w/:%#\$&\?\(\)~\.=\+\-…]+', "", text)#URL
    text = re.sub(r"[0-9]+", "0", text)#数字を0に
    text = re.sub(r"[!-/]", "", text)#半角記号
    text = re.sub(r"[:-@]", "", text)#半角記号
    text = re.sub(r"[[-`]", "", text)#半角記号
    text = re.sub(r"[{|}-]", "", text)#半角記号
    text = re.sub(r"[”’()【】〔〕《》=〜『』「」+*、。・_?!/◀▲:]", "", text)#全角記号
    text = re.sub("\n", "", text)#改行
    text = re.sub("\r", "", text)#改行

    return text

df_shop_review['comment'] = df_shop_review['comment'].apply(lambda x: cleansing(x))

形態素解析

これはなくてもよかったかもしれませんが、入力されたキーワードがコメントに含まれているかだけだと、言葉が揺れそうなので念のため単語の原形のリストも作ってみます。原形にしたいだけなので品詞の選択とかもしません。

import MeCab

mecab = MeCab.Tagger("-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd")

def tokenizer(text):
    node = mecab.parseToNode(text)
    res = []

    while node:
        base = node.feature.split(",")[6]
        if base != '*':
            res.append(base)

        node = node.next

    return res
df_shop_review['wakati'] = df_shop_review['comment'].apply(lambda x: tokenizer(x))
df_shop_review.head()
shop_id comment wakati
0 5237768 フィットチーネが濃厚ソースに絡んでて美味しかったです黒キャベツとはいえども思ったより重たい [フィットチーネ, が, 濃厚, ソース, に, 絡む, で, てる, 美味しい, た, で...
1 5237768 定番のパルメザンチーズのリゾットはチーズ丸ごとの迫力だけじゃなく濃い味もクセになる [定番, の, パルメザンチーズ, の, リゾット, は, チーズ, 丸ごと, の, 迫力,...
2 1046494 かき氷の上に小さな小瓶がさしてありしっかりと冷やしてありますうにとオクラが入ったものうにとゆ... [かき氷, の, 上, に, 小さな, 小瓶, が, さして, ある, しっかり, と, 冷...
3 g818801 サラダの取り放題がついてますパエリヤなのに出てくるのが早くて忙しい方にもオススメ [サラダ, の, 取る, 放題, が, つく, て, ます, パエリヤ, だ, の, に, ...
4 1046494 食べごたえのある唐揚げと温玉がのった鶏そぼろ丼でボリューム満点でした [食べる, ごたえ, の, ある, 唐, 揚げ, と, オンセンタマゴ, が, のる, た,...

少し無理やり店舗ごとのデータにします

df_shop_review = df_shop_review.groupby('shop_id').sum().reset_index()
df_shop_review.head()
shop_id comment wakati
0 0036388 ほんのりラムの香りが広がるたたき柔らかくて美味ですお店がオススメとうたうだけのことはあります... [ほんのり, ラム, の, 香り, が, 広がる, たたき, 柔らかい, て, 美味, です...
1 0222320 ボリューム満点 [ボリューム, 満点]
2 1005712 雰囲気がとても落ち着いていて大人な空間ですおそばはコシがあってとってもおいしいです鴨汁はとて... [雰囲気, が, とても, 落ち着く, て, いる, て, 大人, だ, 空間, です, お...
3 1009522 お肉や魚介をはじめ0種類以上の季節の野菜を花椒や四川特産の朝天唐辛子で香り高く炒めつつさらに... [お肉。, や, 魚介, を, はじめ, 0種類, 以上, の, 季節, の, 野菜, を,...
4 1012998 さっぱりとした薫りの蕎麦は濃いめのつゆと併せてすっきりした美味しさでしたこりこりしてておいし... [さっぱり, と, する, た, 薫り, の, 蕎麦, は, 濃いめ, の, つゆ, と, ...

最初に取得した店舗情報とマージします

df_shop_data = pd.merge(df_shopinfo, df_shop_review.rename(columns={'shop_id':'id'}), on='id', how='inner')
df_shop_data
id name longitude latitude holiday opentime category pr url_mobile image_url comment wakati
0 1046494 炉ばた 陣や 139.712244 35.647473 月~金 ランチ:11:30~14:00(L.O.13:30)、ディナー:17:00~23:3... 居酒屋 http://mobile.gnavi.co.jp/shop/1046494/?ak=m%2... かき氷の上に小さな小瓶がさしてありしっかりと冷やしてありますうにとオクラが入ったものうにとゆ... [かき氷, の, 上, に, 小さな, 小瓶, が, さして, ある, しっかり, と, 冷...
1 5237768 IL BOCCALONE 139.712111 35.647784 月~土 17:30~24:00(L.O.23:00)\n日 17:30~23:00(L.O.... イタリアン http://mobile.gnavi.co.jp/shop/5237768/?ak=m%2... フィットチーネが濃厚ソースに絡んでて美味しかったです黒キャベツとはいえども思ったより重たい定... [フィットチーネ, が, 濃厚, ソース, に, 絡む, で, てる, 美味しい, た, で...
2 g818801 サラ・アンダルーサ 139.713295 35.647946 毎週土・日曜日 祝日 月~金 ランチ:11:30~15:00(L.O.14:30)(イベント開催時は営業時間を短縮... 貸切スペインダイニング [JR恵比寿駅 徒歩5分] 常設ステージあり!本格フラメンコショーも楽しめるスペインレストラ... http://mobile.gnavi.co.jp/shop/g818801/?ak=m%2... https://rimage.gnst.jp/rest/img/mdayd13d0000/t... サラダの取り放題がついてますパエリヤなのに出てくるのが早くて忙しい方にもオススメ [サラダ, の, 取る, 放題, が, つく, て, ます, パエリヤ, だ, の, に, ...
3 5351809 アンクルトム 139.711817 35.647634 パスタ http://mobile.gnavi.co.jp/shop/5351809/?ak=m%2... 少なくとも15年以上前からやってる恵比寿を代表するスパゲティ屋さんですイタリアレストランでは... [少なくとも, 15年, 以上, 前, から, やる, てる, 恵比寿, を, 代表, する...
4 5828891 瞠 -miharu- 恵比寿店 139.711572 35.647729 月~日 ランチ・ディナー:11:00~22:00 ラーメン店 あのグルメランキング番組の「池袋ラーメン」で第2位。雑誌掲載30誌以上。絶品の濃厚魚介豚骨ス... http://mobile.gnavi.co.jp/shop/5828891/?ak=m%2... おいしいです節系のスープが美味わりとシンプルなので飽きずに食べられそう濃いめのスープもっちり... [おいしい, です, 節, 系, の, スープ, が, 美味, わりと, シンプル, だ, ...
... ... ... ... ... ... ... ... ... ... ... ... ...
204 6075267 ura ebis. 139.707195 35.648345 ビストロ http://mobile.gnavi.co.jp/shop/6075267/?ak=m%2... とろ~りチーズのとろけたハンバーグトマトソースで酸味があってわりとさっぱり味お肉はあいびきで... [とろーり, チーズ, の, とろける, た, ハンバーグ, トマトソース, で, 酸味, ...
205 7714899 ライオンのいるサーカス 139.707796 35.645582 イタリアン http://mobile.gnavi.co.jp/shop/7714899/?ak=m%2... ツケナポライオンのいるサーカス ライオンはいないです笑恵比寿駅西口から恵比寿銀座を歩いて信号... [の, いる, サーカス,  , ライオン, は, いる, ない, です, 笑, 恵比寿駅,...
206 g212700 Le Parc 恵比寿店 139.707129 35.646899 年中無休\n年末年始(2020年12月31日~2021年1月2日) 月~金 ランチ:11:30~15:00(L.O.14:30)、ディナー:17:00~22:0... 香港飲茶・広東料理 本場香港の点心師が作るヌーベルシノワ 四季を感じる洋風な店内でワインと共に本格中華を! ラン... http://mobile.gnavi.co.jp/shop/g212700/?ak=m%2... https://rimage.gnst.jp/rest/img/9nfw23cg0000/t... 甘めのマヨネーズがちょっと重いですエビの量は多くて満足エビ餃子ニラ餃子カニ焼売他にも揚げもの... [甘い, め, の, マヨネーズ, が, ちょっと, 重い, です, エビ, の, 量, は...
207 5429747 串いろいろとわっぱ飯 民家 139.707606 35.645810 毎週月曜日 火~日 16:00~24:00(L.O.23:00) 串揚げ居酒屋 【恵比寿徒歩3分】民家黄金伝説コース★料理2,500円当日もOK\n  +1,800円で飲み... http://mobile.gnavi.co.jp/shop/5429747/?ak=m%2... 鮭とイクラの入ったわっぱ飯ですこれは美味けっこうボリュームがありました♪午後7時までのお得な... [鮭, と, イクラ, の, 入る, た, わっぱ, 飯, です, これ, は, 美味, け...
208 7385242 俺のBakery&Cafe 139.713192 35.643260 不定休日あり カフェ:8:00~21:00(L.O.20:00)(食パン販売 10:00~21:00) 俺のシリーズのカフェ 俺のシリーズの新業態『俺のBakery&Cafe』\n当店の自慢の食パンを是非、お召し上がり... http://mobile.gnavi.co.jp/shop/7385242/?ak=m%2... ふわふわのたまごですが食べたら濃く濃くとたまごの旨味が染み渡りますパンも生食パン仕様でめっち... [ふわふわ, の, たまご, です, が, 食べる, た, 濃い, 濃い, と, たまご, ...

209 rows × 12 columns

レビューコメントがあるお店が少なかったので、結構減りました

単語を入力して単語がレビューコメントに含まれる店を出力

入力を受け取って、受け取った単語がレビューコメントに含まれているお店を出力します。
個人的にいろんなお店や行ったことないお店を開拓したいので、検索条件は緩めにORにします。条件に引っかかるお店が3つ以上ある場合はランダムで3個返します

while True:
    input_words = input("単語をカンマ区切りで入力してね>  ").replace(' ', '').split(',')

    selected = []

    if input_words[0] == 'exit' or input_words[0] == "":
        break

    for shop_id, wakati, comment in df_shop_data[['id', 'wakati','comment']].values:
        for word in input_words:
            if word in wakati or word in comment:
                selected.append(shop_id)
                break

    if df_shop_data.query('id in @selected').empty:
        print('そんな店はない')
    else:
        for name, category, pr in df_shop_data.query('id in @selected').sample(n=3)[['name', 'category', 'pr']].values:
            print("店名: " + name)
            print('カテゴリー: ' + category)
            print('PR: ' + pr)
            print('')
単語を入力してね>  馬, イタリアン
店名: Mother earth cafe restaurant 【マザーアースカフェレストラン】
カテゴリー: カフェ
PR: 

店名: 肉寿司 恵比寿横丁店
カテゴリー: 肉寿司
PR: 牛・馬肉を中心とした肉専門の握り寿司それが肉寿司!!!

朝5時まで元気に営業中!
名物さしとろは食べるしかない!

店名: 九州 熱中屋 恵比寿 LIVE
カテゴリー: 恵比寿 九州 居酒屋
PR: 【恵比寿】西口徒歩1分の駅近九州料理居酒屋 ■最大32名様 活豊後サバ刺し・鉄板餃子が自慢の一品!! ■当日予約OK!!各種ご宴会に…飲み放題付コース多数あり!!

単語を入力してね>  

終わりに

雑めな感じになってしまいましたが、とりあえず会社の近くにあるお店をたくさん知ることができて満足です。APIネタ被りしてしまってすみませんでした。ぐるなびのクチコミは思ったより少ないですね。
次回の記事ではこれをサーバーレスなwebアプリにできたらいいなと思います。

参考にさせていただいたサイト

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
3
Help us understand the problem. What are the problem?