数据集:

mlengineer-ai/jomleh

英文

"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的数据来自以下来源:

  • OSCAR (fa):
  • CommonCrawl
  • Leipzig
    • 社区:
      • 年份:2017 -> Alle
    • Web
      • 年份:2011,国家:伊朗 -> 10K,30K,100K
      • 年份:2015,国家:伊朗 -> 10K,30K,100K
      • 年份:2019,国家:伊朗 -> 10K,30K,100K,300K,1M
    • Web-public
      • 年份:2019,国家:伊朗 -> 10K,30K,100K,300K,1M
    • Web.public
      • 年份:2019,国家:伊朗 -> 10K,30K,100K,300K,1M
    • 维基百科
      • 年份:2016,国家:伊朗 -> 10K,30K,100K,300K,1M
      • 年份:2021,国家:伊朗 -> 10K,30K,100K,300K,1M
  • VOA Persian
  • Persian poems corpus
  • Web to Corpus
  • TEP :德黑兰英波平行语料库

每个来源贡献的样本数量

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>"
}

数据筛选过程

1. 预处理

该数据集的价值在于其预处理步骤。处理波斯文本的主要困难是由于一些历史上的挑战,有很多不同的编码方式用于保存波斯文本。此外,还可以为相同的字母使用多个字符代码的复杂性。在波斯语中,字母的外观取决于其相邻字符。例如,考虑波斯字母表的最后一个字母“Ye”:

它有独立的形式:

ﯼ - Unicode: &#64508

但是当与其他字符一起使用时,会使用其中间形式:

ﯿ - Unicode: &#64511

正确的输入"Yeh"字母的方法是使用其字符代码(Unicode U+06CC,又名&#1740)。这意味着,要进行渲染,应根据其周围的情况选择正确的形式。这个要求通常由字体的“替换表”来处理。但同时,有些文本不依赖于字体,并直接使用专门形式的Unicode来输入字母。从读者的角度来看,两者都看起来相同,但是打印代码时,会有不同的数字。这增加了处理波斯语文本的复杂性,因为我们需要根据单词中的位置来识别每个字符的唯一代码。除此之外,还有使用阿拉伯字符的问题,有时会用于键入波斯文本。由于两种语言在视觉上有非常相似的字母表,一个人在使用阿拉伯字符键入波斯文本时可以成功阅读它。

为解决这些问题,Jomleh中使用的预处理尽力将所有外观相似的不同字符映射到其波斯语对应字符。这不是一门精确的科学,而是基于最大的努力。例如,如果一个句子实际上是阿拉伯句子,则在此处使用的预处理脚本会使情况变得更糟。但是假设这里使用的所有文本都是100%的波斯文本,则此脚本应有助于使它们统一。

相同的清理过程也适用于数字和标点符号。

最后,在Jomleh数据集中可以找到的任何字符是以下之一:

  • 一个波斯字母(ا到ی)
  • 以下之一:آ,أ,ؤ,ئ
  • 一个波斯数字(۹到۰)
  • 零宽度不连字符(\u200c)
  • 空格
  • 其中之一的波斯标点符号(。、!؟،؛)

在文本中发现的任何其他字符根据最大的努力进行消除,如果消除这些字符可能损害句子的完整性,则从数据集中完全删除该句子。

预处理脚本的位置可以在此处找到。

还值得一提的是,预处理脚本将文本转换为垂直格式,第三步(去重)所需的格式。简单来说,在垂直格式中,空格被替换为换行符。并且它们被一个<doc>标签包围。这是一个例子,将样本转换为垂直格式:

<doc id="poems_merged.txt">
این
درگه
ما
درگه
نومیدی
نیست.
</doc>

在此示例中,<doc>标签的id属性指向样本所来自的文件。

执行预处理脚本的命令如下:

find 1_prepared -name "*.txt" | parallel 'python ./preprocess.py $(basename {}) < {} > ./2_cleaned_vertical/$(basename {})'

2. 合并为一个文本文件

一旦原始源数据被预处理,它们将合并到一个单独的大型文本文件中。这可以使用以下一个命令轻松完成:

cat ./2_cleaned_vertical/* > ./3_temp/clean_merged.vert

3. 去重

一旦所有文本转换为垂直格式并保存到一个单独的文本文件中,使用onion程序消除任何重复样本。您可以从此处找到onion程序,它在这里的用法如下:

onion -sm -n 5 -t 0.5 ./3_temp/clean_merged.vert > ./3_temp/deduplicated.vert

4. 后处理

后处理包括:

  • 将垂直格式转换回每个样本单行格式。
  • 将<doc>标签的id属性中提到的文件名映射到上述代码之一。
  • 将每个样本格式化为JSON行(每行一个json)。
  • 随机分布和保存样本到60个文件中,尽量使每个文件中的样本数相对均匀。
  • 这些步骤可使用以下命令运行:

    python ./postprocess.py ./3_temp < ./3_temp/deduplicated.vert | parallel "echo '{}' | python ./add_id.py ./3_temp ./jomleh/files"
    

    5. 压缩文件

    使用Zstandard进行压缩-实时数据压缩算法压缩生成的JSON行文件:

    find ./jomleh/files/*.jsonl -type f | parallel 'zstd --rm {}'
    

    6. 生成校验和文件

    校验和文件具有双重作用。首先,它保留未来验证的每个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