Subskrybuj newsletter o cyfrowej humanistyce i innowacjach w sektorze kultury

Analizujemy maszynowo hasła Wikipedii poświęcone muzeom (część I)

Okładka lekcji: mordka czarnego kota na tle interfejsu Wikipedii / Źródło: AI

Wprowadzenie

Przez cały wrzesień 2024 roku polską wersję Wikipedii odwiedziło ponad 28 mln użytkowników, generując ponad 250 mln odsłon. To dziś jedno z podstawowych źródeł wiedzy, ale też aktywna społeczność, która wobec skomplikowanego systemu reguł negocjuje treści poszczególnych haseł. To wszystko sprawia, że warto ją badać, a hasła wikipedystyczne mogą być analizowane pod kątem tego, w jaki sposób opisują określone zjawiska, osoby czy instytucje.

W ramach tego cyklu lekcji poznamy możliwości maszynowego, automatycznego przetwarzania i analizowania treści Wikipedii.

Cele lekcji

Celem pierwszej lekcji z cyklu jest poznanie podstaw korzystania z biblioteki WikipediR.

Efekty

Efektem naszej pracy będą dane i prosta wizualizacja, opisująca objętość haseł polskiej Wikipedii poświęconych wybranym muzeom.

Wymagania

Łatwy dostęp do metod interfejsu programistycznego Wikipedii zapewnimy sobie za pomocą uruchamianego w środowisku Posit.cloud pakietu WikipediR. Korzystanie z Posit.cloud wymaga założenia darmowego konta.

Część merytoryczna

Zanim zalogujemy się na Posit.cloud i zaczniemy pracę z pakietem WikipediR, wejdźmy na stronę Wikipedii i przykładowe hasło - Muzeum Narodowe w Krakowie. Analizując tę stronę, możemy rozpoznać rodzaje treści (informacji), jakie powinniśmy móc pozyskać maszynowo, np.:

  • treść hasła,
  • poprzednie wersje treści hasła,
  • linki wewnętrzne (odnośniki do innych haseł Wikipedii),
  • linki zewnętrzne,
  • kategorie, do których przypisano hasło,
  • materiały wizualne umieszczone w treści hasła.

Część z tych informacji (danych) będziemy mogli pozyskać bezpośrednio dzięki metodom biblioteki WikipediR, pozyskanie części wymagać będzie nieco większej pracy (i łączenia ze sobą różnych metod). Dostęp to tak wielu elementów pozwala planować analizy wykraczające poza prostą pracę z treścią merytoryczną hasła.

Funkcja page_info

Pierwszym ćwiczeniem z wykorzystaniem WikipediR będzie porównywanie objętości haseł. Przygotujmy taką analizę dla haseł poświęconych muzeom narodowym w Gdańsku, Kielcach, Krakowie, Lublinie, Poznaniu, Szczecinie, Warszawie i Wrocławiu.

Zalogujmy się do Posit.cloud, załóżmy nowy projekt i zdefiniujmy wektor wieloelementowy R, w którym trzymać będziemy tytuły interesujących nas haseł:

museums <- c(
  "Muzeum Narodowe w Gdańsku",
  "Muzeum Narodowe w Kielcach",
  "Muzeum Narodowe w Krakowie",
  "Muzeum Narodowe w Lublinie",
  "Muzeum Narodowe w Poznaniu",
  "Muzeum Narodowe w Szczecinie",
  "Muzeum Narodowe w Warszawie",
  "Muzeum Narodowe we Wrocławiu"
)

W bibliotece WikipediR znajdziemy metodę page_info, która korzysta z oryginalnej metody API Wikipedii - Info, wyświetlającej dane na temat wybranej strony (hasła).

Spróbujmy użyć tej metody do zbadania objętości hasła poświęconego Muzeum Narodowemu w Gdańsku (wcześniej oczywiście zainstalujmy pakiet i wczytajmy go do środowiska):

install.packages("WikipediR")
library(WikipediR)

info <- page_info("pl","wikipedia", page = "Muzeum Narodowe w Gdańsku")

Zwróćmy uwagę na niezbędne dane, które przekazujemy do tej funkcji - są one bardzo podobne w większości metod z pakietu WikipediR. To uniwersalna biblioteka, którą możemy badać różne projekty wikimediów w różnych językach, dlatego uruchamiając jej metody, musimy podać, o jaki projekt nam chodzi.

Polecenie

str(info)

wyświetli nam strukturę odpowiedzi, jaką otrzymaliśmy z API Wikipedii:

