蛙蛙池塘  
人生价值的最好体现就是做好本职工作...
公告
  • 残荷听雨,梨花飞雪,落英缤纷时节。晓来谁染枫林醉?点点都是离人泪
    活着,就是快乐!自信,就是美丽! 有人爱,就是幸福。
    春天来了
    但愿野百合也有春天

    第三季度的计划



    木了
    晚上一个人看会儿《读者乡土人文版》,听会儿广播挺不错的,想起了三年前在石家庄没电脑的日子,时光飞逝呀,现在笔记本都用上了,以前从没想过,确实得知足常乐。
日历
<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910
统计
  • 随笔 - 249
  • 文章 - 2
  • 评论 - 2340
  • 引用 - 75

导航

与我联系

搜索

 

常用链接

留言簿

我参加的小组

我参与的团队

我的标签

随笔分类

随笔档案

相册

朋友

积分与排名

  • 积分 - 541391
  • 排名 - 49

最新评论

阅读排行榜

评论排行榜

60天内阅读排行

 

蛙蛙牌自动提取Tag算法

摘要:Tag系统是Web2.0的一个招牌应用,如果你有一个经营了好几年的论坛,是不是也想生成自己的一套TAG。别听他们说什么语义WEB,文本聚类算法,TIIDF,余弦定理,相似度算法啥的高深算法(我一个也没整明白),跟我来,简单的计算词频来提取tag的效果就很好。

分析;把每个帖子进行分词,然后把词的出现频率倒序排列,取出前N个就作为TAG了。当然要一个板块一个板块的提取tag,如果把军事板块和情感板块的帖子混杂在一起提取tag,提取出来的tag相关性比较差一些,如果分开提取,相关性要好一些,整体效果好。好多时候做训练算法,语料很重要。先分词吧,自己写分词算法也是弄个词库,自己用正向最大匹配来分词,或者两个两个字的来当词,所以还不如直接用中科院那套呢,直接使用了隐式马尔可夫算法,效果虽说不是很好吧,也能满足需求了,对吧。具体测试代码、分词组件、词库下载见以下链接
http://www.cnblogs.com/edison1024/archive/2006/05/03/390832.html
得点了他那个广告才能显示下载地址,你就点吧,人家提供下载也不容易。分词后要去除停止词,停止词自己从网上搜索一份,如果不去除停止词,最后肯定是“了”,“的”,“我”等词出现的频率最高,你不会把这些常用词做tags吧,呵呵。当然NICTCLAS是可以标注词性的,你可以分词后把语气词、副词等虚词去了,这样更好一些,但我就懒得做了,直接分词、去除停止词两步。
完了计算每个词出现的频率就好说了,弄一个全局的字典,每个词出现一次增加一个计数,第一次出现先添加到字典,并计数为0,最后把出现次数在某个阈值以上的词插入到数据库里,这就是你要的tag了,先来看一下我的效果吧(大家别笑哦,我是从一个美女贴图论坛提取了一些帖子的主题当语料的,为了不降低博客园的PR值,就贴图,不贴文字了)。

开始上代码
先贴分词

namespace WawaSoft.Search.Common
{
    
public sealed class WawaSplitWorder
    
{
        
static List<string> _stopWords = new List<string>();
        
static NICTCLAS _nictclas;
        
public static void Init()
        
{
            
try
            
{
                
//1、初始化分词器
                _nictclas = new NICTCLAS();
                _nictclas.OperateType 
= eOperateType.OnlySegment;
                _nictclas.OutputFormat 
= eOutputFormat.PKU;

                
//2、加载停止词
                using (StreamReader sr =
                    
new StreamReader("data\\StopWords.txt", Encoding.Default))
                
{
                    
string temp;
                    
while ((temp = sr.ReadLine()) != null)
                    
{
                        _stopWords.Add(temp);
                    }

                }

            }

            
catch (Exception ex)
            
{
                Trace.TraceError(
"初始化分词器错误:{0}", ex);
            }

        }


        
/// <summary>
        
/// 分词并去除停止词
        
/// </summary>
        
/// <param name="input"></param>
        
/// <returns></returns>

