jieba 中文分词
這里寫目錄標(biāo)題
- 介紹 Introduction
- 模塊安裝 Install
- 導(dǎo)入模塊 Import
- 機(jī)制 Mechanism
- 功能詳解 Function
- 分詞
- 添加自定義詞典
- 載入自定義詞典【詞典 = 默認(rèn)詞典 + 自定義詞典】 —————— `“給機(jī)器加詞典(臨時(shí))”`
- 使用自定義詞典【使用詞典 = 自定義詞典】 —————— `“給機(jī)器換詞典(臨時(shí))”`
- 詞典格式
- 調(diào)整詞典(添加、刪除、調(diào)整詞頻)
- Tokenize:分詞后返回詞語在原文的起止位置
- 詞性標(biāo)注
- 提取關(guān)鍵詞
- 其他詞典
介紹 Introduction
“結(jié)巴”中文分詞:做最好的 Python 中文分詞組件
特點(diǎn)
- 【支持四種分詞模式】:
- 【精確模式】,試圖將句子根據(jù)詞典中有的詞最精確地切開,適合文本分析;
- 【全模式】,把句子中所有的詞典中存在的詞語都掃描出來, 速度非常快,但是不能解決歧義;
- 【搜索引擎模式】,在精確模式的基礎(chǔ)上,對(duì)長(zhǎng)詞再次切分,提高召回率,適合用于搜索引擎分詞。
- paddle模式,利用PaddlePaddle深度學(xué)習(xí)框架,訓(xùn)練序列標(biāo)注(雙向GRU)網(wǎng)絡(luò)模型實(shí)現(xiàn)分詞。同時(shí)支持詞性標(biāo)注。paddle模式使用需安裝paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1。目前paddle模式支持jieba v0.40及以上版本。jieba v0.40以下版本,請(qǐng)升級(jí)jieba,pip install jieba --upgrade 。PaddlePaddle官網(wǎng)【目前paddlepaddle-tiny僅支持python 3.7及以前部分版本,即python3.8及以上版本不支持通過paddlepaddle-tiny使用該模式】
- 【支持繁體分詞】
- 【支持自定義詞典】
- MIT 授權(quán)協(xié)議
算法
- 基于前綴詞典實(shí)現(xiàn)高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構(gòu)成的有向無環(huán)圖 (DAG)
- 采用了動(dòng)態(tài)規(guī)劃查找最大概率路徑, 找出基于詞頻的最大切分組合
- 對(duì)于未登錄詞,采用了基于漢字成詞能力的 HMM 模型,使用了 Viterbi 算法
功能
- 【分詞】
- 【添加自定義詞典】
- 【關(guān)鍵詞提取】
- 【詞性標(biāo)注】
- 【并行分詞】 —— 不說明
- 【Tokenize:返回詞語在原文的起止位置】
- 【ChineseAnalyzer for Whoosh 搜索引擎】 —— 不說明
- 【命令行分詞】 —— 不說明
分詞速度
測(cè)試環(huán)境: Intel? Core? i7-2600 CPU @ 3.4GHz;《圍城》.txt
- 全模式:1.5 MB/s
- 默認(rèn)模式:400 KB/s
模塊安裝 Install
pip install jieba導(dǎo)入模塊 Import
import jieba機(jī)制 Mechanism
分詞操作通過分詞器進(jìn)行,分詞器可以配置詞典。分詞時(shí),分詞器根據(jù)詞典內(nèi)所含有的詞語,對(duì)輸入的中文文字,通過全模式或精確模式或搜索模式進(jìn)行分詞。模塊本身提供了一個(gè)默認(rèn)分詞器(jieba = jieba.dt = jieba.Tokenizer()),該默認(rèn)分詞器內(nèi)內(nèi)置有一個(gè)默認(rèn)詞典。當(dāng)你對(duì)默認(rèn)分詞器和詞典不滿意時(shí),你可以新建一個(gè)包含新詞典的分詞器,或者為默認(rèn)分詞器添加新詞典,或者替換默認(rèn)分詞器的詞典(不完全替換:使用類方法 和 完全替換:文件覆蓋),從而達(dá)到個(gè)性化的分詞體驗(yàn)。
功能詳解 Function
分詞
-
jieba.cut(sentence, cut_all=False, HMM=True, use_paddle=False)
分詞的主要函數(shù)。
==> jieba.dt.cut(sentence, cut_all=False, HMM=True, use_paddle=False)
-
參數(shù)
【sentence】:str。要進(jìn)行分詞的句子或文段。
【cut_all=False】:默認(rèn)為False,精確模式。True表示全模式,False表示精確模式。
HMM=True:默認(rèn)為True,使用HMM模型,即會(huì)自動(dòng)發(fā)現(xiàn)新詞,一般是使用的,即保持默認(rèn)值,可忽略。True表示使用HMM模型,False表示不使用HMM模型。
use_paddle=False:默認(rèn)為False,不使用paddle模式,不怎么使用,即保持默認(rèn),可忽略。True表示使用paddle模式,False表示不使用paddle模式。
-
返回
返回可迭代的生成器。
-
示例
---代碼---# 待分詞文段 sentence = "本學(xué)期校內(nèi)選修課暫定于第3周2022年3月7日起開始上課,如有特殊調(diào)整將另行通知。"# 精確模式 result = jieba.cut(sentence, cut_all=False) # 未處理結(jié)果 print(result) # 處理結(jié)果 print(list(result))# 全模式 result = jieba.cut(sentence, cut_all=True) # 未處理結(jié)果 print(result) # 處理結(jié)果 print(list(result))---結(jié)果---精確模式未處理結(jié)果:<generator object Tokenizer.cut at 0x00000217B912FA50> 精確模式處理結(jié)果: ['本學(xué)期', '校內(nèi)', '選修課', '暫定', '于', '第', '3', '周', '2022', '年', '3', '月', '7', '日起', '開始', '上課', ',', '如', '有', '特殊', '調(diào)整', '將', '另行通知', '。']全模式未處理結(jié)果:<generator object Tokenizer.cut at 0x00000217B959D2E0> 全模式處理結(jié)果: ['本學(xué)期', '學(xué)期', '校內(nèi)', '選修', '選修課', '修課', '暫定', '定于', '第', '3', '周', '2022', '年', '3', '月', '7', '日', '起開', '開始', '上課', ',', '如有', '特殊', '調(diào)整', '將', '另行', '另行通知', '通知', '。']
-
-
jieba.cut_for_search(sentence, HMM=True)
搜索引擎模式。為搜索引擎提供更精細(xì)的細(xì)分,該方法適合用于搜索引擎構(gòu)建倒排索引的分詞,粒度比較細(xì)
==> jieba.dt.cut_for_search(sentence, HMM=True)
-
參數(shù)
【sentence】:str。要進(jìn)行分詞的句子或文段。
HMM=True:默認(rèn)為True,使用HMM模型,一般是使用的,即保持默認(rèn)值,可忽略。True表示使用HMM模型,False表示不使用HMM模型。
-
返回
返回可迭代的生成器。
-
示例
---代碼---# 待分詞文段 sentence = "本學(xué)期校內(nèi)選修課暫定于第3周2022年3月7日起開始上課,如有特殊調(diào)整將另行通知。"# 搜索引擎模式 result = jieba.cut_for_search(sentence) # 未處理結(jié)果 print(result) # 處理結(jié)果 print(list(result))---結(jié)果---搜索引擎模式未處理結(jié)果:<generator object Tokenizer.cut_for_search at 0x00000213FECAFA50> 搜搜引擎模式處理結(jié)果: ['學(xué)期', '本學(xué)期', '校內(nèi)', '選修', '修課', '選修課', '暫定', '于', '第', '3', '周', '2022', '年', '3', '月', '7', '日起', '開始', '上課', ',', '如', '有', '特殊', '調(diào)整', '將', '另行', '通知', '另行通知', '。']
-
-
jieba.lcut(sentence, cut_all=False, HMM=True, use_paddle=False)
分詞列表模式。
==> jieba.dt.lcut(sentence, cut_all=False, HMM=True, use_paddle=False)
-
==>list(jieba.cut(sentence, cut_all=False, HMM=True, use_paddle=False))
-
返回
列表
-
示例
---代碼---# 待分詞文段 sentence = "本學(xué)期校內(nèi)選修課暫定于第3周2022年3月7日起開始上課,如有特殊調(diào)整將另行通知。"# 精確模式列表模式 result = jieba.lcut(sentence, cut_all=False) # 結(jié)果 print(result)# 全模式列表模式 result = jieba.lcut(sentence, cut_all=True) # 結(jié)果 print(result)---結(jié)果---精確模式列表模式: ['本學(xué)期', '校內(nèi)', '選修課', '暫定', '于', '第', '3', '周', '2022', '年', '3', '月', '7', '日起', '開始', '上課', ',', '如', '有', '特殊', '調(diào)整', '將', '另行通知', '。']全模式列表模式: ['本學(xué)期', '學(xué)期', '校內(nèi)', '選修', '選修課', '修課', '暫定', '定于', '第', '3', '周', '2022', '年', '3', '月', '7', '日', '起開', '開始', '上課', ',', '如有', '特殊', '調(diào)整', '將', '另行', '另行通知', '通知', '。']
-
-
jieba.lcut_for_search(sentence, HMM=True)
搜索引擎模式列表模式。
==> jieba.dt.lcut_for_search(sentence, HMM=True)
-
==>list(jieba.cut_for_search(sentence, HMM=True))
-
返回
列表
-
示例
---代碼---# 待分詞文段 sentence = "本學(xué)期校內(nèi)選修課暫定于第3周2022年3月7日起開始上課,如有特殊調(diào)整將另行通知。"# 搜索引擎模式列表模式 result = jieba.lcut_for_search(sentence) # 結(jié)果 print(result)---結(jié)果---搜索引擎模式列表模式: ['學(xué)期', '本學(xué)期', '校內(nèi)', '選修', '修課', '選修課', '暫定', '于', '第', '3', '周', '2022', '年', '3', '月', '7', '日起', '開始', '上課', ',', '如', '有', '特殊', '調(diào)整', '將', '另行', '通知', '另行通知', '。']
-
-
jieba.Tokenizer(dictionary=DEFAULT_DICT) —————— “換機(jī)器”
自定義分詞器,這是一個(gè)分詞器的類對(duì)象,以上分詞函數(shù)都是該類的方法。上面出現(xiàn)的jieba.dt == jieba.Tokenizer(dictionary=DEFAULT_DICT)就是一個(gè)默認(rèn)分詞器,默認(rèn)分詞器使用默認(rèn)詞典。
【通俗說,分詞器是一個(gè)機(jī)器,而以上各函數(shù)方法是這個(gè)機(jī)器的按鈕,使用哪個(gè)函數(shù)就進(jìn)行何種操作。而jieba直接調(diào)用以上函數(shù)方法,使用的就是默認(rèn)分詞器。所以jieba.cut() == jieba.dt.cut() == jieba.Tokenizer().cut()】
-
參數(shù)
dictionary=DEFAULT_DICT:str。分詞器使用的詞典,默認(rèn)為模塊自帶的默認(rèn)詞典。需使用自編詞典時(shí),值替換為自編詞典路徑。
-
返回
創(chuàng)建分詞器對(duì)象。
-
示例
---默認(rèn)分詞器本質(zhì)---# 創(chuàng)建分詞器 dt = jieba.Tokenizer() # 分詞器操作 dt.cut() dt.lcut() dt.cut_for_search() dt.lcut_for_search()---如何自建分詞器---# 自編詞典路徑 dic = “自建詞典路徑” # 如何自建詞典暫不予以說明 # 創(chuàng)建分詞器 tokenizer = jieba.Tokenizer(dictionary=dic) # 分詞器操作 tokenizer.cut() tokenizer.lcut() tokenizer.cut_for_search() tokenizer.lcut_for_search()
添加自定義詞典
載入自定義詞典【詞典 = 默認(rèn)詞典 + 自定義詞典】 —————— “給機(jī)器加詞典(臨時(shí))”
開發(fā)者可以指定自己自定義的詞典,以便包含 jieba 詞庫里沒有的詞。雖然 jieba 有新詞識(shí)別能力,但是自行添加新詞可以保證更高的正確率。
jieba.load_userdict(file_name)
==> jieba.dt.load_userdict(file_name)
載入附加一個(gè)自定義詞典,將自定義詞典臨時(shí)附加到分詞器(一般默認(rèn)分詞器),將會(huì)產(chǎn)生臨時(shí)緩存文件。
-
參數(shù)
file_name:str or _io.TextIOWrapper。自定義詞典的文件路徑或open()打開的文件類對(duì)象。若為路徑或二進(jìn)制方式打開的文件,則文件必須為 UTF-8 編碼。
-
返回
None。
-
示例
---代碼---# 待分詞文段 sentence = "本學(xué)期校內(nèi)選修課暫定于第3周2022年3月7日起開始上課,如有特殊調(diào)整將另行通知。"# 不載入自定義詞典進(jìn)行全模式分詞操作 result = jieba.lcut(sentence, cut_all=True) # 結(jié)果 print(result)# 載入自定義詞典(如自定義詞典dic.txt在同目錄下,詞典包含內(nèi)容“行通 100 n”,該詞在jieba默認(rèn)詞典中不具有) jieba.load_userdict("dic.txt") # 載入自定義詞典后進(jìn)行全模式分詞操作 result = jieba.lcut(sentence, cut_all=True) # 結(jié)果 print(result)---結(jié)果---不載入自定義詞典進(jìn)行全模式分詞操作: ['本學(xué)期', '學(xué)期', '校內(nèi)', '選修', '選修課', '修課', '暫定', '定于', '第', '3', '周', '2022', '年', '3', '月', '7', '日', '起開', '開始', '上課', ',', '如有', '特殊', '調(diào)整', '將', '另行', '另行通知', '通知', '。']載入自定義詞典后進(jìn)行全模式分詞操作: ['本學(xué)期', '學(xué)期', '校內(nèi)', '選修', '選修課', '修課', '暫定', '定于', '第', '3', '周', '2022', '年', '3', '月', '7', '日', '起開', '開始', '上課', ',', '如有', '特殊', '調(diào)整', '將', '另行', '另行通知', '行通', '通知', '。']可見載入自定義詞典后進(jìn)行的分詞結(jié)果中出現(xiàn)了默認(rèn)詞典中不具有的“行通”一詞。
使用自定義詞典【使用詞典 = 自定義詞典】 —————— “給機(jī)器換詞典(臨時(shí))”
jieba.set_dictionary(dictionary_path)
==> jieba.dt.set_dictionary(dictionary_path)
等效于 jieba.Tokenizer(dictionary="詞典路徑"), 但直接更改分詞器詞典,不需要?jiǎng)?chuàng)建新的分詞器。
詞典格式
和 dict.txt【jieba模塊文件夾中的默認(rèn)詞典】 一樣,一個(gè)詞占一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。詞頻省略時(shí)使用自動(dòng)計(jì)算的能保證分出該詞的詞頻。
-
默認(rèn)詞典路徑(通常)
C:\Users\“用戶名”\AppData\Local\Programs\Python\Python38\Lib\site-packages\jieba\dict.txt
獲取方式:
jieba.get_dict_file()
==> jieba.dt.get_dict.file()
獲取分詞器所使用的詞典,返回文件類對(duì)象。默認(rèn)返回默認(rèn)詞典。
---代碼---result = jieba.get_dict_file() print(result.name)---結(jié)果---'C:\\Users\\Harrison\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages\\jieba\\dict.txt' -
示例
創(chuàng)新辦 3 i 云計(jì)算 5 凱特琳 nz 臺(tái)中 -
詞性(部分)
標(biāo)簽含義標(biāo)簽含義標(biāo)簽含義標(biāo)簽含義 n 普通名詞 f 方位名詞 s 處所名詞 t 時(shí)間 nr 人名 ns 地名 nt 機(jī)構(gòu)名 nw 作品名 nz 其他專名 v 普通動(dòng)詞 vd 動(dòng)副詞 vn 名動(dòng)詞 a 形容詞 ad 副形詞 an 名形詞 d 副詞 m 數(shù)量詞 q 量詞 r 代詞 p 介詞 c 連詞 u 助詞 xc 其他虛詞 w 標(biāo)點(diǎn)符號(hào) PER 人名 LOC 地名 ORG 機(jī)構(gòu)名 TIME 時(shí)間
調(diào)整詞典(添加、刪除、調(diào)整詞頻)
-
-
jieba.add_word(word, freq=None, tag=None)
==> jieba.dt.add_word(word, freq=None, tag=None)
向分詞器使用詞典中添加新詞
-
參數(shù)
word:str。希望向詞典中添加的詞。
freq=None: 指定新詞詞頻,默認(rèn)為None。詞頻為None時(shí)使用自動(dòng)計(jì)算的能保證分出該詞的詞頻。
tag=None:指定新詞詞性,默認(rèn)為None。
-
返回
None。
-
-
jieba.del_word(word)
==> jieba.dt.del_word(word)
刪除分詞器使用詞典中的某個(gè)詞
-
參數(shù)
word:str。希望從詞典中刪除的詞。
-
返回
None。
-
-
jieba.suggest_freq(segment, tune=False)
==> jieba.dt.suggest_freq(segment, tune=False)
調(diào)節(jié)單個(gè)詞語的詞頻,使其能(或不能)被分出來。(不會(huì)改變分詞器使用詞典內(nèi)容)
-
參數(shù)
segment:tuple or str。一個(gè)詞期待被分成的片段,此時(shí)輸入為片段的元組;如果希望該詞視為整體,則輸入為字符串。
tune=False:是否調(diào)整詞頻,默認(rèn)為False。一般使用True。
-
返回
計(jì)算機(jī)計(jì)算的詞頻。注意:自動(dòng)計(jì)算的詞頻在使用 HMM 新詞發(fā)現(xiàn)功能時(shí)可能無效。建議分詞時(shí)HMM=False。
-
示例
---代碼---# 待分詞文段 sentence = "本學(xué)期校內(nèi)選修課暫定于第3周2022年3月7日起開始上課,如有特殊調(diào)整將另行通知。"# 不調(diào)整詞頻精確模式列表模式 result = jieba.lcut(sentence) # 結(jié)果 print(result)jieba.suggest_freq("第3周", tune=True) # 調(diào)整詞頻精確模式列表模式:"第","3","周" —— "第三周" result = jieba.lcut(sentence, HMM=False) # 結(jié)果 print(result)jieba.suggest_freq(("日","起"), tune=True) # 調(diào)整詞頻精確模式列表模式:"日起" —— "日","起" result = jieba.lcut(sentence, HMM=False) # 結(jié)果 print(result)---結(jié)果---不調(diào)整詞頻精確模式列表模式: ['本學(xué)期', '校內(nèi)', '選修課', '暫定', '于', '第', '3', '周', '2022', '年', '3', '月', '7', '日起', '開始', '上課', ',', '如', '有', '特殊', '調(diào)整', '將', '另行通知', '。']調(diào)整詞頻精確模式列表模式:"第","3","周" —— "第3周" ['本學(xué)期', '校內(nèi)', '選修課', '暫定', '于', '第3周', '2022', '年', '3', '月', '7', '日', '起', '開始', '上課', ',', '如', '有', '特殊', '調(diào)整', '將', '另行通知', '。']調(diào)整詞頻精確模式列表模式:"日起" —— "日","起" ['本學(xué)期', '校內(nèi)', '選修課', '暫定', '于', '第3周', '2022', '年', '3', '月', '7', '日', '起', '開始', '上課', ',', '如', '有', '特殊', '調(diào)整', '將', '另行通知', '。']
-
Tokenize:分詞后返回詞語在原文的起止位置
jieba.tokenize(sentence, mode="default", HMM=True)
==> jieba.dt.tokenize(sentence, mode="default", HMM=True)
- 參數(shù)
? sentence:str。要進(jìn)行分詞的字符串。
? mode="default":默認(rèn)模式“default”,搜索模式“search”,默認(rèn)為默認(rèn)模式。
? HMM=True:默認(rèn)為True,使用HMM模型,一般是使用的,即保持默認(rèn)值,可忽略。True表示使用HMM模型,False表示不使用HMM模型。
-
返回
(word,start,end)的生成器,start是word在輸入字符串中的開始位置,end是word在輸入字符串中的結(jié)束位置。
-
示例
---代碼---# 默認(rèn)模式 result = jieba.tokenize('永和服裝飾品有限公司') print(result) for tk in result:print(tk)# 搜索模式 result = jieba.tokenize('永和服裝飾品有限公司', mode="search") print(result) for tk in result:print(tk)---結(jié)果---默認(rèn)模式: <generator object Tokenizer.tokenize at 0x0000016E5F89FA50> ('永和', 0, 2) ('服裝', 2, 4) ('飾品', 4, 6) ('有限公司', 6, 10)搜索模式: <generator object Tokenizer.tokenize at 0x0000016E5FCFBD60> ('永和', 0, 2) ('服裝', 2, 4) ('飾品', 4, 6) ('有限', 6, 8) ('公司', 8, 10) ('有限公司', 6, 10)
?
詞性標(biāo)注
jieba.posseg.lcut(sentence) = list(jieba.posseg.cut(sentence))
分詞后標(biāo)注每個(gè)詞的詞性,返回jieba.posseg.pair對(duì)象(該對(duì)象可看成是一個(gè)元組)的列表或生成器。
---代碼---# 導(dǎo)入 import jieba.posseg# 待分詞文段 sentence = "本學(xué)期校內(nèi)選修課暫定于第3周2022年3月7日起開始上課,如有特殊調(diào)整將另行通知。"# 返回列表 result = jieba.posseg.lcut(sentence) # 結(jié)果 print(result)# 返回生成器 result = jieba.posseg.cut(sentence) # 結(jié)果 print(result)---結(jié)果---返回列表: [pair('本學(xué)期', 'n'), pair('校內(nèi)', 's'), pair('選修課', 'v'), pair('暫定', 'd'), pair('于', 'p'), pair('第', 'm'), pair('3', 'm'), pair('周', 'nr'), pair('2022', 'm'), pair('年', 'm'), pair('3', 'm'), pair('月', 'm'), pair('7', 'm'), pair('日', 'm'), pair('起', 'v'), pair('開始', 'v'), pair('上課', 'v'), pair(',', 'x'), pair('如', 'v'), pair('有', 'v'), pair('特殊', 'a'), pair('調(diào)整', 'vn'), pair('將', 'd'), pair('另行通知', 'i'), pair('。', 'x')]返回生成器: <generator object cut at 0x00000240C15F5350>提取關(guān)鍵詞
導(dǎo)入
import jieba.analyse
基于 TF-IDF 算法的關(guān)鍵詞抽取
TF-IDF的主要思想是:如果某個(gè)詞或短語在一篇文章中出現(xiàn)的頻率TF高,并且在其他文章中很少出現(xiàn),則認(rèn)為此詞或者短語具有很好的類別區(qū)分能力,適合用來分類。
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
-
參數(shù)
sentence:str。為待提取的文本。
topK=20:返回TF/IDF 權(quán)重最大的關(guān)鍵詞的數(shù)目,默認(rèn)值為 20。
withWeight=False:是否一并返回關(guān)鍵詞權(quán)重值,默認(rèn)值為 False。
allowPOS=():僅包括指定詞性的詞,即篩選,默認(rèn)值為空,即不篩選。
-
返回
列表
基于 TextRank 算法的關(guān)鍵詞抽取
其思想是:通過詞之間的相鄰關(guān)系構(gòu)建網(wǎng)絡(luò),然后用PageRank迭代計(jì)算每個(gè)節(jié)點(diǎn)的rank值,排序rank值即可得到關(guān)鍵詞。
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))
-
參數(shù)
sentence
topK=20
withWeight=False
allowPOS=('ns', 'n', 'vn', 'v'):僅包括指定詞性的詞,即篩選,默認(rèn)值為(‘ns’, ‘n’, ‘vn’, ‘v’)。
-
返回
列表
其他詞典
占用內(nèi)存較小的詞典文件
https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.small
支持繁體分詞更好的詞典文件
https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.big
總結(jié)
以上是生活随笔為你收集整理的jieba 中文分词的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Expresso学习.net正则表达
- 下一篇: JAVA四种基本排序总结