List of 2
 $ batchcomplete: chr ""
 $ query        :List of 1
 ..$ pages:List of 1
  .. ..$ 1092370:List of 16
  .. .. ..$ pageid              : int 1092370
  .. .. ..$ ns                  : int 0
  .. .. ..$ title               : chr "Muzeum Narodowe w Gdańsku"
  .. .. ..$ contentmodel        : chr "wikitext"
  .. .. ..$ pagelanguage        : chr "pl"
  .. .. ..$ pagelanguagehtmlcode: chr "pl"
  .. .. ..$ pagelanguagedir     : chr "ltr"
  .. .. ..$ touched             : chr "2024-10-04T08:29:30Z"
  .. .. ..$ lastrevid           : int 74880796
  .. .. ..$ length              : int 11566
  .. .. ..$ protection          : list()
  .. .. ..$ restrictiontypes    :List of 2
  .. .. .. ..$ : chr "edit"
  .. .. .. ..$ : chr "move"
  .. .. ..$ fullurl             : chr "https://pl.wikipedia.org/wiki/Muzeum_Narodowe_w_Gda%C5%84sku"
  .. .. ..$ editurl             : chr "https://pl.wikipedia.org/w/index.php?title=Muzeum_Narodowe_w_Gda%C5%84sku&action=edit"
  .. .. ..$ canonicalurl        : chr "https://pl.wikipedia.org/wiki/Muzeum_Narodowe_w_Gda%C5%84sku"
  .. .. ..$ displaytitle        : chr "Muzeum Narodowe w Gdańsku"
 - attr(*, "class")= chr "pageinfo"

Oprócz podstawowych danych o stronie znajdziemy tam - w kluczu length - objętość treści strony w bajtach (znakach). Aby wyświetlić tę wartość, musimy dostać się do wnętrza uzyskanego obiektu (jak widać, są tam listy wewnątrz list). Poprawne zaadresowanie musi być uniwersalne, dlatego zamiast podawać bezpośrednio id badanej strony (tutaj 1092370)

info$query$pages$'1092370'$length
# [1] 11566

użyjemy operatora [[1]]:

info$query$pages[[1]]$length
# [1] 11566

Operator [[1]] pozwala wyświetlić (pobrać) pierwszy element z listy, w tym przypadku chcemy uzyskać dostęp do danych umieszczonych na pierwszej (i jedynej) liście, umieszczonej w liście pages.

Wysyłamy zapytania w pętli

Teraz wystarczy tylko użyć pętli, która do ramki danych zapisywać będzie tytuły analizowanej strony i jej objętość:

# tworzymy pustą ramkę danych
museum_pages_length <- data.frame()

# zaczynamy definiować pętlę
# będziemy iterowali po wszystkich elementach wektora museums
for(page_title in museums) {
  
  # wysyłamy żądanie do API Wikipedii
  # dynamicznie podmieniamy tytuł analizowanej strony
  info <- page_info("pl","wikipedia", page = page_title)  
  # wyciągamy z odpowiedzi infromację o objętości tej strony
  length <- info$query$pages[[1]]$length
  # tworzymy listę z dwoma kluczami
  museum_data <- list(
    title = page_title,
    length = length
  )
  # dodajemy ją jako wiersz do istniejącej już ramki
  museum_pages_length <- rbind(museum_pages_length, museum_data)
}

W efekcie otrzymujemy osiem obserwacji (wierszy) w dwóch kategoriach (kolumnach):

museum_pages_length
#                         title length
#1    Muzeum Narodowe w Gdańsku  11566
#2   Muzeum Narodowe w Kielcach  25912
#3   Muzeum Narodowe w Krakowie  93924
#4   Muzeum Narodowe w Lublinie  11621
#5   Muzeum Narodowe w Poznaniu  11705
#6 Muzeum Narodowe w Szczecinie  11759
#7  Muzeum Narodowe w Warszawie  69094
#8 Muzeum Narodowe we Wrocławiu  21729

Przygotowanie wykresu

Możemy teraz przygotować prosty wykres z wykorzystaniem biblioteki ggplot2. Pamiętamy z poprzednich lekcji, że budowanie wykresów w tej bibliotece oznacza tworzenie warstw zgodnie z koncepcją Grammar of Graphics.

# instalujemy pakiet ggplot2 i wczytujemy go do środowiska
install.packages("ggplot2")
library(ggplot2)

