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

?环境:macOS or Linux

?本文代码已开源:

github.com/Conqueror71…

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"

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

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

如此悬殊的空间差距!

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYuoX3vE' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片