Eine sehr naive Suchmaschine, implementiert mit Django-2.1.3, Python3.6.
Ich bin Django-Neuling und nicht sehr begabt im Schreiben, daher dient dieser Code nur als Referenz.
Titelseite
Pagination
Wir müssen einen invertierten Index sowie die Sendezeit, den Absender, den Betreff, den Themenlink usw. speichern, die einem Thema entsprechen. Deshalb habe ich die folgende Datenbankstruktur entworfen.
isIndexed
).Es ist zu beachten, dass beim Hinzufügen eines Schlüssel-Wert-Paares der folgende Code nicht verwendet werden kann
word . index [ doc . id ] = num
word . save ()
sollen
dic = word . index
dic [ doc . id ] = num
word . index = dic
word . save ()
Unten finden Sie den Code für das Modell in 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 )
Die erste ist die Homepage. Ihre Struktur ist wie folgt:
< 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 >
Es gibt Regelmäßigkeiten und kann direkt extrahiert werden. Während der Implementierung habe ich das BeautifulSoup-Paket von Python zum Extrahieren verwendet.
Während der Verwendung besteht der Schlüssel darin, den Parser zu übergeben, aber es gab ein Problem mit lxml. Schließlich habe ich html5lib verwendet.
Dann gibt es in der obigen Tabelle die vierte Spalte (d. h. das vierte td-Tag), in der das <a>
-Tag den Link zur Webseite darstellt, auf der sich das Thema befindet. Es muss ebenfalls extrahiert werden.
Da Zeit und Ort allgemeine Muster aufweisen, können gemeinsame Muster mithilfe regulärer Ausdrücke aufgelistet und abgeglichen werden
Mit dem Textrank-Algorithmus habe ich zunächst selbst einen sehr einfachen Textrank-Algorithmus implementiert, aber der Effekt war sehr gering. Später habe ich die offizielle Version von Textrank verwendet.
Dieser Teil basiert auf dem Prinzip des invertierten Index, der den Webseitentext in Wörter segmentiert, Satzzeichen usw. entfernt und dann das oben eingeführte Datenbankmodell zum Speichern des invertierten Index verwendet.
Unterhalb des Titels befindet sich zunächst eine Zeile mit Optionen, die nach diesen Feldern sortiert werden können. In der nächsten Zeile befindet sich dann eine Schaltfläche zum Aktualisieren und ein Suchformular.
Der folgende Inhalt sind die nach div
geordneten Suchergebnisse.
Jedes Ergebnis enthält einen Titel, Schlüsselwörter, Zeit, Ort und Zusammenfassung.
Hier habe ich den tf-idf
-Algorithmus selbst implementiert, um die Ergebnisse zu sortieren. Der Code lautet wie folgt
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 ]