Board logo

标题: [已解决]20元求词频统计 [打印本页]

作者: lxh623    时间: 2019-7-30 10:34     标题: [已解决]20元求词频统计

词频统计,我觉得有两种,分词和不分词。
不分词的,https://blog.ailemon.me/2017/02/ ... entation-algorithm/
我还用不来。

http://www.bathome.net/viewthrea ... hlight=%CD%B3%BC%C6
这里的方法好像可以。但是超级慢,一分钟大约20个。我的两字词的表是26万。

我的文本大约60多兆。想统计所有二字词和三字词的频率,有没有高效的办法。
谢谢!
作者: zaqmlp    时间: 2019-7-30 11:48

发的两个链接是两个不同的统计方法,你要的是哪种
作者: Batcher    时间: 2019-7-30 13:48

调用gawk的那个方案每分钟处理多少个?
test.bat
  1. @echo off
  2. gawk "FILENAME==\"test.txt\" {a[$0]++} FILENAME==\"lit.txt\"{printf(\"%%s有%%d次\n\",$0,a[$0])}" test.txt lit.txt >jjpc.txt
复制代码

作者: lxh623    时间: 2019-7-30 14:21

本帖最后由 lxh623 于 2019-7-30 14:27 编辑

回复 3# Batcher
上午那个没有出来,您这个很快出来了,但是,都是0次。

也许没有说明白。两个文件不一样。一个是词语,一个是诗词(一行一首)。用词语搜索诗词。

谢谢!
作者: lxh623    时间: 2019-7-30 14:28

回复 2# zaqmlp
都可以的,只要达到结果。全部都有词频。
第一个大概自己去做一个词表。
作者: zaqmlp    时间: 2019-7-30 14:35

回复 5# lxh623

不是都可以,两种处理方式不同,结果也不同
直接说明白你的文本内容是怎样的,需要怎么统计
作者: Batcher    时间: 2019-7-30 14:42

回复 4# lxh623


    原贴代码是Linux语法,我只是翻译成了Windows语法。至于得不到正确的结果,可能是需求不一样。
作者: lxh623    时间: 2019-7-30 15:13

本帖最后由 lxh623 于 2019-7-30 15:17 编辑

回复 6# zaqmlp
搜索每一个词语,得到它出现的总次数(不是总行数)。
原件:
盼断归期,划损短金篦。一搦腰围,宽褪素罗衣。知他是甚病疾,好教人没理会,拣口儿食,陡恁的无滋味。医,越恁的难调理。
秋景堪题,红叶满山溪。松径偏宜,黄菊绕东篱。正清樽斟泼醅,有白衣劝酒杯。官品极,到底成何济!归,学取他渊明醉。
怕见春归,枝上柳绵飞。静掩香闺,帘外晓莺啼。恨天涯锦字稀,梦才郎翠被知。宽尽衣,一搦腰肢细。痴,暗暗的添憔悴。
你性随邪,迷恋不来也。我心痴呆,等到月儿斜。你欢娱受用别,我凄凉为甚迭!休谎说,不索寻吴越。咱,负心的教天灭!

关键词文本:
一一
一丁
一七
一上
一下
一世
一丘
一丝
一丢
一两
一严
一个
一举
一乘
一九
一了
一事
一二
一井
一些
作者: WHY    时间: 2019-7-30 15:51

本帖最后由 WHY 于 2019-7-31 10:37 编辑
  1. @echo off
  2. REM 关键词字数,2~3个字
  3. set /a Min=2, Max=3
  4. gawk "FNR==NR{a[$0]=1;b[$0]=0};FNR!=NR{for(i=%Min%;i<=%Max%;i++)for(j=1;j<=length($0)-i+1;j++){s=substr($0,j,i);if(a[s])b[s]++}}END{for(i in b)print i,b[i]}" 关键词.txt 诗词.txt > Result.txt
  5. pause
复制代码
诗词.txt
  1. 盼断归期,划损短金篦。一搦腰围,宽褪素罗衣。知他是甚病疾,好教人没理会,拣口儿食,陡恁的无滋味。医,越恁的难调理。
  2. 秋景堪题,红叶满山溪。松径偏宜,黄菊绕东篱。正清樽斟泼醅,有白衣劝酒杯。官品极,到底成何济!归,学取他渊明醉。
复制代码
关键词.txt
  1. 盼断
  2. 一搦
  3. 天地
  4. 我们
  5. 素罗衣
复制代码
Result.txt
  1. 天地 0
  2. 素罗衣 1
  3. 我们 0
  4. 一搦 1
  5. 盼断 1
复制代码

