数量词提取

在进行自然语言处理的时候,数量词也是需要经常面对的一个问题。数量词相对于名词,特征明显,一般来说是较为容易提取的一类词汇。特别是基于阿拉伯数字的数量词,特征很明显,易于区别。对于基于中文数字的数量词则稍微麻烦一些,主要是因为数量词也充当一些词汇的具体成分。
例如:“一五一十”。这本是个习惯用语。如果按照简单的提取方法,这个字符串会被当做普通数词做处理。

一、基本思路

数量词提取的基本思路很简单:利用正则语法处理模块进行提取即可。有多少种数量词类型,就枚举多少种正则规则。殊不知,这其中有几个很严重的问题。

(1)识别产生矛盾如何处置。
即,两种正则描述都符合。同一个字符串可以匹配两种不同的正则法则。

(2)识别产生相互覆盖如何处置。
即,一个字符串一段符合一种正则描述,另外一段符合另外一种正则描述,而且他们相互之间有一部分相互重叠。

(3)效率问题
Regex模块并不是一个十分有效率的模块。规则越多,匹配过程越漫长。面对几千万的语料库,其处理效率过低,将会严重影响后续工作。

为了解决如上问题,可以采取如下方法:

(1)采取“粗”提取的方式,规则越简单越好。
此举的目的主要是减少规则数量,提高效率。规则的制定,还要充分利用“拼合归一”过程,尽量的简洁。

(2)需要将匹配结果进行一个“拼合归一”的过程。
拼合过程是指将两个匹配重叠的地方“连接”起来形成一个字符串,而且要删除相互覆盖的字符串。说白了,就有点像“大鱼吃小鱼”的过程。长一点的字符串吞并短一点的字符串;相互重叠的字符串进行“接龙”处理,形成一个更长的字符串。

如下是按照传统方法制定的正则规则(仅摘取其中一部分):

……
            // 日期
            "(\\d{4}|\\d{2})[\\s]?年", //日期
            "(0?[1-9]|1[0-2])[\\s]?月", //日期
            "((0?[1-9])|((1|2)[0-9])|30|31)[\\s]?(号|日)", //日期
            //"(\\d{4}|\\d{2})[\\s]?年[\\s]?((1[0-2])|(0?[1-9]))[\\s]?月", //日期
            //"(0?[1-9]|1[0-2])[\\s]?月((0?[1-9])|((1|2)[0-9])|30|31)[\\s]?日", //日期
            "(\\d{4}|\\d{2})-((1[0-2])|(0?[1-9]))[\\s]?-[\\s]?(([12][0-9])|(3[01])|(0?[1-9]))", //日期
            "(\\d{4}|\\d{2})[\\s]?年((1[0-2])|(0?[1-9]))[\\s]?月(([12][0-9])|(3[01])|(0?[1-9]))[\\s]?日", //日期
            // 时间
            "((1|0?)[0-9]|2[0-3])[\\s]?时", //时间
            "([0-5][0-9])[\\s]?分([0-5][0-9])[\\s]?秒", //时间
            "((1|0?)[0-9]|2[0-3])[\\s]?(:|:|∶)[\\s]?([0-5][0-9])", //时间
            "((1|0?)[0-9]|2[0-3])[\\s]?(时|点)([0-5][0-9])[\\s]?分", //时间
            "((1|0?)[0-9]|2[0-3])[\\s]?(:|:|∶)[\\s]?([0-5][0-9])[\\s]?(:|:|∶)[\\s]?([0-5][0-9])", //时间
            // 时间段
            "(\\d{4}|\\d{2})[\\s]?年[\\s]?-[\\s]?(\\d{4}|\\d{2})[\\s]?年", //时间段
            "(\\d{4}|\\d{2})[\\s]?/[\\s]?(\\d{4}|\\d{2})[\\s]?财年", //时间段
            "((1|0?)[0-9]|2[0-3])[\\s]?[点|时][\\s]?-[\\s]?((1|0?)[0-9]|2[0-3])[\\s]?[点|时]", //时间段
            "((0?[1-9])|((1|2)[0-9])|30|31)[\\s]?[日|号][\\s]?-[\\s]?((0?[1-9])|((1|2)[0-9])|30|31)[\\s]?[日|号]", //时间段
            "(\\d{4}|\\d{2})年((1[0-2])|(0?[1-9]))[\\s]?月[\\s]?-[\\s]?(\\d{4}|\\d{2})年((1[0-2])|(0?[1-9]))[\\s]?月", //时间段
            "((1[0-2])|(0?[1-9]))[\\s]?月[\\s]?(([12][0-9])|(3[01])|(0?[1-9]))[\\s]?日[\\s]?-[\\s]?((1[0-2])|(0?[1-9]))[\\s]?月[\\s]?(([12][0-9])|(3[01])|(0?[1-9]))[\\s]?日", //时间段
            "(\\d{4}|\\d{2})[\\s]?年[\\s]?((1[0-2])|(0?[1-9]))[\\s]?月[\\s]?(([12][0-9])|(3[01])|(0?[1-9]))[\\s]?日[\\s]?-[\\s]?(\\d{4}|\\d{2})[\\s]?年[\\s]?((1[0-2])|(0?[1-9]))[\\s]?月[\\s]?(([12][0-9])|(3[01])|(0?[1-9]))[\\s]?日", //时间段

            // 特殊标识
            // 身份证号码
            "\\d{15}(\\d\\d[0-9xX])?", //身份证
            // 国内电话号码(易混淆)
            "(\\d{4}|\\d{3})?[\\s]?-[\\s]?(\\d{8}|\\d{7})", //电话
            "(\\d{4}|\\d{3})?[\\s]?-[\\s]?(\\d{4}|\\d{3})?-[\\s]?(\\d{4}|\\d{3})", //电话
            // HTML标记(易混淆、有死循环可能)
            // "<(.*)(.*)>.*<\\/\\1>|<(.*) \\/>", //HTML标记
            // EMail地址
            "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*", //电子邮箱
            // IP地址
            "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)", //IP地址
            // URL地址(易混淆)
            "\\b(([\\w-]+://?|www[.])[^\\s()<>]+(?:\\([\\w\\d]+\\)|([^[:punct:]\\s]|/)))", //URL地址
