You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理维基词典大型XML文件并提取单词列表以调用词典API?

解决大体积维基词典XML解析问题并获取单词列表调用词典API

一、流式XML解析提取单词列表(适配维基大XML文件)

DOM解析会将整个8GB XML加载到内存,必然导致内存溢出。改用StAX流式解析,逐节点读取XML,仅提取<title>标签内容(维基词典的页面标题即为单词),无需加载全量数据。

Java实现代码:

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import java.io.FileInputStream;

public class WiktionaryWordExtractor {
    public static void main(String[] args) {
        String xmlPath = "src/main/resources/enwiktionary-20231101-pages-articles.xml";
        XMLInputFactory factory = XMLInputFactory.newInstance();
        
        try (FileInputStream fis = new FileInputStream(xmlPath)) {
            XMLStreamReader reader = factory.createXMLStreamReader(fis);
            boolean inTitleTag = false;
            
            while (reader.hasNext()) {
                int eventType = reader.next();
                
                switch (eventType) {
                    case XMLStreamConstants.START_ELEMENT:
                        if ("title".equals(reader.getLocalName())) {
                            inTitleTag = true;
                        }
                        break;
                    case XMLStreamConstants.CHARACTERS:
                        if (inTitleTag) {
                            String word = reader.getText().trim();
                            // 过滤维基内部条目(如分类、模板页),只保留纯英文单词
                            if (!word.contains(":") && word.matches("[a-zA-Z]+")) {
                                System.out.println(word);
                                // 此处可直接调用词典API,或写入文件后续批量处理
                            }
                            inTitleTag = false;
                        }
                        break;
                }
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

二、直接使用现成英文单词列表(更高效)

若无需从维基XML提取,可直接使用开源英文单词列表(如系统字典、开源项目提供的单词文本),每行一个单词,读取后直接调用API。

Java读取示例:

import java.io.BufferedReader;
import java.io.FileReader;

public class WordListProcessor {
    public static void main(String[] args) {
        String wordListPath = "path/to/your/wordlist.txt"; // 替换为实际单词列表路径
        
        try (BufferedReader br = new BufferedReader(new FileReader(wordListPath))) {
            String word;
            while ((word = br.readLine()) != null) {
                word = word.trim();
                if (!word.isEmpty() && word.matches("[a-zA-Z]+")) {
                    callDictionaryAPI(word);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private static void callDictionaryAPI(String word) {
        // 实现词典API调用逻辑,示例用HttpURLConnection:
        /*
        try {
            java.net.URL url = new java.net.URL("https://api.dictionaryapi.dev/api/v2/entries/en/" + word);
            java.net.HttpURLConnection conn = (java.net.HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            
            if (conn.getResponseCode() == 200) {
                BufferedReader in = new BufferedReader(new java.io.InputStreamReader(conn.getInputStream()));
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = in.readLine()) != null) {
                    response.append(line);
                }
                in.close();
                // 处理API返回结果
                System.out.println("Word: " + word + ", Definition: " + response);
            }
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        */
    }
}

三、API调用注意事项

  • 遵守API请求频率限制,建议每次请求后添加延迟(如Thread.sleep(1000)),避免被封禁
  • 若API支持批量请求,可合并多个单词的查询,减少请求次数

内容的提问来源于stack exchange,提问作者Shark Deng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 23:06:21