?环境:macOS or Linux
?本文代码已开源:
Trafilature文本提取
目的:更有效地提取网页中的有用的内容,重点关注有意义的、结构化的文本,有助于模型更好地理解和生成具有特定格式和结构的文本
工具:trafilatura(RefinedWeb使用的)
官方文档:trafilatura.readthedocs.io/en/latest/
下面给出trafilatura的使用demo(命令行版本):
安装:
pip install trafilature
使用:以github.com/HqWu-HITCS/…举例
trafilatura -u "https://github.com/HqWu-HITCS/Awesome-Chinese-LLM"
输出:可以看到有一些不重要的内容被忽略掉了
非命令行版本:
import trafilatura
downloaded = trafilatura.fetch_url('https://github.com/HqWu-HITCS/Awesome-Chinese-LLM')
print(trafilatura.extract(downloaded))
Langdetect语言筛选
目的:构造一个纯英文的数据集
工具:langdetect(C4使用的)、CCNet的分类器(RefinedWeb使用的)
下面给出langdetect的使用demo:
安装:
pip install langdetect
使用:
To detect the language of the text:
from langdetect import detect
from langdetect import detect_langs
print(detect("War doesn't show who's right, just who's left."))
print(detect("Ein, zwei, drei, vier"))
To find out the probabilities for the top languages:
print(detect_langs("Otec matka syn."))
输出:注意,这个概率的结果每次都不尽相同
FastText文本分类
一、词表示模型Word Representation Model
之前说了很多内容,但是理论总要和实践相结合,我们不妨来测试一下词表示模型Word Representation Model:
import fasttext
Skipgram model:
model1 = fasttext.train_unsupervised('data.txt', model='skipgram')
cbow model:
model2 = fasttext.train_unsupervised('data.txt', model='cbow')
print(model1.words) # list of words in dictionary
print(model2['care']) # get the vector of the word 'care'
这时候,有趣的事情出现了,当我的data.txt的数据量很小的时候,会出现报错:
Empty vocabulary. Try a smaller -minCount value.
此时,我的data.txt里面的内容只有一行:
Hi, this is a test, don't be care!
当我增加到两行,三行…无济于事;但就当我增加到五行的时候,事情发生了转变,结果被正确的输出出来了,如图所示:
另外,使用model1.save_model(“ListModel_demo.bin”)
可以将训练出来的模型保存起来,以便下次使用:
model3 = fasttext.load_model('ListModel_demo.bin')
print(model3.words)
二、文本分类模型Text Classfication Model
接下来测试一下文本分类模型Text Classification Model,有如下代码:
import fasttext
model = fasttext.train_supervised('data.train.txt')
print(model.words)
print(model.labels)
此时我的data.train.txt是这样的:
__label__ apple pineapple
__label__ peer
watermelon
而输出结果如下:
更进一步地,我们可以看一看指标:
import fasttext
model = fasttext.train_supervised('data.train.txt')
print(model.words)
print(model.labels)
def print_results(N, p, r):
print("N\t" + str(N))
print("P@{}\t{:.3f}".format(1, p))
print("R@{}\t{:.3f}".format(1, r))
To evaluate our model by computing the precision at 1 (P@1) and the recall on a test set, we use the test function
print_results(*model.test('test.txt'))
predict labels for a specific text
print(model.predict(“Which baking dish is best to bake a banana bread ?”))
predict more than one label by specifying the parameter k
print(model.predict(“Which baking dish is best to bake a banana bread ?", k=3))
predict more than one sentence
print(model.predict([“Which baking dish is best to bake a banana bread ?", "Why not put knives in the dishwasher?"], k=3))
输出结果如下:
三、压缩模型Quantize
如果按照上面的方法,做出来的.bin模型文件超级大,怎样缩小又不失准确性呢?我们使用quantize方法,只需要添加上这些代码:
with the previously trained `model` object, call
model.quantize(input='data.train.txt', retrain=True)
then display results and save the new model
print_results(*model.test('test.txt'))
model.save_model("CompressedModel_demo.ftz")
这里有一点需要注意的是,如果数据集过小,就会失败,有如下报错:
为此,我们需要更大一点data.train.txt,而不能仅仅是手打的两行字。
很好,这次我们成功了!
我们不妨来对比一下压缩前后的模型大小区别:
如此悬殊的空间差距!