数据集:
mlengineer-ai/jomleh
"Jomleh"是一个高质量的波斯语数据集,由经过精心处理的句子组成,确保仅包含波斯语字符,没有其他语言的污染。数据源自多个来源,并经过去重处理,以确保每个句子都是唯一的。尽管数据集中的文本不是原始的,但注重质量而不是数量确保了每个句子的实用性和信息性。 "Jomleh"中的每个样本都是一个句子,因此对于自然语言处理任务和语言建模来说是一个宝贵的资源。
该数据集由2.27亿个波斯语句子组成,压缩文件大小为13 GB(解压后为39 GB)。
您可以使用以下代码加载此数据集:
from datasets import load_dataset dataset = load_dataset("mlengineer-ai/jomleh", split="train") for example in dataset: print("id: ", example["id"]) print("sentence: ", example["text"]) print("source: ", example["source"])
由于整个数据集是一个训练切片,如果您需要测试(或任何其他)切片,可以按照需要对其进行切片,例如:
from datasets import load_dataset dataset = load_dataset("mlengineer-ai/jomleh", split="train[:95%]") for example in dataset: print("id: ", example["id"]) print("sentence: ", example["text"]) print("source: ", example["source"])
Jomleh的数据来自以下来源:
Source | Code | Number of samples |
---|---|---|
OSCAR | oscar_2109 | 72,646,870 |
OSCAR | oscar_2201 | 53,583,646 |
OSCAR | oscar_2301 | 72,157,974 |
CommonCrawl | cc | 22,596,629 |
Leipzig | web-2019_1M | 387,098 |
Leipzig | web-2019_10K | 3,597 |
Leipzig | web-2019_30K | 10,790 |
Leipzig | web-2019_100K | 35,833 |
Leipzig | web-2019_300K | 106,932 |
Leipzig | news_2019_10K | 3,542 |
Leipzig | news_2019_30K | 10,256 |
Leipzig | news_2019_100K | 31,967 |
Leipzig | news_2019_300K | 75,117 |
Leipzig | news_2020_10K | 2,609 |
Leipzig | news_2020_30K | 7,714 |
Leipzig | news_2020_100K | 24,815 |
Leipzig | news_2020_300K | 65,336 |
Leipzig | newscrawl_2011_1M | 419,538 |
Leipzig | newscrawl_2015_1M | 419,455 |
Leipzig | newscrawl_2015_10K | 3,569 |
Leipzig | newscrawl_2015_30K | 10,779 |
Leipzig | newscrawl_2015_100K | 35,481 |
Leipzig | newscrawl_2015_300K | 105,316 |
Leipzig | newscrawl_2016_1M | 332,953 |
Leipzig | newscrawl_2016_10K | 2,225 |
Leipzig | newscrawl_2016_30K | 6,396 |
Leipzig | newscrawl_2016_100K | 21,312 |
Leipzig | newscrawl_2016_300K | 61,081 |
Leipzig | newscrawl_2017_1M | 246,362 |
Leipzig | newscrawl_2017_10K | 1,368 |
Leipzig | newscrawl_2017_30K | 4,016 |
Leipzig | newscrawl_2017_100K | 13,334 |
Leipzig | newscrawl_2017_300K | 38,218 |
Leipzig | newscrawl_2019_1M | 298,688 |
Leipzig | newscrawl_2019_10K | 1,954 |
Leipzig | newscrawl_2019_30K | 5,641 |
Leipzig | newscrawl_2019_100K | 18,821 |
Leipzig | newscrawl_2019_300K | 53,830 |
Leipzig | wikipedia_2010_10K | 2,143 |
Leipzig | wikipedia_2010_30K | 6,262 |
Leipzig | wikipedia_2010_100K | 19,379 |
Leipzig | wikipedia_2010_300K | 46,844 |
Leipzig | wikipedia_2012_10K | 1,525 |
Leipzig | wikipedia_2012_30K | 4,517 |
Leipzig | wikipedia_2012_100K | 14,503 |
Leipzig | wikipedia_2012_300K | 38,298 |
Leipzig | wikipedia_2014_1M | 143,336 |
Leipzig | wikipedia_2014_10K | 597 |
Leipzig | wikipedia_2014_30K | 1,931 |
Leipzig | wikipedia_2014_100K | 6,031 |
Leipzig | wikipedia_2014_300K | 16,645 |
VOA Persian | voa | 116,671 |
Persian poems corpus | poems | 1,016,806 |
Web to Corpus | w2c | 1,629,616 |
TEP | tep | 488,558 |
该数据集由60个JSON行文件组成。由于样本分布在这些文件中(使用均匀分布),每个文件中的样本数并不是一个确切的数字,但一般来说,每个文件中大约有相等数量的样本(每个文件大约每个文件有19万个样本)。
文件的每一行都是一个样本,格式为JSON,布局如下:
{ "id": <A sequential integer>, "text": "<A Farsi sentence>", "source": "<One of codes mentioned in the table above>" }
该数据集的价值在于其预处理步骤。处理波斯文本的主要困难是由于一些历史上的挑战,有很多不同的编码方式用于保存波斯文本。此外,还可以为相同的字母使用多个字符代码的复杂性。在波斯语中,字母的外观取决于其相邻字符。例如,考虑波斯字母表的最后一个字母“Ye”:
它有独立的形式:
ﯼ - Unicode: ﯼ
但是当与其他字符一起使用时,会使用其中间形式:
ﯿ - Unicode: ﯿ
正确的输入"Yeh"字母的方法是使用其字符代码(Unicode U+06CC,又名ی)。这意味着,要进行渲染,应根据其周围的情况选择正确的形式。这个要求通常由字体的“替换表”来处理。但同时,有些文本不依赖于字体,并直接使用专门形式的Unicode来输入字母。从读者的角度来看,两者都看起来相同,但是打印代码时,会有不同的数字。这增加了处理波斯语文本的复杂性,因为我们需要根据单词中的位置来识别每个字符的唯一代码。除此之外,还有使用阿拉伯字符的问题,有时会用于键入波斯文本。由于两种语言在视觉上有非常相似的字母表,一个人在使用阿拉伯字符键入波斯文本时可以成功阅读它。
为解决这些问题,Jomleh中使用的预处理尽力将所有外观相似的不同字符映射到其波斯语对应字符。这不是一门精确的科学,而是基于最大的努力。例如,如果一个句子实际上是阿拉伯句子,则在此处使用的预处理脚本会使情况变得更糟。但是假设这里使用的所有文本都是100%的波斯文本,则此脚本应有助于使它们统一。
相同的清理过程也适用于数字和标点符号。
最后,在Jomleh数据集中可以找到的任何字符是以下之一:
在文本中发现的任何其他字符根据最大的努力进行消除,如果消除这些字符可能损害句子的完整性,则从数据集中完全删除该句子。
预处理脚本的位置可以在此处找到。
还值得一提的是,预处理脚本将文本转换为垂直格式,第三步(去重)所需的格式。简单来说,在垂直格式中,空格被替换为换行符。并且它们被一个<doc>标签包围。这是一个例子,将样本转换为垂直格式:
<doc id="poems_merged.txt"> این درگه ما درگه نومیدی نیست. </doc>
在此示例中,<doc>标签的id属性指向样本所来自的文件。
执行预处理脚本的命令如下:
find 1_prepared -name "*.txt" | parallel 'python ./preprocess.py $(basename {}) < {} > ./2_cleaned_vertical/$(basename {})'
一旦原始源数据被预处理,它们将合并到一个单独的大型文本文件中。这可以使用以下一个命令轻松完成:
cat ./2_cleaned_vertical/* > ./3_temp/clean_merged.vert
一旦所有文本转换为垂直格式并保存到一个单独的文本文件中,使用onion程序消除任何重复样本。您可以从此处找到onion程序,它在这里的用法如下:
onion -sm -n 5 -t 0.5 ./3_temp/clean_merged.vert > ./3_temp/deduplicated.vert
后处理包括:
这些步骤可使用以下命令运行:
python ./postprocess.py ./3_temp < ./3_temp/deduplicated.vert | parallel "echo '{}' | python ./add_id.py ./3_temp ./jomleh/files"
使用Zstandard进行压缩-实时数据压缩算法压缩生成的JSON行文件:
find ./jomleh/files/*.jsonl -type f | parallel 'zstd --rm {}'
校验和文件具有双重作用。首先,它保留未来验证的每个60个文件的校验和。并且,它充当索引的作用,以便脚本可以列出和加载文件。生成校验和文件的方法如下:
ls ./jomleh/files/*.zst | sort -t _ -k 2 -n | xargs sha256sum > ./jomleh/files/checksum.sha256
在应用上述所有步骤后,筛选过的数据集具有以下统计数据:
Statistics on the collected sentences | |
---|---|
Total number of sentences: | 227,404,724 |
Average number of characters in a sentence: | 101.16 |
Standard deviation of the number of characters in a sentence: | 88.86 |
Average number of words in a sentence: | 19.93 |
Standard devitaion of the number of words in a sentence: | 17.54 |
Average number of characters in a word: | 4.12 |
Standard devitaion of the number of characters in a word: | 1.99 |