中文分词

 

(转)

中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。
现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。
1
、基于字符串匹配的分词方法
这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个充分大的机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下:
1
)正向最大匹配法(由左到右的方向);
2
)逆向最大匹配法(由右到左的方向);
3
)最少切分(使每一句中切出的词数最小)。
还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。
一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词结果进行检验、调整,从而极大地提高切分的准确率。
对于机械分词方法,可以建立一个一般的模型,在这方面有专业的学术论文,这里不做详细论述。
2
、基于理解的分词方法
这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。
3
、基于统计的分词方法
从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。定义两个字的互现信息,计算两个汉字XY的相邻共现概率。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如这一之一有的我的许多的等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。

到底哪种分词算法的准确度更高,目前并无定论。对于任何一个成熟的分词系统来说,不可能单独依靠某一种算法来实现,都需要综合不同的算法。笔者了解,海量科技的分词算法就采用复方分词法,所谓复方,相当于用中药中的复方概念,即用不同的药材综合起来去医治疾病,同样,对于中文词的识别,需要多种算法来处理不同的问题。
分词中的难题
有了成熟的分词算法,是否就能容易的解决中文分词的问题呢?事实远非如此。中文是一种十分复杂的语言,让计算机理解中文语言更是困难。在中文分词过程中,有两大难题一直没有完全突破。
1
、歧义识别
歧义是指同样的一句话,可能有两种或者更多的切分方法。例如:表面的,因为表面面的都是词,那么这个短语就可以分成表面 面的。这种称为交叉歧义。像这种交叉歧义十分常见,前面举的和服的例子,其实就是因为交叉歧义引起的错误。化妆和服装可以分成化妆 服装或者化妆 和服 。由于没有人的知识去理解,计算机很难知道到底哪个方案正确。
交叉歧义相对组合歧义来说是还算比较容易处理,组合歧义就必需根据整个句子来判断了。例如,在句子这个门把手坏了中,把手是个词,但在句子请把手拿开中,把手就不是一个词;在句子将军任命了一名中将中,中将是个词,但在句子产量三年中将增长两倍中,中将就不再是词。这些词计算机又如何去识别?
如果交叉歧义和组合歧义计算机都能解决的话,在歧义中还有一个难题,是真歧义。真歧义意思是给出一句话,由人去判断也不知道哪个应该是词,哪个应该不是词。例如:乒乓球拍卖完了,可以切分成乒乓 球拍 、也可切分成乒乓球 拍卖 ,如果没有上下文其他的句子,恐怕谁也不知道拍卖在这里算不算一个词。
2
、新词识别
新词,专业术语称为未登录词。也就是那些在字典中都没有收录过,但又确实能称为词的那些词。最典型的是人名,人可以很容易理解句子王军虎去广州了中,王军虎是个词,因为是一个人的名字,但要是让计算机去识别就困难了。如果把王军虎做为一个词收录到字典中去,全世界有那么多名字,而且每时每刻都有新增的人名,收录这些人名本身就是一项巨大的工程。即使这项工作可以完成,还是会存在问题,例如:在句子王军虎头虎脑的中,王军虎还能不能算词?
新词中除了人名以外,还有机构名、地名、产品名、商标名、简称、省略语等都是很难处理的问题,而且这些又正好是人们经常使用的词,因此对于搜索引擎来说,分词系统中的新词识别十分重要。目前新词识别准确率已经成为评价一个分词系统好坏的重要标志之一。
中文分词的应用
目前在自然语言处理技术中,中文处理技术比西文处理技术要落后很大一段距离,许多西文的处理方法中文不能直接采用,就是因为中文必需有分词这道工序。中文分词是其他中文信息处理的基础,搜索引擎只是中文分词的一个应用。其他的比如机器翻译(MT)、语音合成、自动分类、自动摘要、自动校对等等,都需要用到分词。因为中文需要分词,可能会影响一些研究,但同时也为一些企业带来机会,因为国外的计算机处理技术要想进入中国市场,首先也是要解决中文分词问题。在中文研究方面,相比外国人来说,中国人有十分明显的优势。
分词准确性对搜索引擎来说十分重要,但如果分词速度太慢,即使准确性再高,对于搜索引擎来说也是不可用的,因为搜索引擎需要处理数以亿计的网页,如果分词耗用的时间过长,会严重影响搜索引擎内容更新的速度。因此对于搜索引擎来说,分词的准确性和速度,二者都需要达到很高的要求。目前研究中文分词的大多是科研院校,清华、北大、中科院、北京语言学院、东北大学、IBM研究院、微软中国研究院等都有自己的研究队伍,而真正专业研究中文分词的商业公司除了海量科技以外,几乎没有了。科研院校研究的技术,大部分不能很快产品化,而一个专业公司的力量毕竟有限,看来中文分词技术要想更好的服务于更多的产品,还有很长一段路。

 

 

