说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

【问底】严澜:数据挖掘入门——分词

HTML文档下载 WORD文档下载 PDF文档下载
随着社会化数据大量产生,硬件速度上升、成本降低,大数据技术的落地实现,数据这座金山已浮出水面。这里,严澜将带我们逐渐开启这座金山——从“分词”开始挖掘数据。

谷歌4亿英镑收购人工智能公司DeepMind,百度目前正推进“百度大脑”项目,腾讯、阿里等各大巨头也在积极布局深度学习。随着社会化数据大量产生,硬件速度上升、成本降低,大数据技术的落地实现,让冷冰冰的数据具有智慧逐渐成为新的热点。要从数据中发现有用的信息就要用到数据挖掘技术,不过买来的数据挖掘书籍一打开全是大量的数学公式,而课本知识早已还给老师了,着实难以下手、非常头大!

我们不妨先跳过数学公式,看看我们了解数据挖掘的目的——发现数据中价值。这个才是关键,如何发现数据中的价值。那什么是数据呢?比如大家要上网首先需要输入网址,打开网页后会自动判断哪些是图片、哪些是新闻、哪些是用户名称、游戏图标等。大脑可以存储大量的信息,包括文字、声音、视频、图片等,这些同样可以转换成数据存储在电脑。人的大脑可以根据输入自动进行判断,电脑可以通过输入判断吗?

答案是肯定的! 不过需要我们编写程序来判断每一种信息,就拿文字识别来说吧,怎么从一个人在社交网络的言论判断他今天的心情是高兴还是愤怒!比如:“你假如上午没给我吃冰淇淋,我绝对会不happy的。”  信息发布时间为下午2点。对于我们人类一看这个句子就知道他是吃过冰淇淋了,心情肯定不会是愤怒。那计算机怎么知道呢?       

这就是今天的主题,要让计算机理解句子的语义,必须要有个程序,上面的句子和发布时间是输入,输出就是 “高兴”。要得到“高兴”就要建立 “高兴”的规则,可以建一个感情色彩词库,比如高兴(识别词是高兴、happy),愤怒(识别词是愤怒、生气)。这里的识别词就是输入中出现的词语,比如上面的句子中的“happy”就识别出了“高兴”这个感情色彩词。但是光识别出“happy”肯定是不行的,前面的“假如……没……,我……不……”等关键词都需要识别出来,才能完整判断一个句子的意思。为了达到这个效果,就必须要用分词技术了。

分词

我们先人工对上面的句子来进行一下切词,使用斜线分割:“你/假如/上午/没/给/我/吃/冰淇淋/,/我/绝对/会/不/happy/的/。/”。但是程序如何做到自动切分?这个其实中国的前辈们已经做了很多中文分词的研究,常见的分词算法有:

1. 基于词典的分词,需要先预设一个分词词典,比如上面句子切分出来的“假如、上午”这些词先存放在词典,然后把句子切分成单字组合成词语去词典里查找,匹配上了就挑选出来一个词。没有匹配上的就切分成单字。

2. 基于统计的分词,需要先获取大量的文本语料库(比如新闻、微博等),然后统计文本里相邻的字同时出现的次数,次数越多就越可能构成一个词。当达到一定次数时就构成了一个词,即可形成语料概率库。再对上面句子进行单字切分,把字与字结合后在语料概率库里查找对应的概率,如果概率大于一定值就挑选出来形成一个词。这个是大概描述,实际生产环境中还需要对句子的上下文进行结合才能更准确的分词。

3. 基于语义的分词,简而言之就是模拟人类对句子的理解来进行分词。需要先整理出中文语句的句法、语义信息作为知识库,然后结合句子的上下文,对句子进行单字切分后组合成词逐个带入知识库进行识别,识别出来就挑选出一个词。目前还没有特别成熟的基于语义的分词系统。

基于词典的分词

为了让大家快速的了解分词技术,我们采用第一个方式来做测试:基于词典的分词,这种方式简单暴力可以解决百分之七八十的问题。基于词典的分词大概分为以下几种方式:

