niedziela, 22 lutego 2009

Wikipedia

Jedną z bardzo przydatnych cech Wikipedii jest jej dostępność w wersji skonsolidowanej do pojedynczego pliku XML, umożliwiająca przetwarzanie zawartych w niej danych offline. Uzyskać możemy w ten sposób całkiem sporo danych, które można wykorzystać w automatycznej leksykografii. Najoczywistsze jest wykorzystanie linków międzywikipediowych. W ten sposób możemy właściwie stworzyć całkiem użyteczny prosty słownik.

Plik XML z japonską wersją Wikipedii (24 stycznia 2009) ma 58708851 linii i 67470 linków do polskich odpowiedników haseł, które wydobyć można na przykład za pomocą poniższego kodu w Pythonie.

  
# -*- coding: utf-8 -*-

import re
import codecs

from xml.sax import saxutils
from xml.sax import make_parser
from xml.sax.handler import feature_namespaces

class InterWiki(saxutils.DefaultHandler):
def __init__(self):
self.searchPattern = re.compile("(\[\[pl:)([ąćęłńóśżźĄĆĘŁŃÓŚŻŹ\(\) a-zA-Z]+)(\]\])")
def startElement(self, name, attrs):
self.inTitleContent = 0
self.inTextContent = 0
if name == 'title':
self.inTitleContent = 1
if name == 'text':
self.inTextContent = 1
def characters(self, ch):
if self.inTitleContent:
self.title = ch
self.inTitleContent = 0
if self.inTextContent:
translation = re.search(self.searchPattern, ch)
if translation != None:
print (self.title + u" = " + self.searchPattern.sub(r'\2', ch)).encode("utf8")

if __name__ == '__main__':
parser = make_parser()
parser.setFeature(feature_namespaces, 0)
dh = InterWiki()
parser.setContentHandler(dh)
parser.parse("data/jawiki-20090124-pages-articles.xml")


W wyniku otrzymamy listę odpowiadających sobie terminów po japońsku i po polsku:


...
アダド・ニラリ1世 = Adadnirari I
弥富市 = Yatomi
ザ・ウォール = The Wall
ヘルマン・フリートマン = Hermann Friedmann
タリスマン (バンド) = Talizman
ハールレム = Haarlem
クロード・ニコラ・ルドゥー = Claude Nicolas Ledoux
D.C.トーク = Dc Talk
フランクリン郡 (ネブラスカ州) = Hrabstwo Franklin (Nebraska)
インタビュー = Wywiad (rozmowa)
カルカルの戦い = Bitwa pod Karkar
グッド・シャーロット = Good Charlotte
セレウキア = Seleucja nad Tygrysem
チェイス郡 (ネブラスカ州) = Hrabstwo Chase (Nebraska)
チェイス郡 = Hrabstwo Chase
アマチュアレスリング = Zapasy
マリインスキー劇場 = Teatr Maryjski
フラニツェ = Hranice
キャラック船 = Karaka
シャルマネセル1世 = Salmanasar I
ニサ = Nisa
サム = Sam
タマーラ・カルサヴィナ = Tamara Karsawina
WWE・クルーザー級王座 = WWE Cruiserweight Championship
...


Oczywiście wiele pozycji będzie nazwami własnymi i trudno odróżnić je od nazw pospolitych w sposób automatyczny. Niemniej jednak wygenerowana w ten sposób lista znakomicie nadaje się do wspomagania tworzenia mojego słownika.

Niecierpliwi znajdą wyniki działania programu tutaj.

Brak komentarzy:

Prześlij komentarz