pyk / rojak

Project Rojak, Yuk gabung diskusi di Slack nya Rojak: http://team.rojak.id/
Other
98 stars 46 forks source link

[rojak-api] Enable searching for news article by URL #131

Open bobbypriam opened 8 years ago

bobbypriam commented 8 years ago

Use case: given sebuah link artikel berita, kita ingin lihat bagaimana sentimen artikel tersebut pada rojak.

Sebagai MVP, kita ingin pencarian dilakukan secara exact match dan tidak ada fuzzy search. Tantangannya adalah satu berita bisa memiliki beberapa URL berbeda, terutama apabila terdapat query string yang tidak relevan dengan beritanya. Contohnya pada detik.com:

http://news.detik.com/berita/d-3328647/ppp-ingin-pemilu-sistem-terbuka-pemilih-coblos-nama-caleg?_ga=1.102210820.421029061.1457685142

Terdapat query _ga yang tidak berhubungan. Solusinya adalah kita strip query string dari URLnya ketika melakukan pencarian.

pyk commented 8 years ago

@bobbypriambodo hmmm ini tantangan nya sih, satu berita punya lebih dari satu url yang berbeda.

Kalau mau melakukan preprocessing untuk input ke database (lewat rojak-pantau) atau lookup data (lewat rojak-api) ada beberapa catatan:

  1. Normalisasi protocol: http/https. kadang ada media yg gak bisa diakses lewat https misal: https://kompas.com, jadi untuk amannya mungkin http aja karena semua media pasti bisa
  2. Satu media bisa diakses dari beberapa sub-domain: news.detik.com & m.detik.com
  3. Beda host beda path. Misal:
  4. Ada extra params

Solusi yang paling naive mungkin, waktu mau lookup ke database kita lakukan ini:

  1. Extract host, no subdomain. (misal: tempo.co, merdeka.com, etc)
  2. Extract unique identifier dari url (misal untuk detikcom: d-3330331/bnn-minta-ahok-berani-tutup-tempat-hiburan-yang-terbukti-jual-narkoba)

Jadi ada tambahan column baru di table news: unique_identifier dan table media ada tambahan column: host.

Waktu lookup data dari api, kita tinggal ekstrak host sama unique identifiernya lalu query ke DB bisa semacam ini where media_host=host and unique_identifier=u. Untuk unique identifier nanti tiap media beda-beda sih.

Menurut kalian gimana?

cc: @girikuncoro @imrenagi @rawgni @kevinluvian @rilut

rawgni commented 8 years ago

@bobbypriambodo normally, link artikel yang dimaksud di dapat dari mana (dari site rojak atau dari site lain)?

Kalau dari site rojak, harusnya sih ga ada problem dengan non-matching artikel karena urlnya di dapat dari rojak-database.

Kalo dari site lain, artikel nya harus exists di rojak-database atau nga ? Kalau nga harus, apakah bisa langsung lewat rojak-analyzer saja ?

Thoughts?

bobbypriam commented 8 years ago

@pyk Konsepnya cukup reasonable sih dengan ekstrak host dan unique identifier. Tapi concern saya adalah perbedaan struktur url tiap-tiap media, khususnya misalnya untuk kasus yang nomor 3 (beda host beda path), kalau itu beda juga antara satu media dengan media yang lain, timbul masalah di implementasinya.

Edit: CMIIW, saya nangkepnya berarti preprocessing dilakukan baik oleh rojak-pantau ketika scraping dan rojak-api ketika lookup.

rojak-pantau mungkin bisa implementasi semacam interface function normalize_url(url) per-spider, tapi di API berarti kita harus meng-cater semua jenis media beserta struktur masing-masing (semacam if-else/case expressions yang besar) ketika normalizing URL yang diterima dari user input (dari search box pada rojak-ui). Bener ga ya? Atau ada cara untuk ngehandle itu?

@rawgni Use casenya yang disampaikan oleh @CodeRiderz di Slack adalah:

  1. Seseorang (yang tau ada aplikasi Rojak) lagi baca sebuah artikel berita (jadi artinya artikel dari site lain), lalu orang itu ingin tau penilaian sentimen berita itu seperti apa
  2. Orang tersebut buka aplikasi Rojak dan copas link berita tadi ke search box-nya Rojak
  3. Kalau artikel ada di DB Rojak, ia dapat hasilnya (either halaman news beserta penilaian atau apa). Kalau ga ada, mungkin diberi notifikasi bahwa artikel tersebut belum di-index.

Menurut saya dengan adanya API kita ga akan ngebolehin interaksi langsung dari UI ke rojak-database atau rojak-analyzer sih...

rawgni commented 8 years ago

@bobbypriambodo oh ok. got it :)