Board logo

标题: 【完结】五十元求不分词的词频统计 [打印本页]

作者: lxh623    时间: 2019-11-30 09:04     标题: 【完结】五十元求不分词的词频统计

本帖最后由 lxh623 于 2019-11-30 15:20 编辑

以前求助过,没有彻底解决一般的使用场合所遇到的问题。
不分词的词频统计,这里有一个,我不大会用。https://blog.ailemon.me/2017/02/ ... entation-algorithm/
本论坛有一个,也不会用。http://www.bathome.net/thread-45901-1-1.html,不知道是不是需要关键词。

我的想法是,第一步获取文本相邻n个汉字,得到关键词文本。只在一行内,不涉及转行。遇到标点符号或者英文就跳过。到行尾,没有n个字也跳过。
这样分别得到二字词、三字词、四字词、五字词、六字词、七字词的关键词文本。

第二步,用关键词文本搜索计数,得到词频。
以前这个(9楼)效率特别高,但是,只用于2-3个字的词语。http://www.bathome.net/thread-53489-1-1.html

一个二十五元吧。要是一个批处理解决,一起支付。

想到一个问题,第一步得到关键词文本,没有必要删除重复行、再第二步,直接就利用它来计数,就是词频文本了。
作者: zaqmlp    时间: 2019-11-30 13:21

本帖最后由 zaqmlp 于 2019-12-1 15:54 编辑
  1. @echo off
  2. set info=互助互利,支付宝扫码头像,感谢赞助
  3. rem 有问题,可加QQ956535081及时沟通
  4. title %info%
  5. cd /d "%~dp0"
  6. powershell -NoProfile -ExecutionPolicy bypass ^
  7.     $file1='源文件.txt';^
  8.     $file2='统计结果.txt';^
  9.     $range='2-7';^
  10.     $dic=New-Object 'System.Collections.Generic.Dictionary[string,int]';^
  11.     $text1=[IO.File]::ReadAllText($file1,[Text.Encoding]::Default);^
  12.     $r=$range.split('-');^
  13.     $m=[regex]::matches($text1, '[\u4E00-\u9FA5]');^
  14.     for($i=[int]$r[0];$i -le [int]$r[1];$i++){^
  15.         for($j=0;$j -le ($m.count-$i);$j++){^
  16.             $s='';^
  17.             for($k=$j;$k -lt ($j+$i);$k++){^
  18.                 $s+=$m[$k].groups[0].value;^
  19.             };^
  20.             if(-not $dic.ContainsKey($s)){^
  21.                 $dic.add($s,1);^
  22.             }else{^
  23.                 $dic[$s]++;^
  24.             };^
  25.         };^
  26.     };^
  27.     [System.Collections.ArrayList]$result=@();^
  28.     foreach($it in $dic.Keys){^
  29.         if($dic[$it] -ge 2){^
  30.             $t=$it+' '+$dic[$it];^
  31.             write-host $t;^
  32.             [void]$result.add($t);^
  33.         };^
  34.     };^
  35.     [IO.File]::WriteAllLines($file2, $result, [Text.Encoding]::Default);
  36. echo;%info%
  37. pause
复制代码

作者: lxh623    时间: 2019-11-30 15:19

回复 2# zaqmlp
请查收!谢谢!
作者: lxh623    时间: 2019-11-30 16:28

回复 2# zaqmlp
我说的跳过是不计入关键词,从标点符号后面重新开始。转行也是,重新开始。
还有一种想法(必要性不大吧!),把中文标点符号当作一个汉字。跳过英文标点符号。
如果改一下,就更加圆满了。谢谢!
作者: zaqmlp    时间: 2019-11-30 17:39

回复 4# lxh623

没有计标点符号,只统计汉字
作者: zaqmlp    时间: 2019-11-30 18:17

