Startseite BlogWeb-Scraping Anreicherung von Webseiten mit strukturierten Daten mit ChatGPT

Anreicherung von Webseiten mit strukturierten Daten mit ChatGPT

von Kadek

Trainieren Sie ein großes Sprachmodell, um herauszufinden, wie Sie Entitäten extrahieren können, und stellen Sie eine Schlüsselinformation über diese Entität bereit (ihre Wikipedia-URL).

Wenn Suchmaschinen Websites durchsuchen, versuchen sie, so viele Informationen wie möglich aus diesen Seiten zu gewinnen. Obwohl es in diesem Bereich enorme Entwicklungen gegeben hat, stellen sie bestenfalls Vermutungen an und verwenden Wahrscheinlichkeiten für die Informationen, die sie extrahieren.

Wenn Sie Suchmaschinen (oder anderen Anwendungen, die unsere Webseiten nutzen) strukturierte Daten zur Verfügung stellen, wird alles viel einfacher und ermöglicht sehr interessante Anwendungen und die Nutzung unserer Daten.

In vielen Fällen sind wir mit einer Situation konfrontiert, in der wir zahlreiche Seiten haben, die keine strukturierten Daten enthalten, aber es muss getan werden. Wir können natürlich den manuellen Weg gehen und unsere Inhalte einzeln klassifizieren/etikettieren. Wir können auch die jüngsten Fortschritte bei der Verwendung großer Sprachmodelle erkunden und sie für die spezielle Aufgabe trainieren, bestimmte Daten aus unseren Seiten zu extrahieren und das gewünschte zusätzliche Markup in Form von JSON-LD-Skripten zu erstellen. Aber wir sind nicht auf dieses Format beschränkt. Sobald wir Zugriff auf die Daten haben, können wir sie nach Belieben formatieren.

Hier finden Sie einen kurzen Überblick über das Problem, mit dem wir konfrontiert werden könnten, und die vorgeschlagenen Schritte zur Lösung des Problems:

  • Wir haben eine große Website mit (zehn- oder hundert-) tausenden von Seiten, die kein strukturiertes Markup haben (JSON-LD, Twitter, OpenGraph zum Beispiel).
  • Wir möchten ein strukturiertes Markup für diese Seiten erstellen.
  • Wir wollen dies in großem Maßstab tun.
  • Wir werden einen LLM darauf trainieren, Entitäten aus Artikeln zu extrahieren und einen Link zu der Wikipedia-Seite jeder Entität bereitzustellen.

Um die Dinge zu verdeutlichen, geben wir ChatGPT eine Eingabe wie die folgende, die die Zusammenfassung einer Wikipedia-Seite ist, in diesem Fall "Basketball". Es werden nur die ersten paar Zeilen angezeigt. Wir werden später das gesamte Beispiel durcharbeiten:

Basketball is a team sport in which two teams, most commonly of five players each, opposing one another on a rectangular court, compete with the primary objective of shooting a basketball (approximately 9.4 inches (24 cm) in diameter) through the defender’s hoop (a basket 18 inches (46 cm) in diameter mounted 10 feet (3.048 m) high to a backboard at each end of the court), while preventing the opposing team from shooting through their own hoop. A field goal is worth two points, unless made from behind the three-point line, when it is worth three…

Und wir möchten eine Antwort wie folgt erhalten:

idx Unternehmen url
0 James Naismith https://en.wikipedia.org/wiki/James_Naismith
1 Springfield, Massachusetts https://en.wikipedia.org/wiki/Springfield,_Massachusetts
2 National Basketball Association https://en.wikipedia.org/wiki/National_Basketball_Association
3 NBA https://en.wikipedia.org/wiki/National_Basketball_Association
4 EuroLeague https://en.wikipedia.org/wiki/EuroLeague
5 Basketball Champions League Americas https://en.wikipedia.org/wiki/Basketball_Champions_League_Americas
6 FIBA Basketball World Cup https://en.wikipedia.org/wiki/FIBA_Basketball_World_Cup
7 EuroBasket https://en.wikipedia.org/wiki/EuroBasket
8 FIBA AmeriCup https://en.wikipedia.org/wiki/FIBA_AmeriCup
9 FIBA Women’s Basketball World Cup https://en.wikipedia.org/wiki/FIBA_Women%27s_Basketball_World_Cup
10 WNBA https://en.wikipedia.org/wiki/Women%27s_National_Basketball_Association
11 NCAA Women’s Division I Basketball Championship https://en.wikipedia.org/wiki/NCAA_Division_I_women%27s_basketball_tournament
12 EuroLeague Frauen https://en.wikipedia.org/wiki/EuroLeague_Women

Es ist ein ziemlich ehrgeiziges Ziel, den Prozess der Extraktion von Entitäten zu automatisieren, und nicht nur das, wir werden auch ihre jeweiligen Wikipedia-URLs erhalten.

Sobald wir diese URLs haben, wird es einfacher, mehr Informationen über jede Entität zu erhalten, da wir diese Seite scrapen, Google durchsuchen und so weiter können. Aber zuerst brauchen wir diese erste Startseite. Über diesen Schritt werden wir in diesem Artikel nicht hinausgehen und uns auf den Prozess bis zu diesem Punkt konzentrieren.

