Endgültiges Projekt für CS 582 Information Abrufenkurs an der Universität von Illinois in Chicago
Verwenden Sie das Programm aus dem Terminal aus. Verwenden Sie einfach den Befehl:
Python main.py
Es wird ein Bericht vorgelegt, um die Funktionen und die Benutzeroberfläche der Suchmaschine besser zu erklären. Weitere Informationen finden Sie unter:
Report.pdf
Dieses Dokument ist ein Bericht für das endgültige Projekt von CS 582 Information Abruf an der Universität von Illinois in Chicago. Das Projekt bestand darin, eine Web -Suchmaschine für die UIC -Domäne von Grund auf neu zu erstellen. Die Software wurde modular erstellt, beginnend mit dem Web -Crawling, durch die Vorverarbeitung von Seiten, die Indexierung und das Hinzufügen einer grafischen Benutzeroberfläche. Darüber hinaus war eine von uns erfundene benutzerdefinierte „intelligente“ Komponente eine Voraussetzung.
Ich habe mich entschlossen, in der Suchmaschinenoptimierung zu experimentieren, indem ich die Abfrageerweiterung anhand eines Pseudo-Relevance-Feedback-Ansatzes verwendet habe, der versucht, einen breiten Kontext aus der Abfrage des Benutzers herauszuholen. Dies hätte hauptsächlich zwei Arten von Verbesserungen in die Suchmaschine erweitert haben:
Konzentrieren Sie sich nicht alle Ergebnisse nur auf die Wörter in der Abfrage, sondern einschließlich verschiedener und verwandter Inhalte in den abgerufenen Seiten von Seiten.
Erweiterung der Gesamtzahl der Ergebnisse, einschließlich Webseiten, die keine der in der Abfrage vorliegenden Wörter enthalten, aber für den Benutzer immer noch von Interesse sein können, da das gleiche Thema behandelt wird.
Eine Seitenrang -Implementierung ist ebenfalls integriert und kann von der Anwendungs -Benutzeroberfläche ein- oder ausgeschaltet werden. Weitere Details zu beiden intelligenten Komponenten finden Sie später in diesem Dokument.
Auf das Repository, das die Software enthält, kann über GitHub unter:
https://github.com/mirkomantovani/web-search-engine-uic
Die Software ist in Python3 in einer objektorientierten Programmiermode geschrieben, um sie für die Zukunft leicht auszudehnen. Um den Code einfach herunterzuladen und zu testen, ohne ein umfangreiches und zeitaufwändiges Kriech- und Seitenvorverarbeitung durchzuführen, enthält der Datensatz 10000 Seiten aus der UIC-Domäne: https://www.uic URLs) sind im Repository enthalten. Auf diese Weise kann durch Klonen des Repository die main.py ausgeführt werden, und in weniger als einer Sekunde ist die Suchmaschine bereit, Abfragen in die Eingabe zu erhalten. Die Skripte zum Ausführen des Krabbelns und der Vorverarbeitung werden jedoch auch in den folgenden Unterabschnitten mit allen anderen Komponenten enthalten und erläutert.
Das Web -Crawling kann durch Ausführen des Skripts multithreaded_crawling.py erfolgen. Das Kriechen erfolgt parallel, indem das Warteschlangenmodul verwendet wird, um auf synchronisierte Weise auf die Ressourcen zuzugreifen.
Das Krabbeln beginnt mit der UIC -CS -Subdomain: https://www.cs.uic.edu/ angegeben im Skript multithreaded_crawling.py .
Das Krabbeln erfolgt mit einer Breite-First-Strategie. Jede Seite wird mit der HTMLParser- Bibliothek dequed, heruntergeladen und analysiert. Die Links werden extrahiert und überprüft, um zur UIC-Domäne zu gehören, und dann zur FIFO-Warteschlange hinzugefügt, wenn sie sich in einem geeigneten Format befindet. Eine schwarze Liste aller schlechten Formate wurde von mir abgeleitet, als ich die Ergebnisse sah, die ich in das Krabbeln bekam, und es besteht in diesen 18 Formaten: ".docx", ".doc", ".avi", ".mp4", ".jpg", ".jpeg" .pngg ", .gif", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", "," den ",". ".tgz", ".zip", ".exe", ".js", ".css", ".ppt". Eine Zeitlimit von 10 Sekunden wird als maximale Zeit für das Herunterladen einer Seite angegeben, bevor die Verbindung geschlossen und zur nächsten Seite übergeht.
Die URLs werden auch modifiziert, nachdem sie extrahiert wurden, jeder anfängliche HTTP wird zu einem HTTPS, alle am Ende geschlitzten, werden beseitigt, die Abfragestreifen werden entfernt und auch die intra-Seiten-Links, die vom Hash-Symbol (#) ausdrückt (#), werden ebenfalls entfernt, um nicht zuzulassen, dass die Krawlempere, dass mehr Pages mit einem anderen In-Page-Glieder unterschiedliche Pages mit unterschiedlichen Bildern sind, und so unterschiedliche Bühnen sind. Darüber hinaus wurde die Handhabung von Links, bei denen ein <a> Tag geöffnet wird und ein weiteres Tag geöffnet wird, bevor das HREF geschlossen wurde, indem der Link beim Öffnen eines anderen Tags „<“ in der Zeichenfolge aufgeteilt wurde.
Während des Crawlings werden zwei Wörterbücher, URL aus Code und Code von URL ständig auf der Festplatte gespeichert. Der Code einer Webseite ist die Anzahl der heruntergeladenen Seite in chronologischer Reihenfolge.
Durch die Vorverarbeitung der krabbenden Seiten kann aus dem Skript run_preprozessing.py ausgeführt werden. Dort können Sie auch die Anzahl der zu berücksichtigenden Seiten und die maximale Anzahl von Iterationen des Seitenrangs angeben, indem Sie die entsprechenden Konstanten page_rank_max_iter und n_pages ändern.
Während der Vorverarbeitung wird ein CustomTokenizer -Objekt aus dem Skript precess.py verwendet. Jede Seite ist vorverarbeitet, indem der einfache Text zuerst in allen Tags mit Ausnahme von <Script> und <Styles> wird. Für diesen Schritt habe ich mich für eine sehr schnelle Bibliothek entschieden: SelectOlax , eine Python -API, die die in CPython geschriebene bescheidene Motors verwendet, die in der Rechenzeit in Bezug auf alle HTML -Parsen, die in reinem Python geschrieben wurden, natürlich mindestens eine Größenordnung liefern würde. Die Seite wird dann tokenisiert, die Token werden mit dem PorterStemmer von NLTK gestützt, die Stoppwörter werden unter Verwendung der Liste der Stoppwörter, die in der Datei stopwords.txt bereitgestellt werden, beseitigt, die Ziffern werden entfernt und die Wörter kürzer als 3 Buchstaben werden nicht berücksichtigt.
In der Vorverarbeitung wird der invertierte Index erstellt und der TF-IDF jedes Wort-Doc-Paares berechnet und im umgekehrten Index gespeichert. Ein gerichteter Web -Diagramm ( Graph.py ) wird ebenfalls erstellt und füttert die Implementierung des Seitenrangs in page_rank.py . Alle später benötigten Dateien, die zur Beantwortung der Abfrage benötigt werden, werden dann als Binärdateien gespeichert.
Die Gesamtzeit für die Vorverarbeitung und Page_Rank -Konvergenz für 10000 Seiten betrug ungefähr 236 Sekunden, die Laufzeit der Seitenrang betrug nur etwa 11 Sekunden.
Das Skript main.py enthält den Zugriffspunkt zur Suchmaschine. Wenn das Programm gestartet wird, wird ein CustomTokenizer -Objekt erstellt, um die Abfragen zu tokenisieren, ein TFIDFranker -Objekt stattdessen instanziiert, um die Dokumente basierend auf den Abfragen zu bewerten.
Wenn die Dokumente basierend auf der Abfrage eines Benutzers eingestuft werden, werden maximal 100 Dokumente berücksichtigt. Diese Konstante kann sich in Main ändern.
Die Benutzeroberfläche ist grafisch und wird mit dem Python -Paket: EasyGui implementiert. Die GUI ist ein erweiterbares Modul, CustomGui.py , das die Haupt -APIs für die grundlegenden Funktionen des Programms enthält.
Wenn das Programm startet, wird der Benutzer die grundlegenden Einstellungen gefragt, ob er den Seitenrang und den Kontext-Pseudo-Relevance-Feedback verwenden möchte oder nicht. Danach wird das Hauptmenü angezeigt. Das Hauptmenü zeigt die aktuellen Einstellungen der Suchmaschine und einige Schaltflächen für die wichtigsten Aktionen, die ausgeführt werden können. Die Einstellungen können zur Laufzeit dynamisch geändert werden, indem die entsprechende Schaltfläche aus dem Hauptmenü ausgewählt wird. Die anderen beiden Auswahlmöglichkeiten sind: Beenden des Programms und Ausführen einer Abfrage. Wenn der Benutzer die Taste drückt, um eine neue Abfrage zu erstellen, wird ein neues Fenster angezeigt, und der Benutzer wird aufgefordert, eine neue Abfrage einzufügen. Wenn er in Ordnung klickt, ist die Abfrage vorverarbeitet, und die Dokumente werden eingestuft und die ersten 10 (Variablen im Programm) werden zusammen mit den Informationen zur vorverarbeiteten Abfrage und möglicherweise zu den erweiterten Token angezeigt, wenn das Pseudo-Relevance-Feedback eingeschaltet ist. Der Benutzer kann jetzt auf ein Ergebnis klicken, um die Seite auf einer neuen Registerkarte auf dem Standardbrowser seines Systems auf einer neuen Registerkarte zu öffnen, oder kann am Ende der Liste rekursiv auf "Weitere Ergebnisse anzeigen" drücken, um 10 weitere Ergebnisse anzuzeigen. Wenn das Pseudo-Relevanz-Feedback ausgeschaltet ist, wird der Benutzer außerdem die Möglichkeit gegeben, die gleiche Abfrage mit der Erweiterung erneut auszusetzen.
Nachdem der Benutzer eine Abfrage ausgeführt und entschieden hat, ein Ergebnis zu stornieren oder zu öffnen, wird der Benutzer zum Hauptmenü zurückgegeben, in dem er die Einstellung ändern und/oder eine neue oder dieselbe Ausführung mit unterschiedlichen Einstellungen ausführen kann, um die Ergebnisse mit dem zuvor erhaltenen zu vergleichen.
Die Hauptherausforderungen, die ich während der Entwicklung dieses Projekts hatte, sind:
Zunächst war es wirklich schwierig zu wählen, welche Art von intelligenter Komponente zu gestalten ist. Ich habe keinerlei Erfahrung in dieser Art von Anwendung, und es ist einfach so schwierig, über Verbesserungen zu denken, ohne eine Demo zu testen.
Während des Implementierungsteils habe ich viel Zeit damit verbracht, etwas über Python -Bibliotheken und -konstrukte zu lernen, die ich noch nicht kannte, wie Threads, wie man Web -Scraping implementiert oder durchführt, um die Links von einer HTML -Seite herauszuholen. Eine andere Sache, die ich von Grund auf lernen musste, war, wie man in Python eine GUI erstellt.
Eine nervige Sache war die Tatsache, dass ich mehr als einmal 10000 Seiten kriechen musste, weil ich auf den Seiten verschiedene und falsche Formate gefunden habe. Am Ende hatte die gesamte Liste der Formate, die ich schwarze Liste hatte, eine Größe von 18 und es enthielt ".docx", ".doc", ".avi", ".mp4", ".jpg", ".jpeg", ".png", ".gif", ".pdff", ".gzzzzzzzzzzzz", ",", ",", ",", ",", ",", ",", ",", ",", "," den "," den. ".exe", ".js", ".css", ".ppt".
Eine sehr herausfordernde Sache war die Hyperparameter -Tuning und die Integration des Seitenrangs, um Dokumente zu bewerten. Der Parameter „ E “ , um zu entscheiden, wie wichtig es ist, den Token der erweiterten Abfrage zu geben, ist am schwierigsten zu stimmen, da Sie die durchschnittlichen Leistungen Ihrer Suchmaschine nicht kennen, wenn Sie keine Daten beschriftet haben (relevante Dokumente für jede Abfrage). Außerdem ist die Relevanz von Abfragen subjektiv, Sie wissen nie, was eine Person abrufen möchte, und Sie können nur anhand der Abfrage erraten. Ich entschied, dass das E höchstens 0,5 sein sollte, und am Ende habe ich es bei 0,1-0,2 festgelegt. Sie möchten die Abfrage nicht auf eine Menge verzerren, indem Sie den Wörtern, die vom Benutzer nicht eingegeben werden, viel Bedeutung geben.
Das Gewichtungsschema, das ich verwendete, war der einfache TF-IDF von Wörtern in Dokumenten, da es sich als einer der effektivsten bei Web-Suchmaschinen erwiesen hat und die Bedeutung von Wörtern in jedem Dokument in der richtigen Weise berücksichtigt. Ich habe nicht einmal darüber nachgedacht, eine andere Maßnahme auszuprobieren, nur weil es nicht der Zweck dieses Projekts war und dies nur gut zu funktionieren schien.
Die Ähnlichkeitsmaßnahme, die zum Rang von Dokumenten verwendet wurde, war die Ähnlichkeit der Cosinus . Ich habe aus der inneren Produktähnlichkeit implementiert und das Umschalten auf diese würde nur eine Frage der Änderung einer Codezeile darstellen. Ich denke, die Ähnlichkeit der Cosinus ist besser zu verwenden, da sie die Dokumentlänge und die Abfragelänge berücksichtigt. Es ist komplexer und funktioniert in dieser Art von Anwendungen in der Praxis normalerweise ziemlich gut, daher war es nicht wirklich ein Problem, die Ähnlichkeitsmessung zu wählen. Ich wusste nur, dass die Ähnlichkeit der Cosinus die richtige war.
Ich habe die Präzision mit 10 (nur die ersten 10 Ergebnisse in Betracht gezogen) für einige zufällige und vielfältige Fragen durchgeführt, die ich mir ausgedacht habe. Hier sind die Ergebnisse:
Abfrage: „Advisor-These“, das erste Ergebnis war https://grad.uic.edu/electronic-thesisdissertation-faqs , und ich denke, dass alle Ergebnisse mit der These und korrelierten Dingen in Verbindung gebracht wurden.
Abfrage: „Karrieremesse“, das erste Ergebnis war https://ecc.uic.edu/career-fairs und ich denke, dass alle Ergebnisse für Karrieremessen, Karrieredienste, Ereignisse und Beschäftigung etwas relevant waren .
Abfrage: „Forschungsassistent“, das erste Ergebnis war http://grad.uic.edu/assistantships, und ich denke, alle außer der letzten waren mit Assistenzungen verwandt, da es RA, Ta oder Ga ist, nur weil die UIC -Domäne keine bestimmte Seite für RA hat, also werde ich eine Präzision geben: P = 0,9 dieser Abfrage.
Abfrage: „Praktika und Jobs“, das erste Ergebnis war https://careerservices.uic.edu/studentents/internships und diesmal waren nur 6 Webseiten relevant, aber diejenigen, die nicht immer noch mit Karriere und Beschäftigung zusammenhängen. Ich werde eine Präzision geben: p = 0,6 für diese Abfrage.
Abfrage: „Student Center East Adresse“, das erste Ergebnis war https://fimweb.fim.uic.edu/buildingsdata.aspx, diese Abfrage ist spezifischer und komplexer. Ich werde eine Präzision geben: p = 0,4 für diese Abfrage.
Mit einer durchschnittlichen Präzision von 0,78 und der Tatsache, dass jede Abfrage mindestens ein relevantes Ergebnis zurückgegeben hat, denke ich, dass die Ergebnisse diskret sind.
Der erste Intelligent, mit dem ich experimentierte, war einfach und einfacher Seitenrang. Während der Vorverarbeitung von Seiten werden die Links extrahiert und basiert auf den Linkverbindungen, die ein Weltdiagramm erstellt werden. Die Implementierung des Seitenrangs war so, dass er mit dem gesamten Diagramm einen stark vernetzten Komponenten erstellt hat, was bedeutet, dass es aus jedem Knoten von einem anderen Knoten des Diagramms mit einer Nicht-Null-Wahrscheinlichkeit möglich ist. Mit dieser Interpretation besteht keine Möglichkeit, dass ein zufälliger Wanderer auf einer Seite stecken bleibt.
Die Seitenränge waren etwas schwierig in die Bewertung von Dokumenten zu integrieren, um sie zu bewerten. Zuerst habe ich versucht, nur eine lineare Kombination aus Kosinus -Ähnlichkeit und Seitenrängen durchzuführen und zu sehen, wie es funktioniert hat, und es war ziemlich schlimm, denn wenn das Gewicht des Seitenrangs zu viel war als die Homepage und andere autoritative Seiten würden immer in den Ergebnissen erscheinen. Wenn sich das Gewicht mehr zur Ähnlichkeit der Kosinus neigte, hätte der Seitenrang überhaupt keine Wirkung.
Der zweite Versuch führte zu ziemlich guten Ergebnissen. Im Grunde genommen habe ich nur die ersten 100 Ergebnisse verwendet und alles andere verworfen und sie als nicht relevant angesehen. Dann habe ich die lineare Kombination mit Seitenrang gemacht. Diesmal funktionierte es, weil es nur eine andere Permutation der bereits relevanten Dokumente war, und zum Beispiel die Homepage und andere maßgebliche Dokumente werden zu diesem Zeitpunkt bereits verworfen.
Ich denke, der Zweck des Seitenrangs in dieser Art von Anwendung wurde erreicht. Ich konnte eine normale Suche verzerrt, um relevantere maßgeblichere Seiten zu berücksichtigen, damit der Benutzer neben den Ergebnissen, die dem, was er in seiner Abfrage eingibt, sehr ähnlich ist, eher gute und zuverlässige Informationsquellen findet.
Das Kontext-Pseudo-Relevance-Feedback ( CPRF ) Ich habe diese Idee meines Prinzips und maßgeschneiderten Smart-Komponenten fast einen Monat aus der tatsächlichen Implementierung gefunden. Als ich implementierte, war ich mir nicht sicher, ob es wie erwartet funktioniert hätte, und ich hatte wirklich Angst, dass ich das alles für nichts getan habe.
Als ich darüber nachdachte, welche Art von intelligenter Komponente eine Web -Suchmaschine haben könnte, dachte ich, es wäre schön, wenn wir den Kontext der Benutzerabfrage erraten und ihm zusätzlich zu dem geben könnten, was er speziell fragt, einige Ergebnisse, die sehr mit dem zusammenhängen, was er gesucht hat. Eine einfache statische Abfrageerweiterung, die auf Synonymen basiert, wäre zu einfach gewesen und wäre nicht in der Lage gewesen, mit verwandte Inhalte zu erfassen, sondern eine andere Semantik zu haben.
Der Ausgangspunkt muss jedoch immer die Abfrage des Benutzers sein, da es zunächst nichts anderes gibt. Ich mochte die Idee, wie Pseudo-Relevanz-Feedback Sie Ihre Anfrage auf autonome Weise neu formulieren konnte. Natürlich ein explizites Relevanz -Feedback, wenn der Benutzer gefragt wird, welche anderen Wörter er in seine Abfrage einbeziehen möchte, wäre wahrscheinlich besser, aber gleichzeitig könnte es für ihn ärgerlich sein, einige Fragen während der Suche zu beantworten. Ein Pseudo-Relevanz-Feedback scheint eine angemessenere und einfache Möglichkeit zu sein, im Hintergrund eine komplexere Abfrage auszuführen, die der Benutzer nicht einmal bekannt ist.
Um einige Wörter zu extrahieren, die den Kontext der formulierten Abfrage ausdrücken könnten, entschied ich mich, einige intrinsische Informationen zu verwenden, die die ursprünglich abgerufenen Dokumente haben. Insbesondere denke ich, dass die Wörter mit dem höchsten TF-IDF in einem Dokument das Thema dieses Dokuments darstellen und was es von den anderen unterscheidet, da TF-IDF hoch ist, wenn das Wort nicht in vielen Dokumenten enthalten ist, aber in diesem Dokument wiederkehrend ist.
Der Prozess zum Extrahieren der Kontextwörter lautet wie folgt: Aus den Ranglistendokumenten nehme ich die Dokumente nummer_docs_expansion, die ich auf 30 festgelegt habe, aber in pseudo_relevance_feedback.py geändert werden konnte. Für jedes Dokument nehme ich die Token mit dem höchsten TF-IDF (konstante Nummer_TOP_TOKENS) und für jedes eindeutige Token in ihnen sammle ich alle TF-IDF dieses Wortes jedes Dokuments, wenn das Wort vorhanden ist. Am Ende rangiere ich die Token und die oberen Rangwörter sind die allgemeinen Wörter jedes abgerufenen Dokuments, die den Kontext der Abfrage darstellen. Ich kehre dann die n erweiterten Wörter (konstante Nummer_expansion_tokens) zurück, an die die Abfragetüken des Originals abgezogen werden, damit diese Wörter keine Wiederholungen haben und zu viel Bedeutung geben.
Die erweiterten Token erhalten ein Differenzgewicht, weniger als die ursprünglichen Wörter in der Abfrage. Diese E_Const kann in der statistics.py -Skript geändert werden.
Basierend auf den Fragen, die ich versuchte, denke die intelligente Komponente in einigen Fällen wirklich einige Verbesserungen.
Die ersten großen Ergebnisse, die immer funktionieren, sind die Fähigkeit, die Sets von abgerufenen Dokumenten zu erweitern. Wenn nur wenige Dokumente in der Abfrage ein Wort enthalten, würde die einfache Suchmaschine nur diese wenigen Dokumente abrufen. Stattdessen werden die Ergebnisse mit der CPRF -Smart -Komponente viel größer sein und möglicherweise immer zu einem abgerufenen Satz führen, dessen Größe mehr als 100 Dokumente beträgt.
Ein weiteres positives Ergebnis, das ich in einigen Abfragen bemerkte, ist, dass es tatsächlich findet, wonach ich als erstes Ergebnis gesucht habe, während die einfache Suchmaschine es nicht einmal in den Top Ten -Ergebnissen findet. Ein Beispiel dafür kann durch die Suche nach „Informatikkursen“ beobachtet werden. Ich wollte eine Liste aller Hauptkurse der Informatik an der UIC finden. Dies ist das erste Ergebnis, das der Motor abgerufen hat, wenn die intelligente Komponente aktiv ist. Stattdessen ist diese Seite nicht in den ersten Ergebnissen.
Zuletzt habe ich versucht, nach „Informationsabruf“ zu suchen, die Suchmaschine ohne CPRF war sehr schlecht. Das erste Ergebnis ist eine Suchseite für die UIC -Abteilungen. Dies liegt wahrscheinlich auch daran, dass es keine Seite zum Abrufen von Informationen in der UIC -Domain gibt oder es einfach nicht in der Domain enthalten ist. Mit der intelligenten Komponente wurden jedoch viele Webseiten im Zusammenhang mit diesem Grund gefunden. 2 der erweiterten Wörter waren „Cornelia caragea“, der Professor, der diesen Kurs unterrichtet, so viele Seiten waren in der Tat mit ihren Veröffentlichungen und ihren Arbeiten zum Abrufen des Informationsabrufs. Dies ist auch eine sehr gute Eigenschaft der Suchmaschine. Wenn sehr relevante Ergebnisse nicht gefunden werden können, kann es immer noch die bestmöglichen Ergebnisse über verwandte Dinge finden.
Wie in 5.3 erläutert, als ich den Vergleich zwischen der einfachen Suchmaschine und der Verwendung der intelligenten Komponente durchführte, denke ich, dass die produzierten Ergebnisse ziemlich gut waren, und ich habe das erwartet, als ich darüber nachdachte. Die zusammengefassten guten Dinge, die ich beim Testen bemerkte, waren:
Die Fähigkeit, viele weitere Ergebnisse zu finden, selbst wenn die ursprüngliche Abfrage nur eine Reihe von Websites ausgibt.
Die Fähigkeit zu finden, was ich tatsächlich als erste Ergebnisse gesucht habe, zum Beispiel in den Abfragen „Informatikkurse“ , wie ich in Absatz 5.3 erklärt habe.
Die sehr nette Eigenschaft, diskrete Inhalte abzurufen, selbst wenn der Korpus keine Seiten enthält, die für die Abfrage sehr relevant sind, und möglicherweise, wonach der Benutzer sucht, habe ich dies für die Abfrage „Information Abruf“ festgestellt, wie in Absatz 5.3 erläutert.
Eine Möglichkeit, die mir zeigte, dass dies die richtigen Ergebnisse erzielte, war die Tatsache, dass in den Top 10 wachsende Wörter, die den Kontext darstellen, einige Wörter, die zur Abfrage des Benutzers gehören, vorhanden waren. Dies zeigt, wie die Methode effektiv in der Lage ist, das Thema zu erfassen, und es gibt keine andere Möglichkeit, die anderen Wörter in diesem Satz zu beschreiben, wenn nicht als Wörter, die zum gleichen Kontext wie die in der ursprünglichen Abfrage gehören.
Sprechen Sie stattdessen über den Seitenrang. Ich denke, es macht seinen Job, aber es ändert die Rangliste nicht zu sehr in der Art und Weise, wie ich implementiert habe. Es ist nur eine Möglichkeit, die Ergebnisse zu verzerrt, um mehr autoritative Seiten zu bevorzugen, wenn es welche gibt.
Eines der Dinge, die von hier aus angegangen werden müssen, ist die Hyperparameter -Tuning. Es ist am schwierigsten, hauptsächlich wegen des Mangels an markierten Daten zu tun. Ich kann nicht wissen, welcher Wert eines Parameters besser funktioniert, wenn ich die Genauigkeit der Abfragen nicht bewerten kann, und um sie automatisch einzustellen, sollte es viele bereits beschriftete Daten geben.