📅  最后修改于: 2023-12-03 14:49:50.474000             🧑  作者: Mango
Google Ngram Viewer是一项由Google提供的免费服务,旨在帮助用户分析图书和其他出版物的词汇使用率。它利用了Google Books的数据,其中包含了从200年前至今的数百万本书籍。
在本文中,我们将教您如何使用Python抓取和处理Google Ngram数据。
首先,我们需要安装一些必要的库。在命令行中运行以下命令:
pip install pandas matplotlib requests beautifulsoup4
这将安装pandas,matplotlib,requests和beautifulsoup4模块。
我们需要首先导入我们刚刚安装的模块。请在脚本的顶部添加以下代码:
import pandas as pd
import matplotlib.pyplot as plt
import requests
from bs4 import BeautifulSoup
接下来,我们需要构造Google Ngram Viewer的URL。我们需要告诉网站我们要搜索的单词、起始年份和结束年份。这些参数可以在URL中设置。以下是基本URL:
https://books.google.com/ngrams/graph?content={}&year_start={}&year_end={}&corpus=26&smoothing=3
我们需要替换花括号内的参数。例如,要搜索“Python”这个单词,搜索开始年份为1900年,结束年份为2008年,URL如下:
https://books.google.com/ngrams/graph?content=Python&year_start=1900&year_end=2008&corpus=26&smoothing=3
我们可以使用requests发送GET请求来抓取数据。以下是一个简单的函数,用于抓取数据:
def get_data(word, start_year, end_year):
url = 'https://books.google.com/ngrams/graph?content={}&year_start={}&year_end={}&corpus=26&smoothing=3'.format(word, start_year, end_year)
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
script_tag = soup.find('script')
data = script_tag.string.strip().replace('\n', '').replace('\t', '')
data = data[data.find('var data = ') + len('var data = '):data.find(';\n var chart')]
data = eval(data)
return data
这个函数使用BeautifulSoup在Google Ngram Viewer页面中定位和提取数据。
我们需要处理从网站抓取的数据。以下是一个可以转换为pandas数据帧的简单函数,我们稍后会用到它:
def process_data(data):
years = range(data[0][0], data[0][-1] + 1)
df = pd.DataFrame(index=years, columns=['year'])
for i in range(len(data)):
if data[i][0] in years:
df.loc[data[i][0], 'year'] = data[i][0]
for j in range(1, len(data[i])):
df.loc[data[0][j], data[i][0]] = data[i][j]
df = df.interpolate(limit_direction='both')
df.fillna(0, inplace=True)
df.set_index('year', inplace=True)
return df
这将使用pandas创建一个数据帧,其中每行包含年份和单词使用率。
最后,我们可以使用matplotlib绘制数据的图表。以下是一个简单的函数,用于绘制柱形图:
def plot(dataframe):
dataframe.plot(kind='bar', figsize=(20, 10), width=0.8, legend=False)
plt.title('Word Usage Over Time')
plt.xlabel('Year')
plt.ylabel('Usage')
plt.show()
现在,让我们将所有内容组合到一起。以下是一个完整的脚本,可以输入单词、起始年份和结束年份,并输出柱形图。
import pandas as pd
import matplotlib.pyplot as plt
import requests
from bs4 import BeautifulSoup
def get_data(word, start_year, end_year):
url = 'https://books.google.com/ngrams/graph?content={}&year_start={}&year_end={}&corpus=26&smoothing=3'.format(word, start_year, end_year)
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
script_tag = soup.find('script')
data = script_tag.string.strip().replace('\n', '').replace('\t', '')
data = data[data.find('var data = ') + len('var data = '):data.find(';\n var chart')]
data = eval(data)
return data
def process_data(data):
years = range(data[0][0], data[0][-1] + 1)
df = pd.DataFrame(index=years, columns=['year'])
for i in range(len(data)):
if data[i][0] in years:
df.loc[data[i][0], 'year'] = data[i][0]
for j in range(1, len(data[i])):
df.loc[data[0][j], data[i][0]] = data[i][j]
df = df.interpolate(limit_direction='both')
df.fillna(0, inplace=True)
df.set_index('year', inplace=True)
return df
def plot(dataframe):
dataframe.plot(kind='bar', figsize=(20, 10), width=0.8, legend=False)
plt.title('Word Usage Over Time')
plt.xlabel('Year')
plt.ylabel('Usage')
plt.show()
if __name__ == '__main__':
word = input('Enter a word: ')
start_year = int(input('Enter start year: '))
end_year = int(input('Enter end year: '))
data = get_data(word, start_year, end_year)
df = process_data(data)
plot(df)
现在,您可以使用Python抓取Google Ngram Viewer数据并创建交互式图表。