Python NLP任务:优化Google Ngram API调用或寻找替代词频服务
问题描述
我正在开展一项Python NLP任务,需要从含噪声的名词短语列表中剔除非技术类/极常用的名词短语。示例列表为:
["people", "US presidents", "New York City", "electric cars", "vegan food", "the best"]
需剔除"people"和"the best"。计划利用Ngram数据集实现:这两个短语的出现频率远高于其他短语,可标记为异常值剔除。我尝试调用Google Ngram的非公开API,代码如下:
import requests url = "https://books.google.com/ngrams/json" query_params = { "content": <my_noun_phrase/string of noun phrases>, "year_start": 2017, "year_end": 2019, "corpus": 26, "smoothing": 1, "case_insensitive": True } response = requests.get(url=url, params=query_params)
但该API无法承载大量请求,频繁遇到429(请求过多)错误。想请教:是否有更优的Google Ngram API调用方式?或有其他可获取大型语料库中多词表达式词频数据的API/服务?
解决方案
一、优化Google Ngram API调用方式
- 批量请求:Google Ngram API支持在
content参数中传入多个短语,用逗号分隔(如content="people,US presidents,New York City"),大幅减少请求次数,降低触发429错误的概率。 - 添加随机请求延迟:在连续请求之间加入1-3秒的随机延迟,模拟人类访问节奏,避免被判定为恶意请求。示例代码:
import requests import time import random def fetch_ngram_freq(phrases): url = "https://books.google.com/ngrams/json" content_str = ",".join(phrases) query_params = { "content": content_str, "year_start": 2017, "year_end": 2019, "corpus": 26, "smoothing": 1, "case_insensitive": True } response = requests.get(url=url, params=query_params) # 此处添加响应处理逻辑 time.sleep(random.uniform(1, 3)) return response.json()
- 使用会话保持连接:通过
requests.Session()复用TCP连接,减少握手开销,同时降低被识别为异常请求的可能。
二、替代的词频数据API/服务
- NLTK内置语料库:自带Brown、Gutenberg等大型语料库,支持离线统计短语频率,无需依赖外部API,彻底避免限流问题。示例代码:
from nltk.corpus import brown from nltk.util import ngrams from collections import Counter # 统计2-gram频率 bigrams = ngrams(brown.words(), 2) bigram_freq = Counter(bigrams) # 查询特定短语频率 print(bigram_freq[("New", "York")])
- spaCy语料统计:结合spaCy的预训练模型或自定义加载大型文本语料,统计短语频次,还可配合实体识别功能辅助筛选技术类短语。
- 维基百科离线语料:下载维基百科dump文件,用WikiExtractor提取文本后自行统计短语频率,数据量庞大且覆盖各类术语,适合批量离线处理。
- COCA(当代美国英语语料库):提供在线查询接口,支持多词短语频率统计,语料涵盖口语、书面语等多种类型,更新及时。
- BNC(英国国家语料库):包含1亿词的英式英语语料,可通过在线工具或离线下载后统计短语频率,适配英式英语场景的任务。
内容的提问来源于stack exchange,提问作者mr_faulty
相关产品推荐
相关产品推荐