……

其规则条数有上百条,匹配效率不高,调试也很困难(因为很难判断哪条影响了匹配的结果)。

如下是调整后的正则规则:

        private static readonly string[] QUANTITY_RULES =
        {
            ////////////////////////////////////////////////////////////////////////////////
            //
            // 加载正则规则。
            //
            ////////////////////////////////////////////////////////////////////////////////
            "\\d+$v", // 单位符号
            "\\d+$u", // 单位名称
            "\\d+$q", // 量词
            "\\d+$y", // 货币名称

            ",\\d{3}",
            "\\d+[至|比]",
            "[¥|$]\\d+",

            "$c+$u", // 单位名称
            "$c+$q", // 量词
            "$c+$y", // 货币名称

            "[\\.|+|\\-|*|/|<|=|#|+|-|×|÷]+[A-Za-z\\d]+",
            "[A-Za-z\\d]+[\\.|~|'|\"|:|+|\\-|*|/|>|=|#|:|~|+|-|×|÷]+",

            "[十|百|千|万|亿][多|余]?[十|百|千|万|亿]?$c{1,2}",
            "$c{1,2}[十|百|千|万|亿][多|余]?[个|十|百|千|万|亿]?($u|$q|$y)?",

            "\\d+[十|百|千|万|亿][多|余]?[个|十|百|千|万|亿]?($u|$q|$y)?",

            "每$u",
            "第$c", //序数
            "第\\d+", //序数

            "$c+分之",
            "[百]?分之$c+",
            "[\\d+|$c+]个百分点", //百分点

            "[上|中|下]午",
            "(\\d+|$c+)个(月|小时)",
            "(\\d+|$c+)(周|年|季度|刻钟)", 
        };

总共24条规则,就能覆盖绝大部分数量词的匹配。当然,这个只是“粗”提取规则,并没有做进一步细致的识别。提取完毕后,还需要再进行一次识别。不过有了第一次过滤后的结果,第二次识别会变得简单很多。而且更多的情况是:第一步就足以满足要求。毕竟自然语言的处理重点不是在识别数量词上。

二、结果匹配与拼合