Bevor wir mit der Codierung beginnen, lassen Sie uns zunächst einen Unterschied zwischen normalen Prompts und fein abgestimmten Modellen machen. Normale Prompts sind einfache Anweisungen oder Fragen, die das Modell anweisen, eine bestimmte Aufgabe zu erledigen, eine Frage zu beantworten oder einen Inhalt zu erstellen. Es soll eine universelle Frage/Antwort-Maschine sein, die als Ihr persönlicher Assistent fungieren kann. Bei der Feinabstimmung eines Modells hingegen trainieren wir das LLM für eine bestimmte Aufgabe, die es viel besser erfüllen wird als eine normale Eingabeaufforderung, mit der Einschränkung, dass es nur weiß, wie diese Aufgabe auszuführen ist. Es ist ein bisschen wie der Unterschied zwischen einem normalen Auto (normale Eingabeaufforderung) und einem U-Bahn-Zug (fein abgestimmte Modelle). Ihr Auto kann für verschiedene Aufgaben verwendet werden und kann fast alle unsere Transportbedürfnisse befriedigen. Ein U-Bahn-Zug kann nur eine Sache, nämlich von A nach B und zurück fahren. Er ist sehr eingeschränkt, aber er erfüllt diese Aufgabe extrem gut, viel besser als ein Auto und in einem viel größeren Maßstab. Hier ist ein kurzer Vergleich zwischen diesen beiden Ansätzen:

Bereich Normale Eingabeaufforderung Feinabgestimmtes Modell
Umfang Allgemein Spezifisch
Ausbildungsprozess In der Eingabeaufforderung enthalten Erledigt durch viele ähnliche, konsistente Beispiele
Allgemeinheit Alleskönner Sehr spezifisches Werkzeug

Wahrscheinlich haben Sie bereits mit normalen Eingabeaufforderungen experimentiert, und für die obige Aufgabe wäre das etwa die folgende:

"Extract the main entities of the following text, and provide the Wikipedia URL for each, format the response as a table:

FULL TEXT GOES HERE

Heutzutage befinden Sie sich hier in einer paradoxen Situation, die sich aus der begrenzten Länge der Aufforderungen ergibt. Wenn Sie eine gute Antwort erhalten möchten, müssen Sie eine sehr detaillierte Aufforderung mit Beispielen und klaren Anweisungen geben. Aber je mehr Beispiele und Anweisungen Sie geben, desto weniger Platz haben Sie für den Inhalt, der verarbeitet werden muss. Auch das Gegenteil ist der Fall. Mit einem fein abgestimmten Modell senden Sie nur ein Stück Text, das als Aufforderung dient. Unser trainiertes Modell wird nicht darüber nachdenken oder etwas anderes versuchen als das, wofür es trainiert wurde (die obige Aufgabe).

Lassen Sie uns kurz ein einfaches Verfahren zum Trainieren des LLM mit einem fein abgestimmten Modell durchgehen:

Eingabeaufforderung Antwort
blau sein
Blume fr
Buch bk
Meer sa
Fenster ww
Auto cr
Tasche ??

Nachdem Sie die obigen Beispiele durchgegangen sind, war es für Sie wahrscheinlich einfach herauszufinden, wie die letzte Aufforderung "bag" zu vervollständigen ist, denn die Beispiele davor waren konsistent und klar. Jede Antwort hat nur zwei Buchstaben, und wenn Sie sie auf die jeweilige Aufforderung beziehen, können Sie deutlich erkennen, dass es sich im Grunde um den ersten und den letzten Buchstaben dieser Aufforderung handelt. Je mehr Beispiele wir liefern, desto sicherer sind Sie, dass dies tatsächlich das Muster ist, nach dem wir suchen. Der Schlüssel liegt also darin, zahlreiche, eindeutige und vor allem konsistente Frage-Antwort-Paare bereitzustellen.

Genau so werden wir ChatGPT darauf trainieren, die benötigten Entitäten zu extrahieren. Unser "Prompt" wird einfach ein Artikel sein und es wird herausfinden, was damit zu tun ist (vorausgesetzt, wir haben in der Trainingsphase gute Arbeit geleistet).

In diesem Sinne werden unsere Prompts extrem einfach sein. Sie enthalten keine Anweisungen oder Erklärungen. Die Schwierigkeit besteht jedoch darin, eine ausreichend große Anzahl von Beispielen zu liefern, aus denen der LLM das von uns angestrebte Muster klar erkennen kann.

Der Trainingsplan

Wir müssen einen Datensatz mit den folgenden Bedingungen bereitstellen:

  • Eine große Anzahl von Artikeln (Hunderte)
  • Diese Artikel müssen von Menschen identifiziert und aus ihnen extrahiert werden.
  • Wir möchten nicht nur die Entitäten erhalten, sondern auch die Wikipedia-URL jeder Entität

Wo könnten wir einen solchen Datensatz finden? Auf Wikipedia selbst. Sie erfüllt all diese Bedingungen. Das war einfach. Jetzt die Implementierung. Glücklicherweise bietet die Wikipedia-API ein paar praktische Funktionen, die uns die Arbeit erleichtern. Für jeden Artikel können wir den Text zusammen mit verschiedenen interessanten Elementen herunterladen. Wir werden uns auf zwei von ihnen konzentrieren:

  • Zusammenfassung: Dies sind die ersten paar Absätze, die wir am Anfang jedes Artikels sehen.
  • Links: Eine Liste aller Links im Artikel, mit
import re
import json

import advertools as adv
import pandas as pd
import wikipediaapi
pd.options.display.max_columns = None
from IPython.display import display_html, display_markdown, IFrame
import openai

openai.api_key = 'YOUR OPEN AI API KEY'
Wenn Sie mitmachen und den vollständigen Code und die Trainingsdaten erhalten möchten, können Sie dies über das GitHub-Repos dieses Artikels tun.
Strukturierte Daten Chat GPT

Abrufen von Daten aus der Wikipedia-API

Wir werden den Prozess zunächst Schritt für Schritt für einen Wikipedia-Artikel durchgehen und dann verallgemeinern.

