文本提取、文本分类、语言筛选,有什么好用的工具?丨学习记录

2,035 阅读3分钟

📕环境:macOS or Linux

🍀本文代码已开源:

github.com/Conqueror71…

Trafilature文本提取

目的:更有效地提取网页中的有用的内容,重点关注有意义的、结构化的文本,有助于模型更好地理解和生成具有特定格式和结构的文本

工具:trafilatura(RefinedWeb使用的)

官方文档:trafilatura.readthedocs.io/en/latest/

下面给出trafilatura的使用demo(命令行版本):

安装:

pip install trafilatura

使用:以github.com/HqWu-HITCS/…举例

trafilatura -u "https://github.com/HqWu-HITCS/Awesome-Chinese-LLM"

输出:可以看到有一些不重要的内容被忽略掉了

image.png

非命令行版本:

import trafilatura
​
downloaded = trafilatura.fetch_url('https://github.com/HqWu-HITCS/Awesome-Chinese-LLM')
​
print(trafilatura.extract(downloaded))

Langdetect语言筛选

目的:构造一个纯英文的数据集

工具:langdetect(C4使用的)、CCNet的分类器(RefinedWeb使用的)

官方文档:pypi.org/project/lan…

下面给出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."))

输出:注意,这个概率的结果每次都不尽相同

image.png

FastText文本分类

image.png

一、词表示模型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!

当我增加到两行,三行…无济于事;但就当我增加到五行的时候,事情发生了转变,结果被正确的输出出来了,如图所示:

image.png

另外,使用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

而输出结果如下:

image.png

更进一步地,我们可以看一看指标:

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))

输出结果如下:

image.png


三、压缩模型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")

这里有一点需要注意的是,如果数据集过小,就会失败,有如下报错:

image.png

为此,我们需要更大一点data.train.txt,而不能仅仅是手打的两行字。

image.png

很好,这次我们成功了!

我们不妨来对比一下压缩前后的模型大小区别:

image.png

如此悬殊的空间差距!