结果的匹配可以直接使用Regex.Match函数。

        private static FunctionSegment[] GetAllMatched(string content)
        {
#if DEBUG
            Debug.Assert(!string.IsNullOrEmpty(content));
#endif
            // 创建对象
            List<FunctionSegment> fses
                = new List<FunctionSegment>();
            // 循环处理
            foreach (string rule in QUANTITY_RULES)
            {
                // 恢复规则
                string newRule = Quantity.RecoverRule(rule);
                // 检查匹配
                // 此函数非常消耗时间!!!
                Match match = Regex.Match(content, newRule);
                // 检查结果
                while (match.Success)
                {
                    // 创建对象
                    FunctionSegment fs =
                        new FunctionSegment();
                    // 设置数值
                    fs.Remark = QUANTITY;
                    fs.Index = match.Index;
                    fs.Value = match.Value;
                    fs.Length = match.Length;
                    // 加入列表
                    fses.Add(fs);
                    // 下一个
                    match = match.NextMatch();
                }
            }
            // 按照索引数值排序
            return fses.OrderBy(f => f.Index).ToList().ToArray();
        }

注意到这个函数里面有一个Quantity.RecoverRule函数。该函数是将匹配串中的一些简写恢复成标准的正则语句。因为书写正则规则的时候,经常会用到一些字符串。反复写的话,又长又乱。所以作者干脆自己定义了一套简化规则来表达即可。
例如:“$c”就表示“[零|一|二|三|四|五|六|七|八|九|十]”。

拼合算法也很简单,就是从字符串开头开始扫描整个字符串。检查哪个已匹配的字符串中包含这个索引位置,提取出来即可。

#if _USE_CLR
        public static FunctionSegment[] Extract(string content)
#elif _USE_CONSOLE
        public static FunctionSegment[]? Extract(string content)
#endif
        {
#if DEBUG
            Debug.Assert(!string.IsNullOrEmpty(content));
#endif
            // 获得匹配的项目
            FunctionSegment[] output = GetAllMatched(content);
            // 检查结果
            if (output == null || output.Length <= 0) return null;

            // 创建对象
            List<FunctionSegment> qses =
                new List<FunctionSegment>();
            // 循环处理
            for (int i = 0; i < content.Length; i++)
            {
                // 获得字符
                char c = FunctionSegment.GetChar(output, i);
                // 检查结果
                if (c != '\0')
                {
                    // 创建对象
                    FunctionSegment qs =
                        new FunctionSegment();
                    // 记录索引位置
                    qs.Index = i;
                    qs.Remark = QUANTITY;
                    // 创建对象
                    StringBuilder sb =
                        new StringBuilder();
                    // 循环处理
                    while (c != '\0')
                    {
                        // 增加字符
                        sb.Append(c);
                        // 增加计数
                        i++;
                        // 检查字符
                        c = FunctionSegment.GetChar(output, i);
                    }
                    // 设置参数
                    qs.Length = sb.Length; qs.Value = sb.ToString();
                    // 增加对象
                    qses.Add(qs);
                }
            }
            // 返回结果
            return qses.ToArray();
        }

三、需要注意的问题

编写正则规则需要注意以下几个问题:

(1)特殊符号:”.“
这个符号代表着任意,搞不好会造成Regex.Match死循环。

            // HTML标记(易混淆、有死循环可能)
            // "<(.*)(.*)>.*<\\/\\1>|<(.*) \\/>", //HTML标记

有兴趣的读者可以自己试试。

(2)所有需要转义的字符。例如:“\”,“-”等等。
这类符号处理不好,Regex.Match的匹配表现会非常奇怪。而且很不好查。

(3)中括号和小括号的区别。
中括号内的字符串必须等长,如果不等长,则按照最短长度的那个算。小括号则对字符串长度不敏感。
例如:“[月|小时]”,在匹配的时候,只有“月”会起作用。若要两个都起作用,需要改写成:“(月|小时)”。

四、实例

下面给出一个数量词提取的实例:

