上次讲到从网页上crawl了近1G的网页,开始了所谓的语义分析,我个人做得比较简单,从特定的结构入手,不知道真正的语义分析是怎么做的,如果谁知道,求教。

一、   页面平均大小(80KB)。

     结构信息:头部(包含城市信息)+中部(我想要用的,但也比较繁杂)+尾部(其他)

对于中部信息,包含项有:.+shop-name(.+)score(.+)口味(.+)环境(.+)服务(.+)人均(.+)地址(.+)公交查询(.+)电话(.+)分类(.+)营业时间(.+)公交信息(.+)餐厅氛围(.+)餐厅特色(.+)网友推荐(.+),但不是所有项的都有。

 

二、   方法:

1. 用string[] ShopBase1 = Regex.Split(_fileContent, @"商户信息(.+)更新");分隔前后部分,根据ShopBase1[0]中的城市进行分类,然后在各种分类下,调用ShopBase1[1]的信息处理方法;

2. 准备需要的结构,我的想法是先存在一个数组中,在进行正则表达式的组合,也能较为方便的维护自己规定的结构:string[] Splits = new string[] { "shop-name", "score", "口味", "环境", "服务", "人均", "地址", "公交查询", "电话", "分类", "营业时间", "公交信息", "餐厅氛围", "餐厅特色", "网友推荐" };然后将Splits中的结构进行需要的组合,分隔传递过来的ShopBase1[1]。

3. 把分隔结果调用如下方法,实现更加细致的信息提取:

 

private string GenerateInfo(string content, string style)
        {
            StringBuilder value = new StringBuilder();
            string regexString = null;
            switch (style)
            {
                case "shop-name":
                    regexString = @"(?<=itemreviewed.>)[^']+(?=</h1>)";
                    break ;
                case "score":
                    regexString = @"(?<=sstar)[0-9]+(?=[""])"; // (?<=[""])[^""]+(?=.><)";
                    break;
                case "口味":
                case "环境":
                case "服务":
                    regexString = @"(?<=Bold.>).+(?=</span>)";
                    break;
                case "地址":
                    regexString = @"(?<=street-address.>).+(?=<span>)";
                    break;
               ...
                  default:
                      regexString = @" ";
                      break;  
            }
            MatchCollection mc = Regex.Matches(content, regexString);
            foreach (Match m in mc)
            {
                value.Append(m.Value + "#");
            }
            value.Append("\r\n");
            return value.ToString();
        }

4. 层层放回后,再放到数据库中去就可以了。  

另附一个比较好的学习正则表达的网页:

http://msdn.microsoft.com/zh-cn/library/ms972966.aspx

http://blog.csdn.net/maokor/archive/2004/12/13/215158.aspx         

 

三、   困惑:

感觉自己的思路就是把大块的分小,然后再分小,到用一个正则表达式能准确无误的得到需要数据,这种思路的采用也是想尽早排除掉大数据中无用部分,节约时间。

但,会不会显得过于依赖网页结构了,如果结构发生改变,我的程序结构虽然不用变,但几乎所以正则表达都要换掉?能不能有一种方法:是我输入了如“电话”这样的名名词,它在全文中定位后,在这个名词前后几步结构里,提取符合电话“大于7位的数字”特性的result给我,我再做判断,这样感觉会比较smart。

我想如果时间允许,我会写一个这样的类,包好尽量多常用的网页信息,如上面Splits中的所示,然后结合其本身特性和htm语言特性后,智能分析,返回结果。

由于自己coding经验不足,可能上述有点贻笑大方,请不吝指教。或者你有关于网页分析好的例子,我希望能学习一下,我的邮箱v-xyang@microsoft.com。谢谢

 

 

 

 

 

posted on 2010-12-02 14:54  CodingCrazy 小组  阅读(1474)  评论(0)    收藏  举报