@datatel94

Как добавить учет опечаток при поиске через API last.fm?

Здравствуйте,

Есть код который ищет через last.fm.
Но существует проблема когда допустим имя артиста не очень удобно писать правильно например "макsим" такие имена пишут полностью по русски. Как сделать чтобы скрипт учитывал такие моменты?
Код:
Код поиска
<?php namespace App\Services\Providers\Lastfm;

use App\Services\HttpClient;
use App\Services\Search\SearchInterface;

class LastfmSearch implements SearchInterface {

    /**
     * @var HttpClient
     */
    private $httpClient;

    /**
     * @var mixed
     */
    private $apiKey;

    /**
     * Create new SpotifySearch instance.
     */
    public function __construct() {
        $this->httpClient = new HttpClient(['base_uri' => 'http://ws.audioscrobbler.com/2.0/']);
        $this->apiKey = config('site.lastfm.key');
    }

    /**
     * Search using last.fm api and given params.
     *
     * @param string  $q
     * @param int     $limit
     *
     * @return array
     */
    public function search($q, $limit = 10)
    {
        $queryString = "$q&api_key={$this->apiKey}&format=json&limit=$limit&autocorrect=1";

        $artists = $this->httpClient->get('?method=artist.search&artist='.$queryString);
        $tracks  = $this->httpClient->get('?method=track.search&track='.$queryString);
        $albums  = $this->httpClient->get('?method=album.search&album='.$queryString);

        return $this->formatResponse([
            'artists' => head($artists['results']['artistmatches']),
            'albums'  => head($albums['results']['albummatches']),
            'tracks'  => $this->getFullTracks(head($tracks['results']['trackmatches'])),
        ]);
    }

    /**
     * Format and normalize lastfm response for use in our app.
     *
     * @param array   $response
     *
     * @return array
     */
    private function formatResponse($response) {

        $formatted = ['albums' => [], 'tracks' => [], 'artists' => []];

        $formatted['albums'] = array_map(function($album) {
            return [
                'name' => $album['name'],
                'image' => ! empty($album['image']) ? last($album['image'])['#text'] : null,
                'artist'  => [
                    'name' => $album['artist'],
                    'fully_scraped' => 0
                ]
            ];
        }, $response['albums']);

        $formatted['tracks'] = array_map(function($track) {
            return [
                'name' => $track['name'],
                'image' => ! empty($track['album']['image']) ? head($track['album']['image'])['#text'] : null,
                'lastfm_popularity' => (int) $track['listeners'],
                'duration' => (int) $track['duration'],
                'artists'  => [$track['artist']],
                'number'   => 0,
                'album'    => [
                    'name' => $track['album']['title'],
                    'artist' => $track['album']['artist'],
                ],
            ];
        }, $response['tracks']);

        $formatted['artists'] = array_map(function($artist) {
            return [
                'name' => $artist['name'],
                'image_small' => ! empty($artist['image']) ? $artist['image'][1]['#text'] : null,
                'image_large' => ! empty($artist['image']) ? last($artist['image'])['#text'] : null,
                'lastfm_popularity' => (int) $artist['listeners']
            ];
        }, $response['artists']);

        return $formatted;
    }

    private function getFullTracks($tracks) {
        $ids = array_map(function($t) { return $t['mbid']; }, $tracks);

        return array_map(function($id) {
            return head($this->httpClient->get("?method=track.getInfo&mbid=$id&api_key={$this->apiKey}&format=json"));
        }, $ids);
    }
}

  • Вопрос задан
  • 68 просмотров
Пригласить эксперта
Ответы на вопрос 1
@santaatnas
Java, Python, Php
Тут вопрос интересный, допустим вы сделали скрипт который заменит "максим" на "макsим", а вдруг пользователь искал песню "Максим Леонидова", а вы ему выдали макsим. Тут стоит реализовать систему подсказок с весами, реализовывал подобную вещь на одной площадке. Суть в том, что вы собираете статистику конечного результата и введенной фразу, и по кол-ву хитов подсказываете пользователю автокомплитом. Т.е. пользователь зашел, вы идентифицировали его, и начинаете собирать введенные им фразы и то, куда он в конечном результате перешел. Допустим было 100 пользователей, ввели максим, из них 60 в конечном итоге добрались до МакSим, а 40 до Максим Леонидов. В итоге вы отдаете подсказку в отсортированном по статистике виде. Собирается статистика на фронте средствами js. Где ее хранить? - вопрос. У нас был хайлоад, хранили в RT-индексе Sphinx (плюс плюшки от sphinx с полнотекстовым поиском). Задача не тривиальная, но решение я считаю адекватным. Возможно в вашем случае стоит просто составить список слов и их замен и предлагать из пользователям.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы