Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| talit:indexing [2025-02-13 15:48] – hof | talit:indexing [2025-11-11 06:22] (aktuell) – [Wortfrequenzen] hof | ||
|---|---|---|---|
| Zeile 106: | Zeile 106: | ||
| Grössere Datasets gibt es auf https:// | Grössere Datasets gibt es auf https:// | ||
| - | |||
| ### Aufgabe 2 - Movie Index | ### Aufgabe 2 - Movie Index | ||
| Erstelle einen Index aller WP-Artikel über Filme von 1985. Schreibe dazu eine Generator-Funktion, | Erstelle einen Index aller WP-Artikel über Filme von 1985. Schreibe dazu eine Generator-Funktion, | ||
| Zeile 119: | Zeile 118: | ||
| for url, text in reader: | for url, text in reader: | ||
| yield url, text | yield url, text | ||
| + | |||
| + | movie_index = build_text_index(read_movie_csv(filename)) | ||
| </ | </ | ||
| ++++ | ++++ | ||
| </ | </ | ||
| - | Wieviele Filme mit `' | + | Wieviele Filme mit `' |
| + | ? | ||
| ## Stop Wording | ## Stop Wording | ||
| Wenn du den erstellten Index untersuchst, | Wenn du den erstellten Index untersuchst, | ||
| Normalerweise werden solche _Stop Words_ bereits bei der Indexierung ignoriert. Natürlich könnten wir eine Stop-Word-Liste aus dem Internet laden - aber eigentlich haben wir ja alle Informationen selber bereits zur Hand, um eine solche zu erstellen: Wir kennen die Häufigkeit jedes Wortes, also in wie vielen Artikeln es vorkommt. Wörter, die in mehr als der Hälfte der Artikel vorkommen, dürften kaum interessant sein. Mehr als an der _absoluten_ Häufigkeit sind wir also interessiert an der _relativen_ Dokumentenhäufigkeit (_en._ document frequency): $\frac{frequency}{n}$. | Normalerweise werden solche _Stop Words_ bereits bei der Indexierung ignoriert. Natürlich könnten wir eine Stop-Word-Liste aus dem Internet laden - aber eigentlich haben wir ja alle Informationen selber bereits zur Hand, um eine solche zu erstellen: Wir kennen die Häufigkeit jedes Wortes, also in wie vielen Artikeln es vorkommt. Wörter, die in mehr als der Hälfte der Artikel vorkommen, dürften kaum interessant sein. Mehr als an der _absoluten_ Häufigkeit sind wir also interessiert an der _relativen_ Dokumentenhäufigkeit (_en._ document frequency): $\frac{frequency}{n}$. | ||
| - | |||
| ### Aufgabe 3 - Stop Words | ### Aufgabe 3 - Stop Words | ||
| Erstelle eine Liste aller Wörter in unserem Index, absteigend sortiert nach relativer Dokumentenhäufigkeit. | Erstelle eine Liste aller Wörter in unserem Index, absteigend sortiert nach relativer Dokumentenhäufigkeit. | ||
| Zeile 140: | Zeile 141: | ||
| cutoff = 0.5 | cutoff = 0.5 | ||
| freqs = [(word, len(docs) / n) for word, docs in movie_idx.items() if len(docs) / n > cutoff] | freqs = [(word, len(docs) / n) for word, docs in movie_idx.items() if len(docs) / n > cutoff] | ||
| + | # Absteigend sortieren nach relativer Frequenz: | ||
| import operator | import operator | ||
| freqs.sort(reverse=True, | freqs.sort(reverse=True, | ||
| Zeile 150: | Zeile 152: | ||
| import re | import re | ||
| for token in re.findall(" | for token in re.findall(" | ||
| + | token = token.lower() | ||
| if not token in stop_words: | if not token in stop_words: | ||
| - | yield token.lower() | + | yield token |
| | | ||
| </ | </ | ||
| ++++ | ++++ | ||
| </ | </ | ||
| + | |||
| + | |||
| ## Ranking | ## Ranking | ||
| Beim Information Retrieval geht es nicht nur darum, welche Dokumente zur Query passen, sondern welche _am besten_ dazu passen. Ranking ist eine komplexe und manchmal undurchsichtige Wissenschaft, | Beim Information Retrieval geht es nicht nur darum, welche Dokumente zur Query passen, sondern welche _am besten_ dazu passen. Ranking ist eine komplexe und manchmal undurchsichtige Wissenschaft, | ||
| Zeile 161: | Zeile 166: | ||
| Nehmen wir folgendes Beispiel: Wir indexieren alle Film-Artikel der 1980er Jahre und wollen möglichst gute Suchresultate für folgende Queries: | Nehmen wir folgendes Beispiel: Wir indexieren alle Film-Artikel der 1980er Jahre und wollen möglichst gute Suchresultate für folgende Queries: | ||
| * '' | * '' | ||
| + | * '' | ||
| + | * '' | ||
| Unsere Query-Funktion muss erstens mit mehreren Wörtern umgehen können - es bietet sich an, die `tokenize` Funktion auch hier anzuwenden und eine Suchanfrage für jedes Token in der Query durchzuführen. Die Frage ist allerdings, wie wir die einzelnen Resultatlisten kombinieren... | Unsere Query-Funktion muss erstens mit mehreren Wörtern umgehen können - es bietet sich an, die `tokenize` Funktion auch hier anzuwenden und eine Suchanfrage für jedes Token in der Query durchzuführen. Die Frage ist allerdings, wie wir die einzelnen Resultatlisten kombinieren... | ||
| Zeile 200: | Zeile 207: | ||
| Die Vereinigungsmenge hingegen liefert sehr viele Resultate für eine Query wie '' | Die Vereinigungsmenge hingegen liefert sehr viele Resultate für eine Query wie '' | ||
| - | |||
| #### Wortfrequenzen | #### Wortfrequenzen | ||
| - | Zuerst werden die Inverse | + | Zuerst werden die Document Frequencies in ein Dictionary überführt, |
| <code python> | <code python> | ||