Ejemplo n.º 1
0
def retry():
    global choice_bodies, candidates, top

    top += 1
    if top + 1 >= len(candidates):
        r = HTTPResponse(status=500)
        r.set_header('Content-Type', 'application/json')
        r.set_header('Access-Control-Allow-Origin', '*')
        return r

    restaurant_db = DBModel('gourmet', 'localhost', 'foo', 'bar')
    name_result = restaurant_db.select('SELECT name FROM restaurants WHERE id={}'.format(
        choice_bodies[top]['_source']['restaurant_id']
    ))
    address_result = restaurant_db.select(
        'SELECT address FROM restaurants WHERE id={}'.format(
            choice_bodies[top]['_source']['restaurant_id']
        )
    )

    restaurant = 'こちらのお店はいかがでしょうか?\n\n店名 : {}'.format(name_result[0])
    if address_result[0] != 'nan':
        restaurant += '\n住所 : {}'.format(address_result[0])

    if len(candidates[top]) == 0 or candidates[top] is None:
        recommend = 'このお店に行ったことがある人は,残念ながら見つかりませんでした.'
    else:
        recommend = 'このお店に行ったことがある人は次のような感想を述べています :'
        for candidate in candidates[top]:
            recommend += '\n\n・{}'.format(candidate)

    dicts = [
        {'restaurant': restaurant, 'recommend': recommend}
    ]

    r = HTTPResponse(status=200, body=json.dumps(dicts, ensure_ascii=False))
    r.set_header('Content-Type', 'application/json')
    r.set_header('Access-Control-Allow-Origin', '*')
    return r
Ejemplo n.º 2
0
def get_reply(query):
    global candidates, choice_bodies, top

    candidates = []
    choice_bodies = []
    top = 0

    parser.drop_morph(query)

    word_pairs = word2vec_model.similar_words(parser.words)
    word_pairs = word2vec_model.most_significant_word_pairs(word_pairs)

    terms = [word for word, _ in word_pairs]

    elastic_results = elastic_model.search_terms(terms)

    bodies = elastic_results[0]

    analyst = Analyst(word2vec_model, specific_parts=['普通名詞', '地名', '固有名詞', '組織名'])

    all_sum_scores = []
    all_scores = []
    all_candidates = []

    for body in elastic_results[0]:
        analyst.parse(body['_source']['body'])
        candidate_scores = np.array(analyst.calc_candidate_score())
        query_base_scores = np.array(analyst.calc_query_base_score(parser.words))
        scores = list(candidate_scores + query_base_scores)

        all_sum_scores.append(sum(scores) / (len(scores) if len(scores) != 0 else 1))
        all_scores.append(scores)
        all_candidates.append(analyst.candidates)

    indices = np.argsort(all_sum_scores)[::-1]

    for index in indices:
        choice_bodies.append(bodies[index])
        candidates_ = analyst.most_significant_candidates(
            all_scores[index],
            all_candidates[index]
        )
        candidates.append(candidates_)

    restaurant_db = DBModel('gourmet', 'localhost', 'foo', 'bar')
    name_result = restaurant_db.select('SELECT name FROM restaurants WHERE id={};'.format(
        choice_bodies[top]['_source']['restaurant_id']
    ))
    address_result = restaurant_db.select(
        'SELECT address FROM restaurants WHERE id={}'.format(
            choice_bodies[top]['_source']['restaurant_id']
        )
    )

    restaurant = 'こちらのお店はいかがでしょうか?\n\n店名 : {}'.format(name_result[0])
    if address_result[0] != 'nan':
        restaurant += '\n住所 : {}'.format(address_result[0])

    if len(candidates[top]) == 0 or candidates[top] is None:
        recommend = 'このお店に行ったことがある人は,残念ながら見つかりませんでした.'
    else:
        recommend = 'このお店に行った人は次のような感想を述べています :'
        for candidate in candidates[top]:
            recommend += '\n\n・{}'.format(candidate)

    dicts = [
        {'restaurant': restaurant, 'recommend': recommend}
    ]

    return json.dumps(dicts, ensure_ascii=False)