上次讲到从网页上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。谢谢
浙公网安备 33010602011771号