----------------------------------------
打印FilteredContent.GetContent(1528036)内容!
----------------------------------------
炎炎夏日,风行景逸邀您参与景逸城市路况节油挑战赛,同时玩转微博。当风行景逸遇上微博达人的您,这个夏日注定不一般。7月29日 ,景逸汽车和车主们将向城市拥堵路段—"沈阳魔鬼一环"发起挑战。随着"第八批节能汽车推广目录"的公布,景逸及景逸SUV,分别以工 信部发布的6.2L/百公里和6.6L/百公里的油耗进入名单,节油能力其实已经毋庸置疑。但如果在拥堵路段上跑又是一个什么样的结果呢?沈阳恒众达邀您共同见证—发送景逸节油赛照片到微博,赢精美大礼!当天观战景逸节油赛的您,无论您是或不是参赛者,您都是本次比赛的见证人。您上传的照片会是风行景逸汽车和车主对拥堵路况节油能力发起挑战的一个真实写照。参与方式:2.微活动截止时间为7月29日23时59分,评选出前10名者获精美礼品;3.获奖者评选只按时间顺序评比,与转发量、评论量无关;最后请朋友们文明发帖;4.评比 结果将在活动结束一周内公布,期间获奖情况您也可以微博或电话咨询;5.沈阳恒众达汽车贸易有限公司对本次活动拥有最终解释权!节油挑战,有你有我,魔鬼一环,我们共同见证!搜狐微博:http://syjoyear.t.sohu.com活动详细咨询:024-25822275销售热线:024-25516333(责任编辑:艾娜)分享到:本文相关推荐
----------------------------------------
打印QuantityExtractor.Extract(1528036)内容!
----------------------------------------
21:28:40 >      (数量词):[count(0),index([53])] = "一般"
21:28:40 >      (数量词):[count(0),index([56])] = "7月29日"
21:28:40 >      (数量词):[count(0),index([84])] = "一环"
21:28:40 >      (数量词):[count(0),index([95])] = "第八批"
21:28:40 >      (数量词):[count(0),index([129])] = "6.2L/"
21:28:40 >      (数量词):[count(0),index([138])] = "6.6L/"
21:28:40 >      (数量词):[count(0),index([179])] = "一个"
21:28:40 >      (数量词):[count(0),index([286])] = "一个"
21:28:40 >      (数量词):[count(0),index([298])] = "2."
21:28:40 >      (数量词):[count(0),index([308])] = "7月29日23时59分"
21:28:40 >      (数量词):[count(0),index([324])] = "10名"
21:28:40 >      (数量词):[count(0),index([334])] = "3."
21:28:40 >      (数量词):[count(0),index([372])] = "4."
21:28:40 >      (数量词):[count(0),index([384])] = "一周"
21:28:40 >      (数量词):[count(0),index([408])] = "5."
21:28:40 >      (数量词):[count(0),index([448])] = "一环"
21:28:40 >      (数量词):[count(0),index([463])] = "http://syjoyear.t.sohu.com"
21:28:40 >      (数量词):[count(0),index([496])] = "024-25822275"
21:28:40 >      (数量词):[count(0),index([513])] = "024-25516333"

可以看到:除了数量词,一些非数量词(例如:“一般”)的词汇也被提取了。不过这个比例不高,一般不会对结果造成太大影响。

