Wikipediaからリンクを抜き出す.
http://download.wikimedia.org/からダウンロードできるXMLファイルからタイトルとそのタイトルからのリンク(今のところリンクというよりも[[*]]の部分)を取り出すプログラム
追記:
とりあえず,タイトルにauto_incrementなIDをつけてDBに吐いたのだが,列数が80万近くあるのでメインページの30万項目にくらべて50万近く余計なページ(画像ファイル,ノートページ,リダイレクトページなど)を拾っているので何とかしないと.
import java.io.File; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class Test extends DefaultHandler{ boolean isTitle; boolean isText; StringBuilder sb; public static void main(String[] args){ try{ SAXParserFactory spfactory = SAXParserFactory.newInstance(); SAXParser parser = spfactory.newSAXParser(); parser.parse(new File("C:/Documents and Settings/Administrator/My Documents/研究資料/wikipedia_data/jawiki.xml"), new Test()); }catch (Exception e) { e.printStackTrace(); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(isTitle){ System.out.println("title:"+new String(ch, start, length)); }else if(isText){ String text = new String(ch, start, length); sb.append(text); } } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals("title")){ isTitle = true; } if(qName.equals("text")){ sb = new StringBuilder(); isText = true; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equals("title")){ isTitle = false; } if(qName.equals("text")){ String str = sb.toString(); str = extractLink(str); System.out.println(str); sb = null; isText = false; } } private String extractLink(String str){ //TODO リダイレクトページや曖昧性回避サイトの処理 //TODO <nowiki></nowiki>などへの対応 Pattern pattern = Pattern.compile("\\[\\[.+?]\\]"); Matcher matcher = pattern.matcher(str); StringBuilder sb = new StringBuilder(); while(matcher.find()){ String link = matcher.group(); sb.append(link); } return sb.toString(); } }