题目描述
百度网页采集器 (Baiduspider) 每天从互联网收录数亿网页,互联网的网页质量参差不齐。百度的工程师们每天都在改进方法来判断一个网页质量的好坏,使质量差的网页出现在检索结果中较后的位置。现在实习生小胖想到一个很简单的方法来判断一个网页内容的好坏,方法如下:
1. 利用数据挖掘技术在互联网语料库中挖掘出一批有特点的词汇,分为好词和坏词两种,好词标上正的权重,坏词标上负的权重;
2. 通过好词和坏词词典对每个网页计算网页总权重:从第一个字开始匹配,找到一个好词则加上相应的权重,找到一个坏词则减去相应的权重,下一次匹配将从找到的词末尾的下一个位置开始。
3. 坏词采用正向最短匹配:从当前匹配位置开始的若干连续汉字,如果形成多个坏词,则只计算最短的那个坏词的权重,下一次匹配将从这个最短坏词末尾的下一个位置开始。
4. 好词采取正向最长匹配:从当前匹配位置开始的若干连续汉字,如果形成多个 “ 有效 ” 好词,则只计算最长 “ 有效 ” 好词的权重,下一次匹配从这个最长 “ 有效 ” 好词末尾的下一个位置开始。
5. “ 无效 ” 好词的定义:好词的一部分本身是一个坏词;或者好词的一部分与后续相邻的若干字组成一个坏词。
现在小胖已经做好了第 1 步的工作,有一个好词和坏词的列表(词典),但是由于没有对中文文本处理的程序经验,他想请未来的百度之星们帮他完成这个程序。
输入格式
输入第一行为一个字符串(网页正文)。从第二行开始为词典,格式为 “ 词 空格 词的权重 ” 。权重为一个带符号 32 位整数。如果权重为正,则为好词,反之则为坏词;不存在重复的词,不存在权重为 0 的词。
测试数据中的词全部为 1-5 个字的中文,但作为 “ 网页 ” 的字符串中同时包含中文和 ASCII 字符,每个汉字占 2 个字节。并非 “ 网页 ” 中的所有字都在词典中。
样例输入
小胖之喷火龙骑士 !!
小胖 6
喷火 -1
喷火龙 -1
火龙 -1
龙 4
龙骑 3
龙骑士 2
骑士 -2
士 3
输出格式
输出仅一行,为网页总权重(答案保证不超过带符号 32 位整数的范围)。
样例输出
7
样例解释
从 “ 网页 ” 中找到的好词为 “ 小胖 ” 和 “ 龙 ” ,坏词为 “ 喷火 ” 和 “ 骑士 ” 。特别要说明一下 “ 龙 ” 被识别为好词的原因 ——“ 喷火 ” 和 “ 喷火龙 ” 均为坏词,按正向最短匹配得到 “ 喷火 ” ,接着往下匹配到好词 “ 龙 ” 、 “ 龙骑 ” 和 “ 龙骑士 ” ,但是由于 “ 骑士 ” 是坏词,所以 “ 龙骑 ” 、 “ 龙骑士 ” 无效而 “ 龙 ” 是最长的有效好词。注意题目描述中的匹配规则,好词的 “ 有效 ” 和 “ 无效 ” 只考虑该好词的一部分与后续字是否能够组成坏词,而不考虑和前面的字是否能够组成坏词 —— 样例中的 “ 龙 ” 虽然可以与前面的字组成坏词 “ 喷火龙 ” 和 “ 火龙 ” ,但由于这两个词都是未能匹配成功的坏词,因此对好词 “ 龙 ” 的词性没有影响,可以累积 “ 龙 ” 的权重。
my answer:
no idea!!!完全木有想法啊!!!!!
如果是英文,可以用子典树,建一个GOOD树和一个BAD树,其中GOOD树的某些结点标记为DANGEROUS属性,即当后面为某些特定的字符串时无效。
如果是中文,要怎么办呢?