----------------------------------------
打印FilteredContent.GetContent(5134061)内容!
----------------------------------------
四大类药品儿童须慎用1.氨基糖苷类:卫生部明确规定,6岁以下儿童应禁止使用这类药品,比如庆大霉素、丁胺卡那霉素、链霉素等, 这些药物容易导致儿童耳聋,还可能引起肾功能衰竭。2.大环内酯类:红霉素、罗红霉素、阿奇霉素等,这些治疗衣原体、军团菌、支原体的特效药,往往会对儿童肝脏造成较大的损伤,如果用药剂量大或用药时间长,可能造成肝功能衰竭、药物性肝炎,甚至引起死亡。3.氯霉素类:儿童使用后,可能会导致再生障碍性贫血、灰婴综合征,甚至引起儿童肝功能严重衰竭。4.奎诺酮类:氟诺沙星、环丙沙星等,已有实验数据表明,这类药物可导致软骨发育障碍,影响儿童的生长发育。信息时报记者 李莉近日,国家食品药品监督管理局修订含 盐酸金刚烷胺的非处方药说明书,仁和“优卡丹”、康芝“金立爽”、“好娃娃”等儿童感冒用药均面临被修改说明书和使用范围缩小的窘境。而国家食药监局公布的数据也显示,专供儿童使用的只有60多种,远不能满足临床需要。广东省中医医院儿科专家袁美凤教授直言:“一方面是儿童药品种少、规格少、剂型少,另一方面,不少家长对儿童用药存在误区,给小儿用"缩小版"成人药,这将给儿童健康带来很大的潜在危害。”专供药品少“儿童减半”成协定处方国家食药监局在近日召开的“儿童用药安全座谈会”上公布的一组数据显示,在我国3500多种药物制剂品种中,专供儿童使用的只有60几种,尚不足2%。儿童用药品种不足成人用药品种的5%;一般综合性大医院的儿科用药也低于5%,90%的药品没有儿童剂型。世界卫生组织发表声明,每年全球约有上千万5岁以下儿童死亡,其中三分之二死于用药不当,在中国,据2006年参加国家药品不良反应监测的儿童医院报告数据显示,儿童服药不良反应发生率平均达到12.9%,其中新生儿是24.4%。据分析,由于儿童身体发育尚未成熟,体内代谢有其特殊性,很多药品不适用。但记者了解到,不少家长认为,都是治病用的药,小孩减量使用就可以了;在儿童医院,“根据儿童常见病,比如腹泻、感冒、发烧等,挑选一些疗效确切、安全且应用多年的药物进行组合治疗,进行剂量折算后给儿童使用,这是医院最常见的"协定处方"。”卫生部全国合理用药监测系统专家孙忠实表示。“儿童减半”也常常出现在普通药品说明中的字样。但这“并不科学,超范围用药问题也很突出,存在较高的安全风险。”孙忠实说。调查显示,北京上海重庆等地的聋哑学校学生,70%是由于儿童时期用药使用不当造成的。“因此,妈妈们在选药时尽量选择专门给儿童吃的药,比如降火药可 选择三公仔小儿七星茶等儿童专属药物。”袁教授建议。
----------------------------------------
打印QuantityExtractor.Extract(5134061)内容!
----------------------------------------
21:31:18 >      (数量词):[count(0),index([10])] = "1."
21:31:18 >      (数量词):[count(0),index([26])] = "6岁"
21:31:18 >      (数量词):[count(0),index([85])] = "2."
21:31:18 >      (数量词):[count(0),index([181])] = "3."
21:31:18 >      (数量词):[count(0),index([227])] = "4."
21:31:18 >      (数量词):[count(0),index([427])] = "一方"
21:31:18 >      (数量词):[count(0),index([447])] = "一方"
21:31:18 >      (数量词):[count(0),index([539])] = "一组"
21:31:18 >      (数量词):[count(0),index([580])] = "2%"
21:31:18 >      (数量词):[count(0),index([598])] = "5%"
21:31:18 >      (数量词):[count(0),index([601])] = "一般"
21:31:18 >      (数量词):[count(0),index([617])] = "5%"
21:31:18 >      (数量词):[count(0),index([620])] = "90%"
21:31:18 >      (数量词):[count(0),index([644])] = "每年"
21:31:18 >      (数量词):[count(0),index([653])] = "5岁"
21:31:18 >      (数量词):[count(0),index([664])] = "三分之二"
21:31:18 >      (数量词):[count(0),index([680])] = "2006年"
21:31:18 >      (数量词):[count(0),index([724])] = "12.9%"
21:31:18 >      (数量词):[count(0),index([736])] = "24.4%"
21:31:18 >      (数量词):[count(0),index([839])] = "一些"
21:31:18 >      (数量词):[count(0),index([993])] = "70%"-

这些规则足以提取:时间、分数、百分数、整数、约数、浮点数、序数、比分、比值、货币、计量单位等很多常见的数量表达方式。

----------------------------------------
打印FilteredContent.GetContent(896358)内容!
----------------------------------------
本月我省中出双色球大奖的形势非常火爆,在本月初的前两期开奖中我省就各中一注奖金30多万元的二等奖,在10日晚的双色球第2012080期开奖中我省又迎来了5注二等奖,单注奖金101308元。至此,本月上旬我省已中出7注双色球二等奖。据了解,双色球第2012080期我省中出二等奖的地址是:海口市琼苑路鑫达兴商行福彩46010129号投注站,中奖彩票是一张投注额为26元自选单式倍投票,该票共有5注号 码,其中前4注号码各2倍投注,最后一注进行5倍投注,非常幸运的是中得二等奖的号码正是最后这注号码!据悉,这也是我省继双色球 第2012069期海口大同路一彩民独中5注二等奖之后,近来第二次单期中出5注二等奖。据了解,7月10日晚,中国福利彩票双色球游戏进行第2012080期开奖,当期开出的红球号码为04、09、14、15、16、27,红球三区比2:3:1;奇偶比3:3;大小比1:5,小号居多。当期的红球号码开出一组三连码14、15、16,遗漏8期后,双色球游戏再次开出三连码形态,上次出现在第2012071期双色球游戏中。同时,开出一组同位码04和14,蓝球开出号码03,当期末等奖开出1175万注。当期双色球井喷17注头奖,单注奖金571万元,四川彩民揽获5注成为当期大赢家,浙江、山东两省各揽获2注,其余8注被河北、黑龙江、福建、重庆、湖北、广东、广西、深圳彩民分享。当期二等奖开出181 注,单注奖金10.1万元。其中四川省中出17注,成为当期二等奖中出注数最多的地区,我省中出5注表现不俗。第2012080期双色球全国销量为3.33亿多元。当期双色球头奖井喷17注,单注奖金571万元,致使双色球奖池水位泄洪至4.55亿元,下期双色球游戏仍将实行"523"派奖,彩民朋友仍有2元中得1000万大奖机会。
----------------------------------------
打印QuantityExtractor.Extract(896358)内容!
----------------------------------------
21:33:09 >      (数量词):[count(0),index([35])] = "一注"
21:33:09 >      (数量词):[count(0),index([45])] = "二等"
21:33:09 >      (数量词):[count(0),index([50])] = "10日"
21:33:09 >      (数量词):[count(0),index([58])] = "第2012080期"
21:33:09 >      (数量词):[count(0),index([76])] = "5注二等"
21:33:09 >      (数量词):[count(0),index([86])] = "101308元"
21:33:09 >      (数量词):[count(0),index([106])] = "7注"
21:33:09 >      (数量词):[count(0),index([111])] = "二等"
21:33:09 >      (数量词):[count(0),index([122])] = "第2012080期"
21:33:09 >      (数量词):[count(0),index([135])] = "二等"
21:33:09 >      (数量词):[count(0),index([156])] = "46010129号"
21:33:09 >      (数量词):[count(0),index([174])] = "一张"
21:33:09 >      (数量词):[count(0),index([180])] = "26元"
21:33:09 >      (数量词):[count(0),index([195])] = "5注"
21:33:09 >      (数量词):[count(0),index([203])] = "4注"
21:33:09 >      (数量词):[count(0),index([208])] = "2倍"
21:33:09 >      (数量词):[count(0),index([215])] = "一注"
21:33:09 >      (数量词):[count(0),index([219])] = "5倍"
21:33:09 >      (数量词):[count(0),index([232])] = "二等"
21:33:09 >      (数量词):[count(0),index([259])] = "第2012069期"
21:33:09 >      (数量词):[count(0),index([278])] = "5注二等"
21:33:09 >      (数量词):[count(0),index([288])] = "第二次"
21:33:09 >      (数量词):[count(0),index([295])] = "5注二等"
21:33:09 >      (数量词):[count(0),index([305])] = "7月10日"
21:33:09 >      (数量词):[count(0),index([325])] = "第2012080期"
21:33:09 >      (数量词):[count(0),index([370])] = "2:3:"
21:33:09 >      (数量词):[count(0),index([379])] = "3:"
21:33:09 >      (数量词):[count(0),index([386])] = "1:"
21:33:09 >      (数量词):[count(0),index([404])] = "一组"
21:33:09 >      (数量词):[count(0),index([420])] = "8期"
21:33:09 >      (数量词):[count(0),index([444])] = "第2012071期"
21:33:09 >      (数量词):[count(0),index([465])] = "一组"
21:33:09 >      (数量词):[count(0),index([492])] = "1175万注"
21:33:09 >      (数量词):[count(0),index([506])] = "17注"
21:33:09 >      (数量词):[count(0),index([516])] = "571万元"
21:33:09 >      (数量词):[count(0),index([528])] = "5注"
21:33:09 >      (数量词):[count(0),index([548])] = "2注"
21:33:09 >      (数量词):[count(0),index([553])] = "8注"
21:33:09 >      (数量词):[count(0),index([587])] = "二等"
21:33:09 >      (数量词):[count(0),index([592])] = "181注"
21:33:09 >      (数量词):[count(0),index([601])] = "10.1万元"
21:33:09 >      (数量词):[count(0),index([615])] = "17注"
21:33:09 >      (数量词):[count(0),index([623])] = "二等"
21:33:09 >      (数量词):[count(0),index([640])] = "5注"
21:33:09 >      (数量词):[count(0),index([647])] = "第2012080期"
21:33:09 >      (数量词):[count(0),index([664])] = "3.33亿多元"
21:33:09 >      (数量词):[count(0),index([681])] = "17注"
21:33:09 >      (数量词):[count(0),index([689])] = "571万元"
21:33:09 >      (数量词):[count(0),index([707])] = "4.55亿元"
21:33:09 >      (数量词):[count(0),index([726])] = "523""
21:33:09 >      (数量词):[count(0),index([739])] = "2元"
21:33:09 >      (数量词):[count(0),index([743])] = "1000万"

知乎:我的NLP(自然语言处理)历程(16)——提取数量词