编写简单的中文分词程序


几个月之前,在网上找到了一个中文词库素材(几百K),当时便想写一个分词程序了.我对汉语分词没有什么研究,也就凭自己臆想而写.若有相关方面专家,还请多给意见.

一、词库

词库大概有5万多词语(google能搜到,类似的词库都能用),我摘要如下:

地区    82
重要    81
新华社    80
技术    80
会议    80
自己    79
干部    78
职工    78
群众    77
没有    77
今天    76
同志    76
部门    75
加强    75
组织    75

第一列是词,第二列是权重.我写的这个分词算法目前并未利用权重.

二、设计思路

算法简要描述:

对一个字符串S,从前到后扫描,对扫描的每个字,从词库中寻找最长匹配.比如假设S="我是中华人民共和国公民",词库中有"中华人民共和国","中华","公民","人民","共和国"......等词.当扫描到"",那么从中字开始,向后分别取1,2,3,......个字("","中华","中华人","中华人民","中华人民共","中华人民共和","中华人民共和国",,"中华人民共和国公"),词库中的最长匹配字符串是"中华人民共和国",那么就此切分开,扫描器推进到"".

数据结构:

选择什么样的数据结构对性能影响很大.我采用Hashtable _rootTable记录词库.键值对为(,插入次数).对每一个词语,如果该词语有N个字,则将该词语的1,1~2,1~3,......1~N个字作为键,插入_rootTable.而同一个键如果重复插入,则后面的值递增.

三、程序

具体程序如下(程序中包含权重,插入次数等要素,目前的算法并没有利用这些.可以借此写出更有效的分词算法):

ChineseWordUnit.cs //struct--(词语,权重)

 1     public struct ChineseWordUnit
 2      {
 3         private string _word;
 4         private int _power;
 5
 6         /**//// <summary>
 7         /// 中文词语单元所对应的中文词。
 8         /// </summary>
 9         public string Word
10          {
11             get
12              {
13                 return _word;
14             }
15         }
16
17         /**//// <summary>
18         /// 
该中文词语的权重。
19         /// </summary>
20         public int Power
21          {
22             get
23              {
24                 return _power;
25             }
26         }
27
28         /**//// <summary>
29         /// 
结构初始化。
30         /// </summary>
31         /// <param name="word">中文词语</param>
32         /// <param name="power">该词语的权重</param>
33         public ChineseWordUnit(string word, int power)
34          {
35             this._word = word;
36             this._power = power;
37         }
38     }

 

ChineseWordsHashCountSet.cs //词库容器

 1     /**//// <summary>
 2     /// 记录字符串出现在中文字典所录中文词语的前端的次数的字典类。如字符串出现在中国的前端,则在字典中记录一个次数。
 3     /// </summary>
 4     public class ChineseWordsHashCountSet
 5      {
 6         /**//// <summary>
 7         /// 
记录字符串在中文词语中出现次数的Hashtable。键为特定的字符串,值为该字符串在中文词语中出现的次数。
 8         /// </summary>
 9         private Hashtable _rootTable;
10
11         /**//// <summary>
12         /// 
类型初始化。
13         /// </summary>
14         public ChineseWordsHashCountSet()
15          {
16             _rootTable = new Hashtable();
17         }
18
19         /**//// <summary>
20         /// 
查询指定字符串出现在中文字典所录中文词语的前端的次数。
21         /// </summary>
22         /// <param name="s">指定字符串</param>
23         /// <returns>字符串出现在中文字典所录中文词语的前端的次数。若为-1,表示不出现。</returns>
24         public int GetCount(string s)
25          {
26             if (!this._rootTable.ContainsKey(s.Length))
27              {
28                 return -1;
29             }
30             Hashtable _tempTable = (Hashtable)this._rootTable[s.Length];
31             if (!_tempTable.ContainsKey(s))
32              {
33                 return -1;
34             }
35             return (int)_tempTable[s];
36         }
37
38         /**//// <summary>
39         /// 
向次数字典中插入一个词语。解析该词语,插入次数字典。
40         /// </summary>
41         /// <param name="s">所处理的字符串。</param>
42         public void InsertWord(string s)
43          {
44             for(int i=0;i<s.Length;i++)
45              {
46                 string _s = s.Substring(0,i+1);
47                 this.InsertSubString(_s);
48             }
49         }
50
51         /**//// <summary>
52         /// 
向次数字典中插入一个字符串的次数记录。
53         /// </summary>
54         /// <param name="s">所插入的字符串。</param>
55         private void InsertSubString(string s)
56          {
57             if (!_rootTable.ContainsKey(s.Length)&&s.Length>0)
58              {
59                 Hashtable _newHashtable = new Hashtable();
60                 _rootTable.Add(s.Length,_newHashtable);
61             }
62             Hashtable _tempTable = (Hashtable)_rootTable[s.Length];
63             if (!_tempTable.ContainsKey(s))
64              {
65                 _tempTable.Add(s,1);
66             }
67             else
68              {
69                 _tempTable[s]=(int)_tempTable[s]+1;
70             }
71         }
72     }