        public static IEnumerable<string> SplitWords(string input)
        
{
            Console.WriteLine(input);
            
            
//预处理,不处理那个分词组件有可能内存读写错误,那玩意儿写的不太健壮,容错性8行的说,呵呵
            input = input.Replace("/""");
            input 
= input.Replace(".""");
            
string result = string.Empty;
            List
<string> ret = null;
            
try
            
{
                
//1、分词
                _nictclas.ParagraphProcessing(input, ref result);
                ret 
= new List<string>(
                    result.Split(
new string[] "  " }, StringSplitOptions.RemoveEmptyEntries));
                
                
//2、去除干扰词
                List<string> needRemove = new List<string>();
                
foreach (string word in ret)
                
{
                    
foreach (string s in _stopWords)
                    
{
                        
if (string.Compare(s, word, false== 0)
                        
{
                            needRemove.Add(word);
                            
break;
                        }

                    }

                }


                
foreach (string removeWord in needRemove)
                
{
                    ret.Remove(removeWord);
                }

            }

            
catch (Exception ex)
            
{
                
//错误的时候除了打出错误详细信息后打出出错的上下文,传入的参数,临时变量等有助于从trace里分析错误,要不死了也不知道怎么死的
                Console.WriteLine("{0}\r\n{1}",input,ex);
            }


            
return ret;
        }

    }

}



计算词频

class AutoGenTag
{
    
//大字典,保存每个词的词频,key是词,value是词频
    static Dictionary<string,int> _hashlist = new Dictionary<stringint>(10240);

    
public static void Excute()
    
{
        
//1、取出帖子,越多越好,越多提取的准确性越高
        IEnumerable<string> source = Dao.GetPostTitles();
        
foreach (string str in source)
        
{
            
//2、把每个帖子主题分词
            IEnumerable<string> words = WawaSplitWorder.SplitWords(str);
            
if(words == null)
                
continue;

            
//3、把每个词插入到大字典里,以前存在就把词频加1
            foreach (string word in words)
            
{
                
if(_hashlist.ContainsKey(word))
                
{
                    _hashlist[word]
++;
                }

                
else
                
{
                    _hashlist.Add(word,
0);
                }

            }

        }

        
//4、把大于某个阈值(这里是20)的词插入数据
        foreach (KeyValuePair<stringint> pair in _hashlist)
        
{
            
//如果一次循环插入几万个词,SQLSERVE每秒提交的批会很高,有可能CPU瞬间很高,Sleep(0)能让CPU长得慢点儿,Sleep(1)也行,不过我不知道这两个的区别。或者直接 用sqlserver的bilkcopy性能也8错
            Thread.Sleep(0);
            
if (pair.Value > 20)
            
{
                Console.WriteLine(
"{0}-{1}",pair.Key,pair.Value);
                Dao.addtags(pair.Key, pair.Value);
            }

        }

    }

}



代码写的比较糙,大家凑合看,都是随手写的。最后写一个sql查出tag并按词频倒序排列,选出一个datatable,用datalist一绑定就O了。当然了,我这是提取标签的土法,大师们看了别吐,呵呵。