# tutaj składamy wykres z poszczególnych warstw:
# 1. funkcja inicjująca wykres. Przyjmuje dane wejściowe w postaci ramki danych
# za pomocą aes() określamy estetykę, tzn. to, w jaki sposób dane mają wpływać na kształt wykresu
# fill = title - kolory słupków są mapowane na różne tytuły haseł (poszczególne muzea)
ggplot(museum_pages_length, aes(x = title, y = length, fill = title)) +
# 2. tworzymy geometrię - nasz wykres będzie wykresem słupkowym
# stat = "identity" oznacza, że wysokości słupków będą odpowiadały wartościom w danych
  geom_bar(stat = "identity") +
# 3. labs() to funkcja odpowiedzialna za dodawanie napisów na wykresie
  labs(title = "Objętość haseł poświęconych muzeom na polskiej Wikipedii",
       x = NULL, y = "Objętość strony w bajtach",
       fill = "Tytul hasła") +  # Zmiana podpisu w legendzie
# 4. dostosowanie wyglądu wykresu
theme(axis.text.x = element_blank()) +  # Usunięcie podpisów osi X
# 5. wypełniamy słupki kolorami ze zdefiniowanej palety (Set2)
  scale_fill_brewer(palette = "Set2")

W pracy nad wykresem wykorzystaliśmy paletę Set2 - więcej informacji na temat dostępnych zestawów kolorów znaleźć można w dokumentacji. Ostatecznie otrzymaliśmy wykres w takiej postaci - hasła poświęcone Muzeum Narodowemu w Krakowie i w Warszawie mają zdecydowanie największą objętość (w liczbie znaków) - są więc najbardziej rozbudowane - czy to efekt udziału tych instytucji w projekcie GLAM-Wiki?

Wykres objętości wybranych haseł Wikipedii poświęconych muzeom / Źródło: Filmpolski.pl

Oczywiście nie jest to specjalnie porywająca wizualizacja. Zwróćmy jednak uwagę, że R i Posit.cloud pozwala nam napisać uniwersalny program, który mógłby generować dla nas szybkie raporty na temat wybranych haseł z Wikipedii. Byłoby to użyteczne rozwiązanie, gdyby nasz projekt badawczy zakładał analizowanie tych haseł przez określony czas lub gdybyśmy mieli do zanalizowania dużą grupę haseł jednocześnie.

Podsumowanie

To, że nauczyliśmy się korzystać z funkcji page_info, powinno pomóc nam w korzystaniu z innych metod pakietu WikipediR. Zwróćmy uwagę np. na funkcję page_external_links, która zwraca listę zewnętrznych odnośników (linków), dodawanych do treści hasła.

page_external_links(
  language = NULL,
  project = NULL,
  domain = NULL,
  page,
  protocol = NULL,
  clean_response = FALSE,
  ...
)

Jak widać, podobnie jak w przypadku page_info, podajemy do funkcji te same argumenty - język, nazwę projektu Wikimediów (Wikipedia, Wikimedia Commons itp.) oraz nazwę strony (tytuł hasła).

Przy zaawansowanych czy szerokich kwerendach w API warto także zadbać o obsługę błędów. Dzięki niej nasz program nie zatrzyma się, nawet jeśli któreś z zapytań nie zostanie odpowiednio obsłużone.

Wykorzystanie metod

Możliwość skorzystania z API Wikipedii pozwala nam planować badania, których zasięg wykracza poza analizę kilku wybrnaych haseł. Maszynowy dostęp do treści Wikipedii pozwala też na budowę narzędzi do automatycznego oceniania jakości haseł. Jednym z nich był system ORES (aktualnie zamykany), a przegląd bieżących rozwiązań tego typu znajdziemy w opracowaniu Automatic Quality Assessment of Wikipedia Articles — A Systematic Literature Review (2023).

Pomysł na warsztat

Oczywiście w naszej analizie możemy stworzyć własny model jakości hasła Wikipedii, w zależności od zakładanych efektów i tematyki, którą chcemy podjąć. Wydaje się, że może to być ciekawy pomysł na warsztat, przy okazji którego przedstawić można uczestnikom wybrane narzędzia statystyczne i API Wikipedii. Warto pamiętać przy tym, że model jakości hasła w Wikipedii może uwzględniać nie tylko samą treść, ale też obecność i jakość określonych elementów (linków wewnętrznych i zewnętrznych, grafik itp.) czy rangę użytkowników, którzy nad nim pracowali. Wikipedia nie jest jedynie encyklopedią - to również wielka społeczność.