ChineseParse.cs //分词器

 1     /**//// <summary>
 2     /// 中文分词器。
 3     /// </summary>
 4     public class ChineseParse
 5      {
 6         private static ChineseWordsHashCountSet _countTable;
 7
 8         static ChineseParse()
 9          {
10             _countTable = new ChineseWordsHashCountSet();
11             InitFromFile("ChineseDictionary.txt");
12         }
13
14         /**//// <summary>
15         /// 
从指定的文件中初始化中文词语字典和字符串次数字典。
16         /// </summary>
17         /// <param name="fileName">文件名</param>
18         private static void InitFromFile(string fileName)
19          {
20             string path = Directory.GetCurrentDirectory() +@"/" + fileName;
21             if (File.Exists(path))
22              {
23                 using (StreamReader sr = File.OpenText(path)) 
24                  {
25                     string s = "";
26                     while ((s = sr.ReadLine()) != null
27                      {
28                         ChineseWordUnit _tempUnit = InitUnit(s);
29                         _countTable.InsertWord(_tempUnit.Word);
30                     }
31                 }
32             }
33         }
34
35         /**//// <summary>
36         /// 
将一个字符串解析为ChineseWordUnit
37         /// </summary>
38         /// <param name="s">字符串</param>
39         /// <returns>解析得到的ChineseWordUnit</returns>
40         private static ChineseWordUnit InitUnit(string s)
41          {
42             Regex reg = new Regex(@"/s+");
43             string[] temp = reg.Split(s);
44             if (temp.Length!=2)
45              {
46                 throw new Exception("
字符串解析错误:"+s);
47             }
48             return new ChineseWordUnit(temp[0],Int32.Parse(temp[1]));
49         }
50
51         /**//// <summary>
52         /// 分析输入的字符串,将其切割成一个个的词语。
53         /// </summary>
54         /// <param name="s">待切割的字符串</param>
55         /// <returns>所切割得到的中文词语数组</returns>
56         public static string[] ParseChinese(string s)
57          {
58             int _length = s.Length;
59             string _temp = String.Empty;
60             ArrayList _words = new ArrayList();
61
62             for(int i=0;i<s.Length;)
63              {
64                 _temp = s.Substring(i,1);
65                 if (_countTable.GetCount(_temp)>1)
66                  {
67                     int j=2;
68
69                     for (;i+j<s.Length+1&&_countTable.GetCount(s.Substring(i,j))>0;j++)
70                      {
71                     }
72                     _temp = s.Substring(i,j-1);
73                     i = i + j - 2;
74                 }
75                 i++;
76                 _words.Add(_temp);
77             }
78
79             string[] _tempStringArray = new string[_words.Count];
80             _words.CopyTo(_tempStringArray);
81             return _tempStringArray;
82         }
83     }


四、测试

和海量分词演示程序对比测试:

Case 1:  新浪体育讯 在被尤文淘汰之后,皇马主帅博斯克拒绝接受媒体对球队后防线的批评,同时还为自己排出的首发阵容进行了辩护。失利是全队的责任,而不仅仅是后防线该受指责,博斯克说,我并不认为我们踢得一塌糊涂。”“我们进入了半决赛,而且在晋级的道路上一路奋战。即使是今天的比赛我们也有几个翻身的机会,但我们面对的对手非常强大,他们踢得非常好。”“我们的球迷应该为过去几个赛季里我们在冠军杯中的表现感到骄傲。博斯克还说。对于博斯克在首发中排出了久疏战阵的坎比亚索,赛后有记者提出了质疑,认为完全应该将队内的另一名球员帕文派遣上场以加强后卫线。对于这一疑议,博斯克拒绝承担所谓的责任,认为球队的首发没有问题。我们按照整个赛季以来的方式做了,对于人员上的变化我没有什么可说的。对于球队在本赛季的前景,博斯克表示皇马还有西甲联赛的冠军作为目标。皇家马德里在冠军杯中战斗到了最后,我们在联赛中也将这么做。

海量分词结果:

    新浪 体育   尤文 淘汰 之后 皇马 主帅 博斯克 拒绝 接受 媒体 球队 后防线 批评 同时 自己 排出 首发 阵容 进行 辩护 失利 全队 责任 仅仅 后防线 指责 博斯克 认为 我们 一塌糊涂 ” “ 我们 进入 半决赛 而且 晋级 道路 一路 奋战 即使 今天 比赛 我们 几个 翻身 机会 我们 面对 对手 非常 强大 他们 非常 ” “ 我们 球迷 应该 过去 几个 赛季 我们 冠军 杯中 表现 感到 骄傲 博斯克 对于 博斯克 首发 排出 战阵 坎比亚索 赛后 记者 提出 质疑 认为 完全 应该 一名 球员 帕文 派遣 上场 加强 后卫线 对于 博斯克 拒绝 承担 所谓 责任 认为 球队 首发 没有 问题 我们 按照 整个 赛季 以来 方式 对于 人员 变化 没有 什么 对于 球队 赛季 前景 博斯克 表示 皇马 还有 西 联赛 冠军 作为 目标 皇家 马德里 冠军 杯中 战斗 最后 我们 联赛 这么

ChineseParse分词结果:

    体育   淘汰 之后 主帅 博斯 拒绝 接受 媒体 球队 后防线 批评 同时 自己 首发 阵容 进行 辩护 失利 全队 责任 不仅仅 后防线 指责 博斯 认为 我们 一塌糊涂 ” “ 我们 进入 半决赛 而且 晋级 道路 上一 奋战 即使 今天 比赛 我们 翻身 机会 我们 面对 对手 非常 强大 他们 非常 ” “ 我们 球迷 应该 赛季 我们 冠军杯 表现 感到 骄傲 博斯 。对于 博斯 首发 中排 赛后 记者 提出 质疑 认为 完全 应该 另一 球员 派遣 上场 加强 后卫线 对于 这一 博斯 拒绝 承担 所谓 责任 认为 球队 首发 没有 问题 我们 按照 整个 赛季 以来 方式 对于 人员 变化 没有 什么 对于 球队 本赛 前景 博斯 表示 还有 西 联赛 冠军 作为 目标 皇家 马德里 冠军杯 战斗 最后 我们 联赛 这么

因为没有体育专业词库和人名专业词库,所以ChineseParse不能认识这些专业词.

Case 2:    我国汽车社会第一次重大转型历经十多年时间。在1994年出台的《汽车工业产业政策》中,最醒目的一条就是逐步改变以行政机关、团体、事业单位及国有企业为主的公款购买、使用小汽车的消费结构。从公款购买汽车为主到汽车逐渐进入家庭,第一次重大转型给人民生活质量带来了巨大提升。这次转型的主要推动力是态度鲜明的产业政策、持续高速增长的国民经济以及蓬勃发展的国内汽车工业。     然而,当我们快速迈进以私人汽车为主体的汽车社会的时候,也面临着新的形势、新的考验:中央强调树立和落实科学发展观,要求国内企业提高自主创新能力;今年两会期间,中央又提出构建和谐社会和节约型社会的精神;同时,我国汽车社会面临能源紧缺、燃油价格上涨、土地资源有限等诸多不利因素。在这样的大背景下,进行第二次重大转型刻不容缓。

海量分词结果:

我国 汽车 社会 第一次 重大 转型 历经 十多年 时间 1994 出台 汽车 工业 产业 政策 醒目 一条 就是逐步 改变 行政 机关 团体 事业 单位 国有 企业 为主 公款 购买 使用 小汽车 消费 结构 公款 购买 汽车 为主 汽车 逐渐 进入 家庭 第一次 重大 转型 人民 生活 质量 带来 巨大 提升 这次 转型 主要 推动力 态度 鲜明 产业 政策 持续 高速 增长 国民经济 以及 蓬勃 发展 国内 汽车 工业        然而 我们 快速 迈进 私人 汽车 主体 汽车 社会 时候 面临 形势 考验 中央 强调 树立 落实 科学 发展观 要求 国内 企业 提高 自主 创新 能力 今年两会期间 中央 提出 构建 和谐 社会 节约型 社会 精神 同时 我国 汽车 社会 面临 能源 紧缺 燃油 价格 上涨 土地 资源 有限 诸多 不利 因素 这样 背景 进行 第二次 重大 转型 刻不容缓   
 
ChineseParse
分词结果:

我国 汽车 社会 第一 重大 转型 历经 多年 时间 1 9 9 4 出台 汽车 工业 产业 政策 醒目 一条 就是逐步 改变 行政 机关 、团体 事业 单位 国有 企业 为主 公款 购买 使用 小汽车 消费 结构 公款 购买 汽车 为主 汽车 逐渐 进入 家庭 第一 重大 转型 人民 生活 质量 带来 巨大 提升 这次 转型 主要 推动力 态度 鲜明 产业 政策 持续 高速 增长 国民经济 以及 蓬勃 发展 国内 汽车 工业            然而 我们 快速 迈进 私人 汽车 为主 汽车 社会 时候 面临 形势 考验 中央 强调 树立 落实 科学 发展观 要求 国内 企业 提高 自主 创新 能力 今年两会期间 中央 提出 构建 和谐 社会 节约 社会 精神 同时 我国 汽车 社会 面临 能源 紧缺 燃油 价格 上涨 土地 资源 有限 诸多不 因素 这样 背景 进行 第二 重大 转型 刻不容缓

可以看出,ChineseParse不能智能处理"第一次","第二次"这种词,对数字也没识别能力,不过基本的分词效果还是可以的.

(毕竟我3个小时就把程序搞定了,怎么能和别人十年积累的比呢?)

性能测试(迅驰1.5M): 每秒钟67.7万字

程序优化有应该更高.

五、小结

进一步应该做的:
1,
能识别简单的外语,数字
2,
具备简单智能
3,
扩充词库

然后就有实用价值了.

:前几个月写的大多都是诸如此类简单的中文处理小程序,如繁简转换,自动排版,批量替换,中文分词,有时间的话我会把这些程序集中起来打包成一个实用的中文处理工具.不知道大家还有什么需求,不防说说.

 

基于逆向最大化词表中文分词法。

  以前做知识管理系统的时候,由于需要建立全文检索和统计词频,需要对中文文本进行分词。对于中文分词,

国内做到好的应该是中科院自然研究所,但是相对比较复杂,我看了几次没有看明白. :)  ,由于平常我们的知识系统

对分词的要求没有这么高,所以 就选择了最大化的词表分词法词表选择的是人民日报97版的词表.

实际效果可以达到90%以上,基本可以满足需要。支持 Lucene.net分词,词表是启动时一次性载入;

   具体代码如下:

  public sealed class LtWordTokenizer : Tokenizer
 {
  private String bufferText;
  private ArrayList wordArray; 
  private int  intIndex=0;  
  public static Hashtable hsDic=new Hashtable();  

  public LtWordTokenizer(TextReader _in)
  {
   input = _in;
   bufferText=input.ReadToEnd().ToLower();   
   wordArray=new ArrayList();   
   wordSegment(bufferText);  
   
  }  

  public void wordSegment(String Sentence)
  {
   int senLen = Sentence.Length;
   int i=0, j=0;
   int M=12;
   string word;    
   while(i < senLen)
   {
    int N= i+M<senLen ? i+M : senLen+1;
    bool bFind=false;
    for(j=N-1; j>i; j--)
    {
     word = Sentence.Substring(i, j-i).Trim();     
     if(hsDic.ContainsKey(word.Trim()))
     {
      wordArray.Add(new Token(word,i,i+word.Length));      
      bFind=true;
      i=j;
      break;
     }     
    }
    if(!bFind)
    {
     word = Sentence.Substring(i, 1).Trim();
     i=j+1;
     if(word.Trim()!="")
     {
      wordArray.Add(new Token(word,i,i+word.Length));     
     }     
    }
   } 
  }


 
  public override Token Next()
  { 
   
   if(intIndex<wordArray.Count)
   { 
    intIndex++;
    return (Token)(wordArray[intIndex-1]);           
   }
   else
    return null;   
  }
  
 }
}

下次可以在分词的时候更改一下,不必先分好保存到arraylist,动态速度更好

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值