作者: zaqmlp    时间: 2019-7-30 15:54

  1. @echo off
  2. set info=互助互利,支付宝扫码头像,感谢赞助
  3. rem 有问题,可加QQ956535081及时沟通
  4. title %info%
  5. set "rootpath=%~dp0"
  6. cd /d "%rootpath%"
  7. powershell -NoProfile -ExecutionPolicy bypass ^
  8.     function getcount($str,$word){^
  9.         $index=0;^
  10.         $count=0;^
  11.         while(($index=$str.IndexOf($word, $index)) -ne -1){^
  12.             $count++;^
  13.             $index=$index+$word.Length;^
  14.         };^
  15.         return $count;^
  16.     };^
  17.     $file1='原件.txt';^
  18.     $file2='关键词.txt';^
  19.     $file3='统计结果.txt';^
  20.     $dic=New-Object 'System.Collections.Generic.Dictionary[string,int]';^
  21.     $text1=[IO.File]::ReadAllLines($file1,[Text.Encoding]::Default);^
  22.     $text2=[IO.File]::ReadAllLines($file2,[Text.Encoding]::Default);^
  23.     for($i=0;$i -lt $text1.count;$i++){^
  24.         for($j=0;$j -lt $text2.count;$j++){^
  25.             $c=getcount $text1[$i] $text2[$j];^
  26.             if(-not $dic.ContainsKey($text2[$j])){^
  27.                 $dic.add($text2[$j], $c);^
  28.             }else{^
  29.                 $dic[$text2[$j]]+=$c;^
  30.             };^
  31.         };^
  32.     };^
  33.     [System.Collections.ArrayList]$s=@();^
  34.     foreach($it in $dic.keys){[void]$s.add($it+' '+$dic[$it])};^
  35.     [IO.File]::WriteAllLines($file3, $s, [Text.Encoding]::Default);^
  36.     $dic;
  37. echo;%info%
  38. pause
复制代码

作者: lxh623    时间: 2019-7-30 16:30

回复 10# zaqmlp
请问,路径需要写入吗?
示例:E:\ABC Book\C诗歌对联\诗词总汇
作者: zaqmlp    时间: 2019-7-30 16:33

回复 11# lxh623
17~19行,可要可不要,把bat跟原件.txt、关键词.txt放一起运行
作者: lxh623    时间: 2019-7-30 17:21

回复 9# WHY

如果是三字词,还是可以吗?
作者: WHY    时间: 2019-7-30 19:48

回复 13# lxh623


    已修改
作者: happy886rr    时间: 2019-7-31 12:49

用我写的工具trie,上百兆文件几秒钟就能统计完,http://www.bathome.net/thread-45901-1-1.html
作者: lxh623    时间: 2019-7-31 14:27

回复 15# happy886rr
请问,可以发一个到同名163邮箱吗。谢谢!
当真了解了一下,登录时间是上个月。
不知道是不是不分词的统计?是不是可以设置统计1-6个字的频率?
作者: lxh623    时间: 2019-7-31 14:29

回复 9# WHY
要是直接用每一行去搜索,不是更通用吗?
麻烦一下。
作者: WHY    时间: 2019-7-31 18:16

回复 17# lxh623


      这个是根据你的具体要求来的,条件一变脚本就得改,"通用" 应该谈不上。
如果以每一行关键字(顶楼说26万行)去搜索诗词每一行内容,循环次数会增加很多,可能会降低效率。你可以试试:
  1. gawk "FNR==NR{a[$0]=1};FNR!=NR{for(i in a)b[i]+=gsub(i,i)}END{for(i in b)print i,b[i]}" 关键词.txt 诗词.txt > Result.txt
复制代码

作者: xczxczxcz    时间: 2019-7-31 19:13

简单测试了下,顶楼诗词 复制粘贴到 60-70M。搜索存在不重复的关键词1000个用时约77秒。26万多个得6个小时左右。这东西得用 C 或 汇编之类来写。
作者: lxh623    时间: 2019-8-1 09:04

回复 19# xczxczxcz
9楼的代码大约四十分钟,很快的。是29万行的关键词。
作者: lxh623    时间: 2019-8-1 09:20

本帖最后由 lxh623 于 2019-8-1 11:48 编辑

回复 18# WHY
如楼上所说,很快的。
我觉得,都是29万行,用2-3个字或者一行,(一行就是2-3个字)难道不一样吗。
9楼的代码,我改成4和6,就是没有结果。怪了。
作者: lxh623    时间: 2019-8-2 10:55

回复 15# happy886rr
无法获得启动参数。不会用啊!
  1. echo
  2. trie U:C2.DI <in.txt>out.txt
  3. trie m
  4. pause
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2