本帖最后由 zaqmlp 于 2019-12-1 16:19 编辑
  1. @echo off
  2. set info=互助互利,支付宝扫码头像,感谢赞助
  3. rem 有问题,可加QQ956535081及时沟通
  4. title %info%
  5. cd /d "%~dp0"
  6. powershell -NoProfile -ExecutionPolicy bypass ^
  7.     $file1='源文件.txt';^
  8.     $file2='统计结果.txt';^
  9.     $range='2-7';^
  10.     $dic=New-Object 'System.Collections.Generic.Dictionary[string,int]';^
  11.     $text1=[IO.File]::ReadAllLines($file1,[Text.Encoding]::Default);^
  12.     $r=$range.split('-');^
  13.     for($i=0;$i -lt $text1.count;$i++){^
  14.         $line=$text1[$i].trim();^
  15.         if($line -ne ''){^
  16.             $arr=$line -split '[^^\u4E00-\u9FA5]+';^
  17.             for($j=0;$j -lt $arr.length;$j++){^
  18.                 for($k=[int]$r[0];$k -le [int]$r[1];$k++){^
  19.                     for($a=0;$a -le ($arr[$j].length-$k);$a++){^
  20.                         $s='';^
  21.                         for($b=$a;$b -lt ($k+$a);$b++){^
  22.                             $s+=$arr[$j][$b];^
  23.                         };^
  24.                         if(-not $dic.ContainsKey($s)){^
  25.                             $dic.add($s,1);^
  26.                         }else{^
  27.                             $dic[$s]++;^
  28.                         };^
  29.                     };^
  30.                 };^
  31.             };^
  32.         };^
  33.     };^
  34.     [System.Collections.ArrayList]$result=@();^
  35.     foreach($it in $dic.Keys){^
  36.         if($dic[$it] -ge 2){^
  37.             $t=$it+' '+$dic[$it];^
  38.             write-host $t;^
  39.             [void]$result.add($t);^
  40.         };^
  41.     };^
  42.     [IO.File]::WriteAllLines($file2, $result, [Text.Encoding]::Default);
  43. echo;%info%
  44. pause
复制代码

作者: flashercs    时间: 2019-12-1 15:29

不知这个效率怎样 3万行 17秒
  1. <#*,:&cls
  2. @echo off
  3. pushd "%~dp0"
  4. Powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~0\" -ReadCount 0 | Out-String ))) "
  5. popd
  6. pause
  7. exit /b
  8. #>
  9. $FileList = "源文件.txt"
  10. $FileOut = "词频统计.txt"
  11. function Get-WordCount {
  12.   [CmdletBinding()]
  13.   param (
  14.     [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
  15.     [AllowEmptyCollection()]
  16.     [AllowEmptyString()]
  17.     [AllowNull()]
  18.     [string[]]$Sentences,
  19.     [Parameter(Mandatory = $false, Position = 1)]
  20.     [ValidateNotNullOrEmpty()]
  21.     [ValidateScript( { $_ -gt 0 })]
  22.     [int[]]$WordLengthList = @(2, 3, 4, 5, 6, 7),
  23.     [Parameter(Mandatory = $false, Position = 2)]
  24.     [switch]$IncludePunctuations
  25.   )
  26.   
  27.   begin {
  28.     $dicWordCount = @{ }
  29.     for ($i = 0; $i -lt $WordLengthList.Count; $i++) {
  30.       $dicWordCount.Add($WordLengthList[$i], (New-Object "System.Collections.Generic.Dictionary[string, int]"))
  31.     }
  32.     # $reWord = New-Object System.Text.RegularExpressions.Regex -ArgumentList @("\w+")
  33.     $reWord = New-Object System.Text.RegularExpressions.Regex -ArgumentList @("[\u4E00-\u9FA5]+")
  34.   }
  35.   
  36.   process {
  37.     foreach ($Sentence in $Sentences) {
  38.       if ($IncludePunctuations) {
  39.         $WordList = , $Sentence
  40.       } else {
  41.         $WordList = $reWord.Matches($Sentence) | ForEach-Object { $_.Value }
  42.       }
  43.       if ($WordList) {
  44.         foreach ($Word in $WordList) {
  45.           foreach ($WordLength in $WordLengthList) {
  46.             $PosTail = $Word.Length - $WordLength
  47.             $dicCtr = $dicWordCount.Item($WordLength)
  48.             for ($i = 0; $i -le $PosTail; $i++) {
  49.               $dicCtr[$Word.SubString($i, $WordLength)]++
  50.             }
  51.           }
  52.         }
  53.       }
  54.     }
  55.   }
  56.   
  57.   end {
  58.     $dicWordCount
  59.   }
  60. }
  61. $dicWordCount = Get-WordCount -Sentences (Get-Content -ReadCount 0 -Path $FileList)
  62. Set-Content -Value (
  63.   $dicWordCount.Keys | Sort-Object | ForEach-Object {
  64.     $dicCtr = $dicWordCount[$_]
  65.     foreach ($key in $dicCtr.Keys) {
  66.       '{0,-10} : {1}' -f $key, $dicCtr[$key]
  67.     }
  68.   }) -LiteralPath $FileOut
复制代码





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