Tag标签: 分词 标签
posted on 2008-04-29 23:34 蛙蛙池塘 阅读(3311) 评论(28)  编辑 收藏 网摘 所属分类: 综合区
评论:
  • #1楼  怪怪       Posted @ 2008-04-29 23:41
    妈呀, 看得我....   回复  引用  查看    

  • #2楼[楼主]  蛙蛙池塘       Posted @ 2008-04-29 23:48
    @怪怪
    咋了,呵呵,我提取出来还是有一些不纯,呵呵,其实博客园应该提取一套tag
      回复  引用  查看    

  • #3楼  Jeffrey Zhao       Posted @ 2008-04-30 00:27
    背景有颜色阿,还是不错的。   回复  引用  查看    

  • #4楼  DeltaCat[未注册用户] Posted @ 2008-04-30 07:29
    “或者直接 用sqlserver的bilkcopy性能也8错” 应该是 bulkcopy 吧,呵呵   回复  引用    

  • #5楼  李战       Posted @ 2008-04-30 08:20
    http://www.cnblogs.com/Emoticons/yoyocici/223852199.gif" alt="" />   回复  引用  查看    

  • #6楼  镜涛       Posted @ 2008-04-30 09:37
    支持,学习   回复  引用  查看    

  • #7楼  镜涛       Posted @ 2008-04-30 09:37
    支持,学习   回复  引用  查看    

  • #8楼  雨中漫步的太阳       Posted @ 2008-04-30 09:42
    http://www.cnblogs.com/Emoticons/tusiji/203330988.gif" alt="" />   回复  引用  查看    

  • #9楼  wingoo       Posted @ 2008-04-30 09:45
    也做过一个tag提取的,不过是在存储过程中写的,当然全是英文的,没分词..   回复  引用  查看    

  • #10楼  graystar[未注册用户] Posted @ 2008-04-30 11:26
    Sleep(0) ,让出CPU时间,进入下一次排队,   回复  引用    

  • #11楼  海洋       Posted @ 2008-04-30 13:03
    http://www.cnblogs.com/Emoticons/yoyocici/224023586.gif" alt="" />   回复  引用  查看    

  • #12楼  zzz[未注册用户] Posted @ 2008-04-30 14:11
    太强了啊   回复  引用    

  • #13楼  mafa       Posted @ 2008-04-30 14:59
    好,简单技术办大事   回复  引用  查看    

  • #14楼  nicye       Posted @ 2008-04-30 16:11
    不想看,路过   回复  引用  查看    

  • #15楼  Eric Fine       Posted @ 2008-04-30 16:39
    呱呱我来踢馆的~   回复  引用  查看    

  • #16楼  overred       Posted @ 2008-04-30 16:44
    美女"(816") | 身材"(112") | 空姐"(58") | 看看"(47") | 图片"(36") | 老师"(32") | 白领"(26") | 裙子"(22") |
    少妇"(474") | 内衣"(112") | 激情"(58") | 大学生"(47") | 女星"(35") | 内裤"(31") | 拍摄"(25") | 酒吧"(22") |
    性感"(406") | 这样"(99") | 宾馆"(57") | 过程"(46") | 北京"(35") | 10P"(30") | 怎么"(25") | 极限"(22") |
    漂亮"(330") | 小姐"(95") | 模特"(57") | 秘书"(46") | 喜欢"(35") | 真正"(30") | 据说"(25") | 春光"(22") |
    MM"(322") | 第一"(90") | 风骚"(56") | 明星"(46") | 这个"(35") | 女子"(30") | 现场"(25") | 清醇"(22") |
    写真"(197") | 中国"(83") | 成熟"(55") | 如此"(45") | 大学"(34") | AV"(29") | 出来"(25") | 裸体"(22") |
    诱惑"(196") | 丰满"(81") | 丝袜"(54") | 大家"(44") | 大胆"(34") | 风情"(28") | 学生"(24") | 胸部"(21") |
    日本"(163") | 真实"(76") | 可爱"(54") | 女郎"(43") | 艺术"(34") | 国产"(28") | 乳房"(24") | 不错"(21") |
    妹妹"(154") | 绝对"(76") | 衣服"(52") | 护士"(41") | 什么"(33") | 透明"(28") | 开放"(24") | 姐姐"(21") |
    女人"(146") | ~~"(70") | 上海"(51") | 台湾"(41") | 网友"(33") | 抓拍"(28") | 竟然"(23") | 最新"(21") |
    女孩"(138") | 一个"(70") | 迷人"(50") | 清晰"(40") | 同事"(33") | 办公室"(28") | 6p"(23") | 女友"(21") |
    少女"(138") | 照片"(69") | 酒店"(50") | 鼻血"(39") | 校花"(33") | 旗袍"(27") | 浴室"(23") | 正点"(21") |
    极品"(128") | 女生"(68") | 这么"(49") | 气质"(39") | 公司"(33") | 青春"(27") | 魅力"(23") | 暴露"(21") |
    清纯"(123") | 生活"(66") | 街头"(49") | 香港"(38") | ~~~"(32") | 完美"(27") | 广州"(23") | 后悔"(21") |
    偷拍"(114") | 男人"(62") | 尤物"(48") | 诱人"(38") | 洗澡"(32") | 公园"(26") | 白嫩"(22") | 经典"(21")
    美丽"(113") | ——"(59") | 超级"(47") | 韩国"(37") | 短裙"(32") | 美艳"(26") |
      回复  引用  查看    

  • #17楼[楼主]  蛙蛙池塘       Posted @ 2008-04-30 16:51
    我晕,在博客园贴不相关的文字会降低博客园的PageRank值的,呵呵。   回复  引用  查看    

  • #18楼  overred       Posted @ 2008-04-30 16:56
    @蛙蛙池塘
    这下让搜索引擎色一把
      回复  引用  查看    

  • #19楼  soocat[未注册用户] Posted @ 2008-04-30 17:55
    我的一个分词算法
    http://www.soocat.com/s.aspx
      回复  引用    

  • #20楼  works guo       Posted @ 2008-05-01 09:09
    学习   回复  引用  查看    

  • #21楼[楼主]  蛙蛙池塘       Posted @ 2008-05-01 13:00
    @soocat
    很不错,不过我就不重复劳动了,有一个能用就行了
      回复  引用  查看    

  • #22楼  bluesky-1102[未注册用户] Posted @ 2008-09-12 16:39
    求一份 文章中提到的停止词库 StopWords.txt,找遍网上都是英文版的.郁闷.   回复  引用    

  • #23楼[楼主]  蛙蛙池塘       Posted @ 2008-09-12 16:51
    我的停止词也不太好,如下,你看着自己加点儿吧,英文的lucene里自带了

    a
    an
    and
    are
    as
    at
    be
    but
    by
    for
    if
    in
    into
    is
    it"
    no
    not
    of
    on
    or
    s
    such
    t
    that
    the
    their
    then
    there
    these
    they
    this
    to
    was
    will
    with
    我们



    操|你|妈





















    民运





    傻逼


























      回复  引用  查看    

  • #24楼  hbbluesky[未注册用户] Posted @ 2009-01-20 10:33
    楼主,可否将你如下分析词频代码中 Dao.GetPostTitles()方法公布一下?

    //1、取出帖子,越多越好,越多提取的准确性越高
    IEnumerable<string> source = Dao.GetPostTitles();



      回复  引用    

  • #25楼[楼主]  蛙蛙池塘       Posted @ 2009-01-20 10:34
    就一条group by的sql语句,汗。   回复  引用  查看    

  • #26楼  hbbluesky[未注册用户] Posted @ 2009-01-20 10:47
    救救小菜, 我知道这个方法是返回所有标题 我遇到的是类型转换的问题,要怎么将结果string 转成IEnumerable<string>? 不要笑话,小菜没用过IEnumerable
      回复  引用    

  • #27楼[楼主]  蛙蛙池塘       Posted @ 2009-01-20 11:14
    @hbbluesky
    那是一个泛型集合接口,你用datareader返回一个数据集,然后填充到list<T>里也可以撒。
      回复  引用  查看    

  • #28楼  hbbluesky[未注册用户] Posted @ 2009-01-20 11:21
    大牛哥,经指点已解决.多谢.   回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1176981




相关文章:

相关链接:
 
Copyright © 蛙蛙池塘 Powered by: 博客园 模板提供:沪江博客