1. 正向最大匹配,沿着我们看到的句子逐字拆分后组合成词语到词典里去匹配,直到匹配不到词语为止。举个实际的例子:“人民大会堂真雄伟”,我们先拆分为单字“人”去词典里去查找,发现有“人”这个词,继续组合句子里的单字组合“人民”去词典里查找,发现有“人民”这个词,以此类推发现到“人民大会堂”,然后会结合“人民大会堂真”去词典里查找没有找到这个词,第一个词“人民大会堂”查找结束。最终分词的结果为:“人民大会堂/真/雄伟”。如下图演示了用正向最大匹配算法识别人民大会堂的过程,“真”,“雄伟”的识别类似。

2. 逆向最大匹配,这个和上面相反,就是倒着推理。比如“沿海南方向”,我们按正向最大匹配来做就会切分成 “沿海/南方/向”,这样就明显不对。采用逆向最大匹配法则来解决这个问题,从句子的最后取得“方向”这两个字查找词典找到“方向”这个词。再加上“南方向”组成三字组合查找词典没有这个词,查找结束,找到“方向”这个词。以此类推,最终分出“沿/海南/方向”。

3. 双向最大匹配,顾名思义就是结合正向最大匹配和逆向最大匹配,最终取其中合理的结果。最早由哈工大王晓龙博士理论化的取最小切分词数,比如“我在中华人民共和国家的院子里看书”,正向最大匹配切分出来为“我/在/中华人民共和国/家/的/院子/里/看书”工8个词语,逆向最大匹配切分出来为“我/在/中华/人民/共/和/国家/的/院子/里/看书”共11个词语。取正向最大匹配切出来的结果就是正确的。但是如果把上面那个例子“沿海南方向”双向切分,都是3个词语,改如何选择?看第4个《最佳匹配法则》。

4. 最佳匹配法则,先准备一堆文本语料库、一个词库,统计词库里的每一个词在语料库里出现的次数记录下来。最后按照词频高的优先选出,比如“沿海南方向”,正向切分为:“沿海/南方/向”,逆向切分为:“沿/海南/方向”。其中“海南”的频度最高,优先取出来。剩下“沿”、“方向”也就正常切分了。是不是这就是基于词典分词的最佳方案?比如数学之美中提到的:“把手抬起来” 和 “这扇门的把手”,可以分为“把”、“手”、“把手”,不管怎么分总有一句话的意思不对。后续再介绍如何通过统计的分词处理这些问题。

说了这么多,我们来实战一下如何基于词典的分词:

