Mesin pencari yang sangat naif diimplementasikan menggunakan Django-2.1.3, python3.6.
Saya baru mengenal Django dan tidak terlalu mahir dalam menulis, jadi kode ini hanya untuk referensi.
halaman depan
Paginasi
Kita perlu menyimpan indeks terbalik, serta waktu pengiriman, pengirim, subjek, tautan topik, dll. Jadi saya merancang struktur database berikut.
isIndexed
)Perlu dicatat bahwa menambahkan pasangan nilai kunci tidak dapat menggunakan kode berikut
word . index [ doc . id ] = num
word . save ()
sebaiknya
dic = word . index
dic [ doc . id ] = num
word . index = dic
word . save ()
Diberikan di bawah ini adalah kode untuk model di Django
from django . db import models
class Doc ( models . Model ):
sendTime = models . DateField () # 2018-12-12 , differ from DateTimeField which can be datetime or date
sender = models . CharField ( max_length = 20 )
messageType = models . CharField ( max_length = 20 ) # Journal, conf, et al
subject = models . CharField ( max_length = 100 )
begin = models . DateField ()
deadline = models . DateField ()
subjectUrl = models . CharField ( max_length = 100 )
webpageUrl = models . CharField ( max_length = 100 )
desc = models . CharField ( max_length = 250 , default = '' )
loc = models . CharField ( max_length = 40 , default = '' )
keywords = models . CharField ( max_length = 200 , default = '' )
def __str__ ( self ):
return self . subjectUrl
import json
class Wordindex ( models . Model ):
word = models . CharField ( max_length = 45 )
# model to store a list, another way is to create a custom field
_index = models . TextField ( null = True )
@ property
def index ( self ):
return json . loads ( self . _index )
@ index . setter
def index ( self , li ):
self . _index = json . dumps ( li )
def __str__ ( self ):
return self . word
class File ( models . Model ):
doc = models . OneToOneField ( Doc , on_delete = models . CASCADE )
content = models . TextField ( null = True )
isIndexed = models . BooleanField ( default = False )
def __str__ ( self ):
return 'file: {} -> doc: {}' . format ( self . id , self . doc . id )
Yang pertama adalah beranda.
< TBODY >
< TR VALIGN = TOP >
< TD > 03-Jan-2019 </ TD >
< TD > conf. ann. </ TD >
< TD > marta cimitile </ TD >
< TD > < A HREF =" http://www.cs.wisc.edu/dbworld/messages/2019-01/1546520301.html " rel =" nofollow " > Call forFUZZ IEEE Special Session </ A > </ TD >
< TD > 13-Jan-2019 </ TD >
< TD > < A rel =" nofollow " HREF =" http://sites.ieee.org/fuzzieee-2019/special-sessions/ " > web page </ A > </ TD >
</ TR > </ TBODY >
Ada keteraturannya dan bisa langsung diekstrak. Saat implementasi, saya menggunakan paket BeautifulSoup python untuk mengekstraknya.
Selama penggunaan, kuncinya adalah melewati parser. Saya mencoba html, tetapi ada masalah dengan lxml. Akhirnya saya menggunakan html5lib.
Lalu ada kolom keempat (yaitu tag td keempat) pada tabel di atas, dimana tag <a>
adalah link ke halaman web tempat topik tersebut berada.
Karena waktu dan tempat memiliki pola umum, pola umum dapat dicantumkan dan dicocokkan menggunakan ekspresi reguler
Dengan menggunakan algoritma textrank, saya pertama kali menerapkan algoritma textrank yang sangat mendasar, tetapi efeknya sangat buruk. Kemudian, saya menggunakan versi resmi dari text-rank.
Bagian ini didasarkan pada prinsip indeks terbalik, mengelompokkan teks halaman web menjadi kata-kata, menghilangkan tanda baca, dll., dan kemudian menggunakan model database yang diperkenalkan di atas untuk menyimpan indeks terbalik.
Pertama, di bawah judul terdapat deretan opsi yang dapat diurutkan berdasarkan kolom tersebut. Kemudian pada baris berikutnya terdapat tombol perbarui, dan formulir pengiriman pencarian.
Konten berikut adalah hasil pencarian yang disusun menggunakan div
.
Setiap hasil berisi judul, kata kunci, waktu, lokasi, dan ringkasan.
Disini saya sendiri yang mengimplementasikan algoritma tf-idf
untuk mengurutkan hasilnya
def tfidf ( words ):
if not words : return docs
ct = process ( words )
weight = {}
tf = {}
for term in ct :
try :
tf [ term ] = Wordindex . objects . get ( word = term ). index
except Exception as e :
print ( e )
tf [ term ] = {}
continue
for docid in tf [ term ]:
if docid not in weight :
weight [ docid ] = 0
N = len ( weight )
for term in ct :
dic = tf [ term ]
for docid , freq in dic . items ():
w = ( 1 + log10 ( freq )) * ( log10 ( N / len ( dic ))) * ct [ term ]
if term in stopWords :
w *= 0.3
weight [ docid ] += w
ids = sorted ( weight , key = lambda k : weight [ k ], reverse = True )
if len ( ids ) < 8 : pass #???
return [ Doc . objects . get ( id = int ( i )). __dict__ for i in ids ]