Wir initiieren zunächst die Wikipedia Objekt und verwenden es dann, um Daten für eine beliebige Seite zu erhalten. Um die Seite anzugeben, benötigen wir ihren Slug, den letzten Ordner des Pfadteils der URL https://en.wikipedia.org/wiki/Article_title "Artikel_Titel" in diesem Fall. Das ist sehr wichtig, denn es ist nicht immer einfach, diesen Teil der URL abzuleiten. In manchen Fällen ist es ganz einfach, wie z.B. /Pizza oder /Music, aber in vielen Fällen ist das nicht der Fall, wie z.B. /FIBA_Women's_Basketball_World_Cup

Wir erstellen nun eine Variable für die gewünschte Seite:

wiki_wiki = wikipediaapi.Wikipedia('en')
page_basketball = wiki_wiki.page('Basketball')

print(page_basketball.summary[:1500])
Basketball is a team sport in which two teams, most commonly of five players each, opposing one another on a rectangular court, compete with the primary objective of shooting a basketball (approximately 9.4 inches (24 cm) in diameter) through the defender's hoop (a basket 18 inches (46 cm) in diameter mounted 10 feet (3.048 m) high to a backboard at each end of the court), while preventing the opposing team from shooting through their own hoop. A field goal is worth two points, unless made from behind the three-point line, when it is worth three. After a foul, timed play stops and the player fouled or designated to shoot a technical foul is given one, two or three one-point free throws. The team with the most points at the end of the game wins, but if regulation play expires with the score tied, an additional period of play (overtime) is mandated.

Players advance the ball by bouncing it while walking or running (dribbling) or by passing it to a teammate, both of which require considerable skill. On offense, players may use a variety of shots – the layup, the jump shot, or a dunk; on defense, they may steal the ball from a dribbler, intercept passes, or block shots; either offense or defense may collect a rebound, that is, a missed shot that bounces from rim or backboard. It is a violation to lift or drag one's pivot foot without dribbling the ball, to carry it, or to hold the ball with both hands then resume dribbling.

The five players on each side fall into five playing posi

Wie Sie sehen können, können wir die summary Attribut dieses Objekts mit dem Text der Zusammenfassung. Oben sehen Sie die ersten paar Absätze der Zusammenfassung.

Ein weiteres interessantes Attribut, das wir erhalten können, ist die link Attribut. Dadurch erhalten wir den Text jedes Links sowie zusätzliche Informationen über jeden Link. Hier sehen wir die ersten paar Links, und wir drucken auch die Gesamtzahl der Links aus, um einen Eindruck zu bekommen.

Abrufen der Links eines Artikels

print(len(page_basketball.links))
list(page_basketball.links.items())[:20]

1309