public class TestPositiveMatch {    public static void main(String[] args) {   String str = "我爱这个中华人民共和国大家庭";   List<String> normalDict = new ArrayList<String>();   normalDict.add("");   normalDict.add("爱");  normalDict.add("中华");  //测试词库里有中华和中华人民共和国,按照最大匹配应该匹配出中华人民共和国   normalDict.add("中华人民共和国");  int strLen = str.length();  //传入字符串的长度   int j = 0;  String matchWord = ""; //根据词库里识别出来的词  int matchPos = 0; //根据词库里识别出来词后当前句子中的位置  while (j < strLen) {  //从0字符匹配到字符串结束  int matchPosTmp = 0;  //截取字符串的位置   int i = 1;  while (matchPosTmp < strLen) {  //从当前位置直到整句结束,匹配最大长度   matchPosTmp = i + j;  String keyTmp = str.substring(j, matchPosTmp);//切出最大字符串  if (normalDict.contains(keyTmp)) { //判断当前字符串是否在词典中  matchWord = keyTmp;  //如果在词典中匹配上了就赋值  matchPos = matchPosTmp; //同时保存好匹配位置   }   i++;   }   if (!matchWord.isEmpty()) {  //有匹配结果就输出最大长度匹配字符串   j = matchPos;  //保存位置,下次从当前位置继续往后截取   System.out.print(matchWord + " ");   } else {  //从当前词开始往后都没有能够匹配上的词,则按照单字切分的原则切分   System.out.print(str.substring(j, ++j) + " ");   }   matchWord = "";   }   } }

输出结果为:我爱这个中华人民共和国大家庭  

按照这样我们一个基本的分词程序开发完成。

对于文章一开始提到的问题还没解决,如何让程序识别文本中的感情色彩。现在我们先要构建一个感情色彩词库“高兴”,修饰词库“没”、"不”。再完善一下我们的程序:

public class TestSentimentPositiveMatch {   public static void main(String[] args) {   String str = "你假如上午没给我吃冰淇淋,我绝对会不happy的。";  //语义映射   Map<String, String> sentimentMap = new HashMap<String, String>();   sentimentMap.put("happy", "高兴");  //情感词库   List<String> sentimentDict = new ArrayList<String>();   sentimentDict.add("happy");  //修饰词   List<String> decorativeDict = new ArrayList<String>();   decorativeDict.add("不");   decorativeDict.add("没");  //修饰词衡量分数   Map<String, Double> decorativeScoreMap = new HashMap<String, Double>();   decorativeScoreMap.put("不", -0.5);   decorativeScoreMap.put("没", -0.5);  List<String> decorativeWordList = new ArrayList<String>();  //修饰词  String sentimentResult = ""; //情感结果  int strLen = str.length();  //传入字符串的长度   int j = 0;  String matchSentimentWord = ""; //根据词库里识别出来的情感词  String matchDecorativeWord = ""; //根据词库里识别出来的修饰词  int matchPos = 0; //根据词库里识别出来词后当前句子中的位置  while (j < strLen) {  //从0字符匹配到字符串结束  int matchPosTmp = 0;  //截取字符串的位置   int i = 1;  while (matchPosTmp < strLen) {  //从当前位置直到整句结束,匹配最大长度   matchPosTmp = i + j;  String keyTmp = str.substring(j, matchPosTmp);//切出最大字符串  if (sentimentDict.contains(keyTmp)) { //判断当前字符串是否在词典中  matchSentimentWord = keyTmp;  //如果在词典中匹配上了就赋值  matchPos = matchPosTmp; //同时保存好匹配位置   }  if (decorativeDict.contains(keyTmp)) { //判断当前字符串是否在词典中  matchDecorativeWord = keyTmp;  //如果在词典中匹配上了就赋值  matchPos = matchPosTmp; //同时保存好匹配位置   }   i++;   }   if (!matchSentimentWord.isEmpty()) {  //有匹配结果就输出最大长度匹配字符串   j = matchPos;  //保存位置,下次从当前位置继续往后截取   System.out.print(matchSentimentWord + " ");   sentimentResult = sentimentMap.get(matchSentimentWord);   }   if (!matchDecorativeWord.isEmpty()) {  //有匹配结果就输出最大长度匹配字符串   j = matchPos;  //保存位置,下次从当前位置继续往后截取   System.out.print(matchDecorativeWord + " ");   decorativeWordList.add(matchDecorativeWord);   } else {  //从当前词开始往后都没有能够匹配上的词,则按照单字切分的原则切分   System.out.print(str.substring(j, ++j) + " ");   }   matchSentimentWord = "";   matchDecorativeWord = "";   }   double totalScore = 1;   for (String decorativeWord : decorativeWordList) {   Double scoreTmp = decorativeScoreMap.get(decorativeWord);   totalScore *= scoreTmp;   }   System.out.print("\r\n");   if (totalScore > 0) {   System.out.println("当前心情是:" + sentimentResult);   } else {   System.out.println("当前心情是:不" + sentimentResult);   }   } }

通过传入“你假如上午没给我吃冰淇淋,我绝对会不happy的。”,结果输出为:“当前心情是:高兴”。当然你也可以改变其中的修饰词,比如改为:“你假如上午没给我吃冰淇淋,我绝对会happy的。”,结果输出为:“当前心情是:不高兴”。

机器再也不是冷冰冰的,看起来他能读懂你的意思了。不过这只是一个开始,抛出几个问题:

  1. 如何让程序识别句子中的时间?比如“上午”、“下午2点”。
  2. 如何处理“把手抬起来” 和 “这扇门的把手”中的“把”与“手”的问题?
  3. 如何构建海量的知识库,让程序从“婴儿”变成“成年人”?
  4. 如何使用有限的存储空间存储海量的知识库?
  5. 如何提高程序在海量知识库中查找定位信息的效率?
  6. 如何识别新词、人名、新鲜事物等未知领域?

宇宙芸芸众生都是相通的,大脑也许就是一个小宇宙,在这个小宇宙又有很多星球、住着很多生物。而电脑也是宇宙中地球上的一个产物,只要存储计算速度发展到足够强大一定可以构建成一个强大的大脑。

你看这个单词 "testaword" 认识吗?可能不认识,因为我们五官先获取到的信息,然后根据大脑以往学习的经验做出判断。但是你看这个短语 " test a word" 认识吗?再看看开始那个单词“testaword”是不是就亲切多了?   

To Be Continued……

关于作者:严澜现成都创行负责人,历任上海创行科技技术总监。曾任中国平安平台开发工程师,腾讯拍拍网B2C架构工程师。Web3.0语义搜索引擎探索者,海量数据处理,互联网高性能低成本平台架构搭建实践者,构建让更多普通开发者快速掌握高性能技术的框架,自由机器人研发爱好者。

更多《问底》内容

