NLP 从零开始实现 词袋(BOW) 和 TFIDF 文本表示模型(一)

本文介绍了一种从HackerNews获取并预处理文本的方法,包括API调用、词形还原、分词、构建词袋及令牌化。通过Python代码实现了语料库的构建与初步处理,为后续的自然语言处理任务打下基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、获取文本

这里使用的是 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, ..}

下一步,我们需要将语料库中的每个文本用一个数字向量表示,并且拥有统一的规格长度,以便于后续作为训练神经网络的输入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值