[('16-inch softball', 16-inch softball (id: ??, ns: 0)),
 ('1936 Summer Olympics', 1936 Summer Olympics (id: ??, ns: 0)),
 ('1979 NBL Season', 1979 NBL Season (id: ??, ns: 0)),
 ('1992 Summer Olympics', 1992 Summer Olympics (id: ??, ns: 0)),
 ("1992 United States men's Olympic basketball team",
  1992 United States men's Olympic basketball team (id: ??, ns: 0)),
 ('1998 NBL Season', 1998 NBL Season (id: ??, ns: 0)),
 ('1998–99 NBL season', 1998–99 NBL season (id: ??, ns: 0)),
 ('1–2–1–1 zone press', 1–2–1–1 zone press (id: ??, ns: 0)),
 ('1–3–1 defense and offense', 1–3–1 defense and offense (id: ??, ns: 0)),
 ('2000–01 FIBA SuproLeague', 2000–01 FIBA SuproLeague (id: ??, ns: 0)),
 ('2004 Summer Olympics', 2004 Summer Olympics (id: ??, ns: 0)),
 ('2006 FIBA World Championship for Women',
  2006 FIBA World Championship for Women (id: ??, ns: 0)),
 ('2007 Asian Indoor Games', 2007 Asian Indoor Games (id: ??, ns: 0)),
 ("2008 United States men's Olympic basketball team",
  2008 United States men's Olympic basketball team (id: ??, ns: 0)),
 ('2009 Asian Youth Games', 2009 Asian Youth Games (id: ??, ns: 0)),
 ('2010 FIBA World Championship',
  2010 FIBA World Championship (id: ??, ns: 0)),
 ('2010 Youth Olympics', 2010 Youth Olympics (id: ??, ns: 0)),
 ('2011 FIBA 3x3 Youth World Championships',
  2011 FIBA 3x3 Youth World Championships (id: ??, ns: 0)),
 ('2012 FIBA 3x3 World Championships',
  2012 FIBA 3x3 World Championships (id: ??, ns: 0)),
 ('2014 FIBA Basketball World Cup',
  2014 FIBA Basketball World Cup (id: ??, ns: 0))]

Diese Links sind über den ganzen Artikel verstreut, und wir wollen nun die Links finden, die in der Zusammenfassung des Artikels vorkommen. Das können wir mit einem einfachen regulären Ausdruck erreichen.

Erstellen eines regulären Ausdrucks zum Extrahieren von Links, die wichtige Entitäten sind

Da wir den Ankertext jedes Links im Artikel haben, wird die Regex einfach eine Verkettung des Textes aller Links sein, getrennt durch den Pipe-Operator "oder". Die einzige andere Sache, die wir berücksichtigen müssen, ist die Sortierung der Links nach Länge. Hier ist ein einfaches Beispiel, um diesen Punkt zu veranschaulichen. Nehmen wir an, wir möchten alle Vorkommen des Wortes "gewonnen" oder "wunderbar" aus einem Textstück extrahieren. Lassen Sie uns zunächst die Regex testen won|wonderful:

import re

text="I won the game at the wonderful tournament"

re.findall('won|wonderful', text)
['won', 'won']

Was ist gerade passiert?

Die erste Instanz von "won", dem zweiten Wort im Satz, wurde korrekt extrahiert, aber die zweite nicht. Eigentlich schon, aber es war nicht das, was wir beabsichtigt hatten. Da wir zuerst "won" angegeben haben, beginnt die Regex-Engine nach diesem Muster zu suchen, und wenn sie es nicht findet, sucht sie nach der anderen Option. In unserem Fall fand sie die zweite Instanz von "won" direkt vor "derful". Nachdem die Regex-Engine das zweite "one" extrahiert hat, ist sie nun beim "d" angelangt, und ab dort gibt es keine weiteren Instanzen von "won". Versuchen wir dieselbe Regex, aber setzen Sie das längere Muster vor das kürzere:

re.findall('wonderful|won', text)
['won', 'wonderful']

Sie funktioniert jetzt wie vorgesehen. Aus diesem Grund werden wir unsere Regex zur Linkextraktion nach Länge sortieren, um diese Situation zu vermeiden.

Die andere Sache, die wir sicherstellen wollen, ist, dass wir ganze Wörter extrahieren wollen. Nehmen wir an, wir möchten das Muster "rest" extrahieren. Wenn die Regex-Engine das Wort "Restaurant" in dem eingegebenen Text findet, wird sie es als legitime Übereinstimmung mit dem Muster extrahieren. Aber das wollen wir nicht. Wir wollen nur "rest" als vollständiges Wort. Hierfür können wir das Wortgrenzenmuster in regulären Ausdrücken verwenden \b. Da das Backslack ein Sonderzeichen in der Regex ist, fügen wir ein weiteres Zeichen hinzu, um es zu umgehen. Unsere Regex wird wie folgt aussehen:

pattern_1\\b|\\bpattern_2\\b|\\bpattern_3 und so weiter.

Der folgende Code erzeugt die gewünschte Regex durch:

  1. Verkettung aller Ankertexte unserer Links
  2. Sortieren nach Länge, in absteigender Reihenfolge (längere Muster vor kürzeren)
  3. Verbinden Sie sie durch das Rohr | sowie das Wort das Wortbegrenzungszeichen \\b von beiden Seiten
page_basketball_linksregex = '\\b|\\b'.join(sorted(page_basketball.links.keys(), key=len, reverse=True))
page_basketball_linksregex[:400]
"List of U.S. high school basketball national player of the year awards\\b|\\bList of basketball players who have scored 100 points in a single game\\b|\\bYoung Men's Christian Association Building (Albany, New York)\\b|\\bCategory:Articles with dead external links from February 2021\\b|\\bCategory:Articles with disputed statements from January 2019\\b|\\bCategory:Articles with disputed statements from Janua"

Hier sind die ersten Zeilen unseres Zusammenfassungstextes, wobei der Ankertext der Entitäten hervorgehoben ist, damit Sie sich ein Bild davon machen können, wie das Ganze am Ende funktionieren wird:

Basketball is a team sport in which two teams, most commonly of five players each, opposing one another on a rectangular court, compete with the primary objective of shooting a basketball (approximately 9.4 inches (24 cm) in diameter) through the defender’s hoop (a basket 18 inches (46 cm) in diameter mounted 10 feet (3.048 m) high to a backboard at each end of the court), while preventing the opposing team from shooting through their own hoop. A field goal is worth two points, unless made from behind the three-point line, when it is worth three. After a foul, timed play stops and the player fouled or designated to shoot a technical foul is given one, two or three one-point free throws. The team with the most points at the end of the game wins, but if regulation play expires with the score tied, an additional period of play (overtime) is mandated.
Players advance the ball by bouncing it while walking or running (dribbling) or by passing it to a teammate, both of which require considerable skill. On offense, players may use a variety of shots – the layup, the jump shot, or a dunk; on defense, they may steal the ball from a dribbler, intercept passes, or block shots; either offense or defense may collect a rebound, that is, a missed shot that bounces from rim or backboard. It is a violation to lift or drag one’s pivot foot without dribbling the ball, to carry it, or to hold the ball with both hands then resume dribbling.
The five players on each side fall into five playing positions. The tallest player is usually the center, the second-tallest and strongest is the power forward, a slightly shorter but more agile player is the small forward, and the shortest players or the best ball handlers are the shooting guard and the point guard, who implements the coach’s game plan by managing the execution of offensive and defensive plays (player positioning). Informally, players may play three-on-three, two-on-two, and one-on-one.
Invented in 1891 by Canadian-American gym teacher James Naismith in Springfield, Massachusetts, in the United States, basketball has evolved to become one of the world’s most popular and widely viewed sports. The National Basketball Association (NBA) is the most significant professional basketball league in the world in terms of popularity, salaries, talent, and level of competition (drawing most of its talent from U.S. college basketball). Outside North America, the top clubs from national leagues qualify to continental championships such as the EuroLeague and the Basketball Champions League Americas. The FIBA Basketball World Cup and Men’s Olympic Basketball Tournament are the major international events of the sport and attract top national teams from around the world. Each continent hosts regional competitions for national teams, like EuroBasket and FIBA AmeriCup.
The FIBA Women’s Basketball World Cup and Women’s Olympic Basketball Tournament feature top national teams from continental championships. The main North American league is the WNBA (NCAA Women’s Division I Basketball Championship is also popular), whereas the strongest European clubs participate in the EuroLeague Women.

Jetzt möchten wir die Linktexte, die in der Zusammenfassung unseres Artikels übereinstimmen, abrufen und in ein einfaches Wörterbuch aufnehmen. Die Schlüssel werden die übereinstimmenden Ankertexte sein. Die Werte sind die Anfrageseite von Wikipedia (mit allen relevanten Daten).

Während wir die Werte festlegen, senden wir eine Anfrage an Wikipedia, um neue Daten über die entsprechende Seite zu erhalten. Das Endergebnis, also die links_wikis Wörterbuch enthält die vollständigen Informationen zu jedem extrahierten Treffer. Wir interessieren uns hauptsächlich für den Namen der Entität und ihre URL, so dass wir einen einfachen DataFrame erstellen können, um das gesuchte Endergebnis anzuzeigen.

links_wikis = {}
for match in re.finditer(page_basketball_linksregex, page_basketball.summary):
    links_wikis[match.group()] = wiki_wiki.page(match.group())

Strukturieren Sie die Entitäten und ihre Links (aus der Zusammenfassung des Arikels)

ent_link = pd.DataFrame({
    'entity': links_wikis.keys(),
    'url': [link.fullurl for link in links_wikis.values()]})
ent_link.style.set_caption('
<h3>Entitäten im Abschnitt Zusammenfassung der <code data-no-auto-translation="">/Basketball</code> wiki</h3>

<p>&#8216;)</p>

Entitäten im Abschnitt Zusammenfassung der /Basketball wiki

Unternehmen url
0 James Naismith https://en.wikipedia.org/wiki/James_Naismith
1 Springfield, Massachusetts https://en.wikipedia.org/wiki/Springfield,_Massachusetts
2 National Basketball Association https://en.wikipedia.org/wiki/National_Basketball_Association
3 NBA https://en.wikipedia.org/wiki/National_Basketball_Association
4 EuroLeague https://en.wikipedia.org/wiki/EuroLeague
5 Basketball Champions League Americas https://en.wikipedia.org/wiki/Basketball_Champions_League_Americas
6 FIBA Basketball World Cup https://en.wikipedia.org/wiki/FIBA_Basketball_World_Cup
7 EuroBasket https://en.wikipedia.org/wiki/EuroBasket
8 FIBA AmeriCup https://en.wikipedia.org/wiki/FIBA_AmeriCup
9 FIBA Women’s Basketball World Cup https://en.wikipedia.org/wiki/FIBA_Women%27s_Basketball_World_Cup
10 WNBA https://en.wikipedia.org/wiki/Women%27s_National_Basketball_Association
11 NCAA Women’s Division I Basketball Championship https://en.wikipedia.org/wiki/NCAA_Division_I_women%27s_basketball_tournament
12 EuroLeague Frauen https://en.wikipedia.org/wiki/EuroLeague_Women

Auf der Seite "Basketball" haben wir einen DataFrame erhalten, der in seinem zusammenfassenden Teil Entitäten und die zu jeder Entität gehörenden URLs enthält.

Der nächste Schritt besteht darin, diese Antwort einheitlich zu formatieren, damit ChatGPT genau weiß, wie es die Antworten für uns formatieren soll. Das Format wird wie folgt aussehen.

Formatieren Sie den GPT-Abschluss auf klare und konsistente Weise

Entity_1: https://en.wikipedia.org/wiki/Entity_1
Entity_2: https://en.wikipedia.org/wiki/Entity_2
Entity_3: https://en.wikipedia.org/wiki/Entity_3
...
completion = '@@'.join([': '.join(entity) for entity in ent_link.values])
print(*completion.split('@@'), sep='\n')
James Naismith: https://en.wikipedia.org/wiki/James_Naismith
Springfield, Massachusetts: https://en.wikipedia.org/wiki/Springfield,_Massachusetts
National Basketball Association: https://en.wikipedia.org/wiki/National_Basketball_Association
NBA: https://en.wikipedia.org/wiki/National_Basketball_Association
EuroLeague: https://en.wikipedia.org/wiki/EuroLeague
Basketball Champions League Americas: https://en.wikipedia.org/wiki/Basketball_Champions_League_Americas
FIBA Basketball World Cup: https://en.wikipedia.org/wiki/FIBA_Basketball_World_Cup
EuroBasket: https://en.wikipedia.org/wiki/EuroBasket
FIBA AmeriCup: https://en.wikipedia.org/wiki/FIBA_AmeriCup
FIBA Women's Basketball World Cup: https://en.wikipedia.org/wiki/FIBA_Women%27s_Basketball_World_Cup
WNBA: https://en.wikipedia.org/wiki/Women%27s_National_Basketball_Association
NCAA Women's Division I Basketball Championship: https://en.wikipedia.org/wiki/NCAA_Division_I_women%27s_basketball_tournament
EuroLeague Women: https://en.wikipedia.org/wiki/EuroLeague_Women

Jetzt wollen wir das Paar aus Eingabeaufforderung und Vervollständigung in das Standard-JSON-Format bringen, das ChatGPT benötigt, nämlich

{"prompt": "prompt text goes here", "completion": "completion text goes here"}

Kombinieren Sie Prompts und ihre Vervollständigungen in einem JSON-Format, das in einer jsonlines-Datei gespeichert wird (dies ist unser "Training")

print(json.dumps({"prompt":page_basketball.summary,"completion":completion}))
{"prompt": "Basketball is a team sport in which two teams, most commonly of five players each, opposing one another on a rectangular court, compete with the primary objective of shooting a basketball (approximately 9.4 inches (24 cm) in diameter) through the defender's hoop (a basket 18 inches (46 cm) in diameter mounted 10 feet (3.048 m) high to a backboard at each end of the court), while preventing the opposing team from shooting through their own hoop. A field goal is worth two points, unless made from behind the three-point line, when it is worth three. After a foul, timed play stops and the player fouled or designated to shoot a technical foul is given one, two or three one-point free throws. The team with the most points at the end of the game wins, but if regulation play expires with the score tied, an additional period of play (overtime) is mandated.\nPlayers advance the ball by bouncing it while walking or running (dribbling) or by passing it to a teammate, both of which require considerable skill. On offense, players may use a variety of shots \u2013 the layup, the jump shot, or a dunk; on defense, they may steal the ball from a dribbler, intercept passes, or block shots; either offense or defense may collect a rebound, that is, a missed shot that bounces from rim or backboard. It is a violation to lift or drag one's pivot foot without dribbling the ball, to carry it, or to hold the ball with both hands then resume dribbling.\nThe five players on each side fall into five playing positions. The tallest player is usually the center, the second-tallest and strongest is the power forward, a slightly shorter but more agile player is the small forward, and the shortest players or the best ball handlers are the shooting guard and the point guard, who implements the coach's game plan by managing the execution of offensive and defensive plays (player positioning). Informally, players may play three-on-three, two-on-two, and one-on-one.\nInvented in 1891 by Canadian-American gym teacher James Naismith in Springfield, Massachusetts, in the United States, basketball has evolved to become one of the world's most popular and widely viewed sports. The National Basketball Association (NBA) is the most significant professional basketball league in the world in terms of popularity, salaries, talent, and level of competition (drawing most of its talent from U.S. college basketball). Outside North America, the top clubs from national leagues qualify to continental championships such as the EuroLeague and the Basketball Champions League Americas. The FIBA Basketball World Cup and Men's Olympic Basketball Tournament are the major international events of the sport and attract top national teams from around the world. Each continent hosts regional competitions for national teams, like EuroBasket and FIBA AmeriCup.\nThe FIBA Women's Basketball World Cup and Women's Olympic Basketball Tournament feature top national teams from continental championships. The main North American league is the WNBA (NCAA Women's Division I Basketball Championship is also popular), whereas the strongest European clubs participate in the EuroLeague Women.", "completion": "James Naismith: https://en.wikipedia.org/wiki/James_Naismith@@Springfield, Massachusetts: https://en.wikipedia.org/wiki/Springfield,_Massachusetts@@National Basketball Association: https://en.wikipedia.org/wiki/National_Basketball_Association@@NBA: https://en.wikipedia.org/wiki/National_Basketball_Association@@EuroLeague: https://en.wikipedia.org/wiki/EuroLeague@@Basketball Champions League Americas: https://en.wikipedia.org/wiki/Basketball_Champions_League_Americas@@FIBA Basketball World Cup: https://en.wikipedia.org/wiki/FIBA_Basketball_World_Cup@@EuroBasket: https://en.wikipedia.org/wiki/EuroBasket@@FIBA AmeriCup: https://en.wikipedia.org/wiki/FIBA_AmeriCup@@FIBA Women's Basketball World Cup: https://en.wikipedia.org/wiki/FIBA_Women%27s_Basketball_World_Cup@@WNBA: https://en.wikipedia.org/wiki/Women%27s_National_Basketball_Association@@NCAA Women's Division I Basketball Championship: https://en.wikipedia.org/wiki/NCAA_Division_I_women%27s_basketball_tournament@@EuroLeague Women: https://en.wikipedia.org/wiki/EuroLeague_Women"}
# for link, name in links_wikis.items():
#     display_markdown(f'### {link}', raw=True)
#     display_markdown(name.summary, raw=True)
#     print()

Nachdem wir dies nun für eine Wikipedia-Seite getan haben, können wir all diese Schritte in einer Funktion zusammenfassen. Diese Funktion nimmt eine Wikipedia-Seite als Eingabe und gibt das JSON-Objekt zurück, wie wir es im letzten Schritt getan haben.

Wichtiger Hinweis zur Formatierung von Aufforderungen und Antworten: Es muss klar angegeben werden, wo die Aufforderung endet und wo die Antwort endet. Das kann alles Mögliche sein, und ein höchst unwahrscheinliches Textmuster ist eine gute Wahl, z.B. zwei Newlin-Zeichen gefolgt von einer Reihe von Dollarzeichen.

Erstellen Sie eine Funktion, die einen Wikipedia-Slogan annimmt, z.B. /Basketball und gibt die gewünschte JSON-Zeichenfolge zurück

Dies kombiniert alle bisher durchgeführten Schritte. In der Funktion steht "ner" für "named entity recognition".

prompt_end = '\n\n%%%%%\n'
completion_end = '\n\n^^^^^\n'

def wikipedia_ner(page):
    wikipage = wiki_wiki.page(page)
    page_links_regex = '\\b|\\b'.join(sorted(wikipage.links.keys(), key=len, reverse=True))
    links_wikis = {}
    for match in re.finditer(page_links_regex, wikipage.summary):
        links_wikis[match.group()] = wiki_wiki.page(match.group())
    ent_link = pd.DataFrame({
        'entity': links_wikis.keys(),
        'url': [link.fullurl for link in links_wikis.values()]})
    completion = ' ' + '@@'.join([': '.join(entity) for entity in ent_link.values])
    training_dict = {
        'prompt': wikipage.summary + prompt_end,
        'completion': completion + completion_end}
    return json.dumps(training_dict)

Testen Sie es erneut mit /Basketball

Da wir nun alle Schritte in einen einzigen Befehl zusammengefasst haben, wollen wir sehen, wie es mit der gleichen Seite funktioniert, mit der wir begonnen haben.

basketball = wikipedia_ner('Basketball')
print(json.loads(basketball)['prompt'])
Basketball is a team sport in which two teams, most commonly of five players each, opposing one another on a rectangular court, compete with the primary objective of shooting a basketball (approximately 9.4 inches (24 cm) in diameter) through the defender's hoop (a basket 18 inches (46 cm) in diameter mounted 10 feet (3.048 m) high to a backboard at each end of the court), while preventing the opposing team from shooting through their own hoop. A field goal is worth two points, unless made from behind the three-point line, when it is worth three. After a foul, timed play stops and the player fouled or designated to shoot a technical foul is given one, two or three one-point free throws. The team with the most points at the end of the game wins, but if regulation play expires with the score tied, an additional period of play (overtime) is mandated.
Players advance the ball by bouncing it while walking or running (dribbling) or by passing it to a teammate, both of which require considerable skill. On offense, players may use a variety of shots – the layup, the jump shot, or a dunk; on defense, they may steal the ball from a dribbler, intercept passes, or block shots; either offense or defense may collect a rebound, that is, a missed shot that bounces from rim or backboard. It is a violation to lift or drag one's pivot foot without dribbling the ball, to carry it, or to hold the ball with both hands then resume dribbling.
The five players on each side fall into five playing positions. The tallest player is usually the center, the second-tallest and strongest is the power forward, a slightly shorter but more agile player is the small forward, and the shortest players or the best ball handlers are the shooting guard and the point guard, who implements the coach's game plan by managing the execution of offensive and defensive plays (player positioning). Informally, players may play three-on-three, two-on-two, and one-on-one.
Invented in 1891 by Canadian-American gym teacher James Naismith in Springfield, Massachusetts, in the United States, basketball has evolved to become one of the world's most popular and widely viewed sports. The National Basketball Association (NBA) is the most significant professional basketball league in the world in terms of popularity, salaries, talent, and level of competition (drawing most of its talent from U.S. college basketball). Outside North America, the top clubs from national leagues qualify to continental championships such as the EuroLeague and the Basketball Champions League Americas. The FIBA Basketball World Cup and Men's Olympic Basketball Tournament are the major international events of the sport and attract top national teams from around the world. Each continent hosts regional competitions for national teams, like EuroBasket and FIBA AmeriCup.
The FIBA Women's Basketball World Cup and Women's Olympic Basketball Tournament feature top national teams from continental championships. The main North American league is the WNBA (NCAA Women's Division I Basketball Championship is also popular), whereas the strongest European clubs participate in the EuroLeague Women.

%%%%%
print(*json.loads(basketball)['completion'].split('@@'), sep='\n')
James Naismith: https://en.wikipedia.org/wiki/James_Naismith
Springfield, Massachusetts: https://en.wikipedia.org/wiki/Springfield,_Massachusetts
National Basketball Association: https://en.wikipedia.org/wiki/National_Basketball_Association
NBA: https://en.wikipedia.org/wiki/National_Basketball_Association
EuroLeague: https://en.wikipedia.org/wiki/EuroLeague
Basketball Champions League Americas: https://en.wikipedia.org/wiki/Basketball_Champions_League_Americas
FIBA Basketball World Cup: https://en.wikipedia.org/wiki/FIBA_Basketball_World_Cup
EuroBasket: https://en.wikipedia.org/wiki/EuroBasket
FIBA AmeriCup: https://en.wikipedia.org/wiki/FIBA_AmeriCup
FIBA Women's Basketball World Cup: https://en.wikipedia.org/wiki/FIBA_Women%27s_Basketball_World_Cup
WNBA: https://en.wikipedia.org/wiki/Women%27s_National_Basketball_Association
NCAA Women's Division I Basketball Championship: https://en.wikipedia.org/wiki/NCAA_Division_I_women%27s_basketball_tournament
EuroLeague Women: https://en.wikipedia.org/wiki/EuroLeague_Women

^^^^^

Lassen Sie uns dies nun im großen Maßstab tun.

Holen Sie sich tausend Wikipedia URLs/Slugs beliebter Seiten, extrahieren Sie Entitäten und Links

Wir wollen eine zufällige Liste von Wikipedia-URLs finden und ihren zusammenfassenden Text zusammen mit den extrahierten Entitäten (und ihren URLs) erhalten. Dazu werden wir advertools verwenden, ein Python-Paket, das unter anderem einen SEO-Crawler enthält.

Wir ziehen es vor, die Daten für beliebte Wikipedia-Seiten zu erhalten. Der Grund dafür ist, dass je beliebter eine Seite ist, desto mehr Menschen an ihrer Bearbeitung arbeiten und daher die Qualität der extrahierten Entitäten besser sein wird. Der folgende Code beginnt mit der Auflistung der fünfundzwanzig meistbesuchten Wikipedia-Seiten und folgt von dort aus den Links. Ich habe in jeder Zeile Kommentare eingefügt, die etwas mehr über die Funktionsweise erklären.

adv.crawl(
    url_list="https://en.wikipedia.org/wiki/Wikipedia:Top_25_Report",
    output_file="wiki_crawl.jl",
    # for each crawled page, should the crawler follow discovered links?
    # this is also known as "spider mode" as opposed to "list mode" where 
    # only the given URLs are crawled
    follow_links=True,
    # out of the disovered links, which ones should the crawler follow?
    # follow links that match the following regex:
    include_url_regex='https://en.wikipedia.org/wiki/[A-Z].+',
    # same as the previous parameter, but for exclusion, this is to prevent
    # following fragments
    exclude_url_regex='#',
    # further customization of the crawling process
    custom_settings={
        # stop crawling after a certain number of pages
        'CLOSESPIDER_PAGECOUNT': 1500,
        # save the logs of the crawl process in this file (good for debugging)
        'LOG_FILE': 'wiki_crawl.jl',
        # save the details of the current crawl job to a folder, so we can
        # pause/resume the crawl without having to re-crawl the same pages again
        'JOBDIR': 'wikicrawl_job'
    })

Übersicht über den Crawl-Datensatz:

wiki_crawl = pd.read_json('wiki_crawl.jl', lines=True)
wiki_crawl.head(3)
url Titel Ansichtsfenster Zeichensatz h1 h2 h3 kanonisch alt_href og:Titel ... jsonld_1_autor.name jsonld_1_publisher.@type jsonld_1_verlag.name jsonld_1_publisher.logo.@type jsonld_1_publisher.logo.url resp_headers_set-cookie request_headers_referer h4 img_usemap h5
0 https://en.wikipedia.org/wiki/Wikipedia:Top_25_Report Wikipedia:Top 25 Bericht - Wikipedia width=1000 UTF-8 Wikipedia:Top 25 Bericht Beliebteste Wikipedia-Artikel der Woche (16. bis 22. April 2023)[Bearbeiten] Ausschlüsse[edit] https://en.wikipedia.org/wiki/Wikipedia:Top_25_Report //de.m.wikipedia.org/wiki/Wikipedia:Top_25_Report@@/w/index.php?title=Wikipedia:Top_25_Report&action=edit@@/w/index.... Wikipedia:Top 25 Bericht - Wikipedia ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 https://en.wikipedia.org/wiki/ChatGPT ChatGPT - Wikipedia width=1000 UTF-8 ChatGPT Inhalt@@Ausbildung@@Merkmale und Grenzen@@Service@@Empfang@@Implikationen@@Ethische Bedenken@@Kulturelle Auswirkungen@@K... Funktionen@@Einschränkungen@@Basisservice@@Premiumservice@@Support für Softwareentwickler@@Sicherheitslücke vom März 2023@@Andere... https://en.wikipedia.org/wiki/ChatGPT //de.m.wikipedia.org/wiki/ChatGPT@@/w/index.php?title=Special:RecentChanges&feed=atom ChatGPT - Wikipedia ... Mitwirkende an Wikimedia-Projekten Organisation Wikimedia Foundation, Inc. ImageObject https://www.wikimedia.org/static/images/wmf-hor-googpub.png WMF-DP=46f;Path=/;HttpOnly;secure;Expires=Mon, 01 May 2023 00:00:00 GMT https://en.wikipedia.org/wiki/Wikipedia:Top_25_Report NaN NaN NaN
2 https://en.wikipedia.org/wiki/Wikipedia:Humor Wikipedia:Humor - Wikipedia width=1000 UTF-8 Wikipedia:Humor Inhalt@@Humor braucht Indikatoren[Bearbeiten]@@Warum verantwortungsvoller Humor wichtig ist[Bearbeiten]@@Humor in Artikeln[Bearbeiten]@@Humor aus... Wie Humor einbezogen werden kann[Bearbeiten] https://en.wikipedia.org/wiki/Wikipedia:Humor //de.m.wikipedia.org/wiki/Wikipedia:Humor@@/w/index.php?title=Wikipedia:Humor&action=edit@@/w/index.php?title=Specia... Wikipedia:Humor - Wikipedia ... NaN NaN NaN NaN NaN NaN https://en.wikipedia.org/wiki/Wikipedia:Top_25_Report NaN NaN NaN

3 Zeilen × 107 Spalten

Extrahieren Sie URL-Slugs aus gecrawlten Seiten.

wikipedia_slugs = wiki_crawl[~wiki_crawl['url'].str.contains('[a-zA-Z]:[a-zA-Z]')]['url'].str.rsplit('/').str[-1].tolist()
wikipedia_slugs[:30]
['ChatGPT',
 'Mario',
 'Netflix',
 'GPT-3',
 'Language_models',
 'LLaMA',
 'Meta_AI',
 'Bard_(chatbot)',
 'Ambedkar_Jayanti',
 'The_Greatest_Indian',
 'The_Matrix',
 'Dalai_Lama',
 'Academic_plagiarism',
 'Hyderabad',
 'B._R._Ambedkar',
 'Bon_Jovi',
 'Mahatma_Gandhi',
 'Mario_Bros.',
 'Satoru_Iwata',
 'San_Diego_Comic-Con',
 'A_Perfect_Crime_(TV_series)',
 'If',
 'V_Wars',
 'When_They_See_Us',
 'AJ_and_the_Queen',
 'Unbelievable_(miniseries)',
 'Trinkets_(TV_series)',
 'Trailer_Park_Boys:_The_Animated_Series',
 'Twelve_Forever',
 'Turn_Up_Charlie']

Gehen Sie durch die Slugs und extrahieren Sie Entitäten und Links

entity_responses = []
errors = []
for i, slug in enumerate(wikipedia_slugs):
    try:
        print(f'{i:>4}Getting: /{slug}', end='\r')
        wikipage = wikipedia_ner(slug)
        entity_responses.append(wikipage)
    except Exception as e:
        err = (slug, str(e))
        errors.append(err)
        print('Error: ', err)

Erstellen Sie die Trainingsdatei

with open('training_data_wikipedia_ner.jsonl', 'w') as file:
    for resp in entity_responses:
        prompt = json.loads(resp)['prompt']
        completion = json.loads(resp)['completion']
        if prompt:
            print(json.dumps({'prompt': prompt, 'completion': completion}), file=file)

Damit ist unser Trainingsmodell fertig. Es handelt sich um einen einfachen Satz von Eingabeaufforderung/Vervollständigung-Paaren, die hochgeladen und mit ChatGPT verwendet werden können.

Sie können es mit dieser App zur Entitätsextraktion live ausprobieren und sehen, wie es funktioniert.

Verwandte Beiträge

Einen Kommentar hinterlassen