挫神吧 关注:322贴子:54,568
  • 3回复贴,共1

东风何处是人间 之宋词高频词汇

只看楼主收藏回复


 再次神经短路,突然想看看宋词里面什么样的意象是最常见的,比如可以做个频率分析什么的。当然文本挖掘需要分词,我没法在其中花太多时间,于是想出了一个土办法。宋词的句子都很短,如果穷举可能的字的组合的话并不是太多,况且最常见的词语一般是两三个字,这样可能的组合就更少了。比如“犹解嫁东风”这句话,可能的二字组合是“犹解”“解嫁”“嫁东”“东风”,三字组合是“犹解嫁”“解嫁东”“嫁东风”,词的字数越多,可能的组合就越少。如果把每句话可能的字的组合都列举出来,就可以整体统计频率了。
当然里面会有很多无意义的字的组合,不过这类“词语”本身的出现就是一个偶然,所以可以预期的是它们整体的频数会很低,是入不了“大雅之堂”的。话不多说,直接上代码和结果。


IP属地:江苏1楼2011-12-02 10:22回复

    数据:《全宋词》文本
    代码:
    l=scan("Ci.txt","character",sep="\n");
    l.len=nchar(l);
    # 某些行是作者和标题,所以选取长度大于10的行;
    # 另外这个文本文件不太规整,有些网址什么的,
    # 所以也要排除那些长度太长的。
    ci=l;
    # 句子用标点符号分割。
    sentences=strsplit(ci,",|。|!|?|、");
    sentences=unlist(sentences);
    sentences=sentences[sentences!=""];
    s.len=nchar(sentences);
    # 单句太长了说明有可能是错误的字符,去除掉。
    sentences=sentences[s.len<=10];
    s.len=nchar(sentences);
    # 暴力挨个拆分,比如“犹解嫁东风”的所有二字组合为
    # “犹解”“解嫁”“嫁东”“东风”,
    # 无意义的词其频数自然就落在后面了。
    splitwords=function(x,x.len) substring(x,1:(x.len-1),2:x.len);
    words=mapply(splitwords,sentences,s.len,SIMPLIFY=TRUE,USE.NAMES=FALSE);
    words=unlist(words);
    words.freq=table(words);
    words.freq=sort(words.freq,decreasing=TRUE);
    data.frame(Word=names(words.freq[1:100]),Freq=as.integer(words.freq[1:100]));


    IP属地:江苏2楼2011-12-02 10:23
    回复
      2025-07-25 23:44:08
      广告
      不感兴趣
      开通SVIP免广告
      IP属地:江苏4楼2011-12-02 10:24
      回复
        虽然完全看不懂,但是觉得LZ好厉害的样子。


        5楼2011-12-02 11:13
        回复