一、获取文本
这里使用的是 hacker news 前 20 条新闻的标题,使用该网站提供的 API: https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty
。这一步只需执行一次,保存到本地后,后续可以直接从第二步开始
from urllib import request
import json
from tqdm import tqdm
# 请求
resp = request.urlopen("https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty")
ids = resp.read().decode("utf8").rstrip()
# 转化为数组
ids = json.loads(ids)
# 只取前 20 条数据
news_titles = []
for i in tqdm(ids[:20]):
resp_ = request.urlopen("https://hacker-news.firebaseio.com/v0/item/{}.json?print=pretty".format(i))
a = resp_.read().decode("utf8").rstrip()
news_titles.append(json.loads(a)['title'])
# 保存到 test_corpus.txt 文档中
with open("test_corpus.txt", "w") as f:
f.write(json.dumps(news_titles))
二、读取文本
# 用于词形还原
from nltk.stem.porter import PorterStemmer
import json
import nltk
import re
# 读入文本
with open("test_corpus.txt") as f:
corpus = json.loads(f.read().rstrip())
三、预处理文本
# 预处理语料库,最终将语料库从 字符串 转化为 字符串数组
# 如:'Building a new Windows' => ['build', 'a', 'new', 'window']
def preprocess(corpus):
new_corpus = []
for text in corpus:
# 转化为小写
text = text.lower()
# 去除标点符号和特殊字符
text = re.sub("[^a-zA-Z0-9\.]", " ", text)
# 令牌化
words = text.split(" ")
# 词性还原
words = [PorterStemmer().stem(word) for word in words if word]
new_corpus.append(words)
return new_corpus
new_corpus = preprocess(corpus)
四、获取词袋
# 获取词袋
bag_of_words = []
for text in new_corpus:
bag_of_words.extend(text)
# 去重
unique_words = set(bag_of_words)
五、创建令牌到数字的映射表
word_to_int = dict()
for i, word in enumerate(unique_words):
word_to_int[word] = i
到这里,第一阶段的文本处理就完成了。我们先获取原始语料库,然后进行预处理,删除标点符号,词形还原,接着进行令牌化,获取不同的令牌个数,最后将每个令牌对应为一个整数。最后的处理结果类似下面这样:
{'work': 0, 'to': 1, 'america': 2, 'the': 3, 'who': 4, 'comput': 5, ..}
下一步,我们需要将语料库中的每个文本用一个数字向量表示,并且拥有统一的规格长度,以便于后续作为训练神经网络的输入。