  • 【问底】严澜:数据挖掘入门——分词

《问底》CSDN云计算频道新建栏目,以实践为本,分享新时代软件架构与研发。在含有“【问底】”字样标题的文章中,你可能会看到某个国外IT巨头的架构分享,也可能会看到国内资深工程师对某个技术的实践总结,更可能会看到一系列关于某个新技术的探索。但是在含有“【问底】”字样标题的文章中,你绝对不会看到对任何一个产品的宣传,以及一些带有目的性的趋势探讨。

同时,为了更好地进行技术与实践分享,《问底》邀请对技术具有独特/深刻见解的你一起打造一片只属于技术的天空,详情可邮件至zhonghao@csdn.net。


免费订阅“CSDN云计算(左)CSDN大数据(右)”微信公众号,实时掌握第一手云中消息,了解最新的大数据进展!

CSDN发布虚拟化、Docker、OpenStack、CloudStack、数据中心等相关云计算资讯,     分享Hadoop、Spark、NoSQL/NewSQL、HBase、Impala、内存计算、流计算、机器学习和智能算法等相关大数据观点,提供云计算和大数据技术、平台、实践和产业信息等服务。                

HashSet的equals和hashCode重写问题 PendingIntent实现原理和代码 IntentService实现原理及内部代码 AsyncTask实现原理和内部代码 Neither user nor current process错误 ListView的右边滚动滑块启用方法 Live Wallpaper动态壁纸开发 控制软键盘显示和隐藏 设置Activity大小不再全屏原理 Android面试题,看看你基础如何? Android Canvas绘图抗锯齿解决方法 Android xliff和字符串资源 android.hardware.USB类介绍 Android开发经验谈之应用间数据共享 android_asset这个URL详细使用方法 Android 2.3系统自带高清UI图标下载 设置ScrollView滚动条的颜色 WakeLock使用方法示例代码 Concurrent并发库常见问题总结 Android数据库SQLite性能优化技巧 Android开发之Java设计模式基础篇 Android开发之Java设计模式入门篇 Android开发之Java设计模式 Android开发之Java并发包集合类性能分析 Android开发之Java集合类性能分析 Android开发之Java虚拟机原理和内存分配 Android开发之Java基础系列教程目录 Android Theme主题样式开发注意点 Android 3.0开发用的平板推荐 android.resource://这个Uri你知道吗 ADT插件的10.0.1必须要Eclipse 3.5才能升级 网络连接怎么检测 能把IE浏览器最大吗?俺指的是把右上最大按钮最大化? 怎么判断表单传送的整数中不能有字符,谢谢!!! 如何把我写好的说明书放到我VC++应用程序的帮助文件中? 求最容易理解,最容易上手的数据库书籍,各位老大请指教,谢谢!! 快!快快!!来拿分呀!!!!!!!!一个简单问题。 WIN98与WIN2000共享一个OFFICE 2000??? 在Servlet中如何使用JavaBean(调用其中的方法)?主要是格式!如果网上有这方面的资料也可以告诉我,我急用,不胜感激!40分送上!(只有这些了) 请问各位:怎样才能知道某一个进程所占用的cpu比例,mem大小? 请问在恢复sql 7.0一个数据库文件时,出现Error 3624:这是什么意思?? 关于程序员考试 哪位知道怎么一行一行地读取文本文件呀!!!! 谁知道的,来帮我一下——有关网页浏览计时的问题 如何将数字变为字符串格式化输出? Websphere下使用连接池的一些问题 TNMUDP问题:怎样才能知道RemoteHost连接失败 ? 算法请教,我要调整一副黑白数字图的浓度,我是用直方图的方法好呢,还是先转成HLS在转回来好?若都不对,应该怎么做? 如何 在ASP中用ping 一个小问题 请用javascript VC++6是98年才出来的,为什么没有最新的ADO原生驱动,而通过ODBC的话速度太慢; 多媒体 谁有MPEG-4的资料! 如何实现类似资源管理器的分隔条 我是菜鸟,请教各位GG,MM?????? 我的计算字段怎么老要计算,而且经常有死循环,到底该注意些什么,在哪里控制? 如何取消鼠标右键菜单和使shift功能键无效?(紧急) 一个非常非常简单的一个问题 如何安装Jbuilder 5.0 ? 多媒体技术 chr(176)有什么用? 如何将3DMAX图片在vb窗口中显示 各位大侠,怎样取得复合数据窗口里面的嵌套表的Label名。 一个关于访问数据库很菜的问题 请教小波分解与重构,模极大值算法。 哪儿能找到com.ms.xml.*包? 动态类型判别 是怎么实现的,谁有小型模拟代码? 让程序自启动都有哪几种方式呀!各位发表发表吧!!!! sqlserver恢复问题! 有关STL的文章! 很简单的问题,送份啦!!! 求一个字符在字符串中的位置!? ********DBGrid和ADO怎样连接********* 在JBuilder 5.0中,我打开一个单独的java文件,怎么编译和运行他?用命令行方式是可以的 简单问题,applet??? 都说抽象类不能实例化,可是请看下面例子:(请大虾们解释) 谁有Borland App Server 4.51 注册码? Oracle中的奇特问题 快告诉我,如何取本机的静态IP地址。 数据库问题?得分率120%。对大虾而言 请教一个VC中包含DLL的workspace中 Link的设定问题! 程序员考试的成绩什么时候出来????? 已知 铁氧元素质量比为七比三 求这种物质化学式 思路) 质量是6t的汽车在地面上匀速行驶,汽车行驶时受到的阻力是汽车重力的0.01倍,求汽车牵引力?(g=10N/kg) 钟乳石和石笋是长时间在特定地质条件下形成的.它们的主要成分是什么? 如题:少量在人体胃中帮助消化的物质的化学式是什么? 一辆4吨的汽车,在平直的公路上匀速行驶,受到的阻力为重力的0.02倍,求汽车的牵引力多大?如题 一年级的一个造句题爷爷给小树穿上暖和的衣裳.小树给爷爷撑开绿色的小伞.我给__________._____给__________. 汽车在平直公路上行驶,在第1min内平均速度为5m/s,第2,3min内平均速度为6m/s,第4min内的平均速度为10m/s,第5min内的平均速度为13m/s,则汽车在这5min内的平均速度是__m/s ①、CaCO3+H2O+CO2→Ca(HCO3)2②、Ca(HCO3)2→CaCO3↓+H2O+CO2↑石钟乳、溶洞形成所对应的化学方程式到底哪个对应哪个啊?又分别是什么流水作用?一楼的亲,看下这个,我越看越糊涂了 一道一年级造句题前提是:屋顶像_____________大地像_____________(不能重复) 沉思怎么造句?80字 溶洞里的钟乳石主要形成是靠什么力量 用仿佛……仿佛造句一年级 化学式中各种组成部分是什么意思? 为什么在溶洞里石钟乳上和石笋上碳酸钙沉积而在地表是碳酸钙溶蚀呢?可是在石钟乳的下端和石笋的上端并没有水的堆积啊。 轿车上凸下平近似流线型的设计,使它行驶时,底部比顶部受到的气流的压强小这句话有什么错误 [化学]这些物质的化学式或组成成分是什么?明矾 胆矾 绿矾 碱石灰 天然气 漂白粉 铝热剂 大理石 小苏大 苏大 大苏大 石灰乳 生石灰 自然界的溶洞,钟乳石等的形成有关的方程式? 物理小车实验让小车从斜面上滑下后沿水平面运动,是为了使小车在竖直方向上受到的?力和?力相平衡,其作用效果相互抵消,相当于小车只受水平方向上的阻力. 大便在人的身体什么位置 溶洞的钟乳石不断生长钟乳石是生物吗 在光滑的水平面上有一平板小车,M正以速度v向右运动.现将一质量为m的小块无初速地放在小车上.由于木块和小车间的摩擦力的作用,小车的速度将发生变化.为使小车保持原来的运动速度不变, 大便的主要成分是什么?有人有做过专门性的研究吗? 什么是什么的伞造句小学一年级孩子的作业,实在想不出来了,要求造四句什么是什么的伞?先谢谢您了.要求造四句呢。最好是一种植物和一种动物,例:蘑菇是小白兔的伞。 质量为5000kg的汽车在t=0时刻速度为v0=10m/s,随后以p=60000w的额定功率沿平直公路继续前进,经72s达到最大速度,该车受恒定阻力,其大小为2500N.求:(1)汽车的最大速度Vm;(2)汽车在72s内经过的路程x 蛋鸡粪便有些什么主要成分 小学一年级,目光怎么造句? 小车从斜坡下滑时,所做运动不是匀速直线运动.明显的,前半段速度没有后半段快.为什么后半段速度比前半段快? 婴儿大便如何来的?主要成分是哪些婴儿刚刚出生的时候,不吃饭却拉屎,那大便怎么这么多呢? 一架飞机五分之四小时飞行800千米,一辆小汽车三分之二行驶50千米,着两种交通工具每小时各种行驶多少千米 今天晚上12点之前必须给我答案 一辆汽车总质量为1150kg,以72km/h的速度匀速行驶10km,若汽车所受阻力为汽车重力的10%,每个轮胎与路面的接触面积为0.05m²(g取10N/kg)求汽车功率若该汽车热机的效率为25%,如果不考虑热机其 用:我最喜欢( ),这里( ),那里( ),真比( ).造句例:我最喜欢天上的星星,这里一颗,那里一颗,真比地上的花儿还多. ()但() 造句小学一年级语文 一辆质量为4吨的汽车在平直公路上匀速直线行驶,汽车所受阻力是汽车所受重力的0.03 倍求:汽车发动机的牵引力大小. 1.一辆小汽车5分之4小时行驶了60千米,求这辆小汽车的速度.2.某某班有男生31.一辆小汽车5分之4小时行驶了60千米,求这辆小汽车的速度.2.某某班有男生30人,是女生人数的2分之3.求这个班女生有 一辆小汽车五分之四小时行了32千米,照这样的速度,这辆车八分之十一小时可行多少千米 质量为2t的汽车,在平直公路上行驶时所受阻力为汽车重力的0.2倍.它先在水平公路上匀速行驶2km后,关闭发动机后又滑行50m才停下.求整段路程中动力对汽车所做的功 钟乳石和石笋有什么区别 一辆小轿车5分之4小时行驶60千米,这辆小轿车1小时行驶( )千米;行驶1千米需要( )小时. 屎的臭味是哪种物质,最好有化学式 钟乳石是啥? 钟乳石形成过程,用化学式表示 用“蓦然”造句 短一点最好不超过20字, 喀斯特地貌与钟乳石有什么区别 钟乳石的形成如题 用 既……又…… 造句 短一点 钟乳石是怎么形成的 翻译一个句子:“他七点钟回家,然后看电视里的早间新闻”用英语表示 造句(短一点的)绚丽神奇……永无止境……争奇斗艳…… 钟乳石像什么呀比喻句 英语翻译你在干什么?我在看电视.我的弟弟正在游泳池里游泳.凯特的表弟正在吃晚饭吗?是的.感谢你的来信和照片.他正在等公共汽车. 用“仿佛”造句,要短一些! 一辆小汽车迎面与一大货车相撞,请问两辆车产生的加速度是一样大吗(物理) 仿写句子,与读书和看电视有关如果把阅读比喻成细嚼慢咽的宴席,荧光幕前的观赏就是便捷的快餐,是可口的零食.一样是吃的享受,韵味却不相同. 用如果.就造句,要短,急呀 一列货车以28.8km/h的速度在平直铁路上运行,由于失误,在后面600m处有一列快车以72km/h的速度向它靠近.快车司机发觉立即合上制动器,但快车要滑行2000m才停止.判断两车是否相撞.(写出计算过程) 把上面的两个句子合并成一个句子:妈妈叫我.我看电视. 一载重汽车的质量的5t,它在水平地面上匀速行驶时.受到的阻力是汽车重力的0.12倍,求汽车此时牵引力的大急用 钟乳石的主要成分是什么 “你好我在看电视那” 这句话我想用外语句子怎么写
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn