标题: 【完结】五十元求不分词的词频统计 [打印本页]
作者: 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 编辑
- @echo off
- set info=互助互利,支付宝扫码头像,感谢赞助
- rem 有问题,可加QQ956535081及时沟通
- title %info%
- cd /d "%~dp0"
- powershell -NoProfile -ExecutionPolicy bypass ^
- $file1='源文件.txt';^
- $file2='统计结果.txt';^
- $range='2-7';^
- $dic=New-Object 'System.Collections.Generic.Dictionary[string,int]';^
- $text1=[IO.File]::ReadAllText($file1,[Text.Encoding]::Default);^
- $r=$range.split('-');^
- $m=[regex]::matches($text1, '[\u4E00-\u9FA5]');^
- for($i=[int]$r[0];$i -le [int]$r[1];$i++){^
- for($j=0;$j -le ($m.count-$i);$j++){^
- $s='';^
- for($k=$j;$k -lt ($j+$i);$k++){^
- $s+=$m[$k].groups[0].value;^
- };^
- if(-not $dic.ContainsKey($s)){^
- $dic.add($s,1);^
- }else{^
- $dic[$s]++;^
- };^
- };^
- };^
- [System.Collections.ArrayList]$result=@();^
- foreach($it in $dic.Keys){^
- if($dic[$it] -ge 2){^
- $t=$it+' '+$dic[$it];^
- write-host $t;^
- [void]$result.add($t);^
- };^
- };^
- [IO.File]::WriteAllLines($file2, $result, [Text.Encoding]::Default);
- echo;%info%
- 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 编辑
- @echo off
- set info=互助互利,支付宝扫码头像,感谢赞助
- rem 有问题,可加QQ956535081及时沟通
- title %info%
- cd /d "%~dp0"
- powershell -NoProfile -ExecutionPolicy bypass ^
- $file1='源文件.txt';^
- $file2='统计结果.txt';^
- $range='2-7';^
- $dic=New-Object 'System.Collections.Generic.Dictionary[string,int]';^
- $text1=[IO.File]::ReadAllLines($file1,[Text.Encoding]::Default);^
- $r=$range.split('-');^
- for($i=0;$i -lt $text1.count;$i++){^
- $line=$text1[$i].trim();^
- if($line -ne ''){^
- $arr=$line -split '[^^\u4E00-\u9FA5]+';^
- for($j=0;$j -lt $arr.length;$j++){^
- for($k=[int]$r[0];$k -le [int]$r[1];$k++){^
- for($a=0;$a -le ($arr[$j].length-$k);$a++){^
- $s='';^
- for($b=$a;$b -lt ($k+$a);$b++){^
- $s+=$arr[$j][$b];^
- };^
- if(-not $dic.ContainsKey($s)){^
- $dic.add($s,1);^
- }else{^
- $dic[$s]++;^
- };^
- };^
- };^
- };^
- };^
- };^
- [System.Collections.ArrayList]$result=@();^
- foreach($it in $dic.Keys){^
- if($dic[$it] -ge 2){^
- $t=$it+' '+$dic[$it];^
- write-host $t;^
- [void]$result.add($t);^
- };^
- };^
- [IO.File]::WriteAllLines($file2, $result, [Text.Encoding]::Default);
- echo;%info%
- pause
复制代码
作者: flashercs 时间: 2019-12-1 15:29
不知这个效率怎样 3万行 17秒- <#*,:&cls
- @echo off
- pushd "%~dp0"
- Powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~0\" -ReadCount 0 | Out-String ))) "
- popd
- pause
- exit /b
- #>
- $FileList = "源文件.txt"
- $FileOut = "词频统计.txt"
- function Get-WordCount {
- [CmdletBinding()]
- param (
- [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
- [AllowEmptyCollection()]
- [AllowEmptyString()]
- [AllowNull()]
- [string[]]$Sentences,
- [Parameter(Mandatory = $false, Position = 1)]
- [ValidateNotNullOrEmpty()]
- [ValidateScript( { $_ -gt 0 })]
- [int[]]$WordLengthList = @(2, 3, 4, 5, 6, 7),
- [Parameter(Mandatory = $false, Position = 2)]
- [switch]$IncludePunctuations
- )
-
- begin {
- $dicWordCount = @{ }
- for ($i = 0; $i -lt $WordLengthList.Count; $i++) {
- $dicWordCount.Add($WordLengthList[$i], (New-Object "System.Collections.Generic.Dictionary[string, int]"))
- }
- # $reWord = New-Object System.Text.RegularExpressions.Regex -ArgumentList @("\w+")
- $reWord = New-Object System.Text.RegularExpressions.Regex -ArgumentList @("[\u4E00-\u9FA5]+")
- }
-
- process {
- foreach ($Sentence in $Sentences) {
- if ($IncludePunctuations) {
- $WordList = , $Sentence
- } else {
- $WordList = $reWord.Matches($Sentence) | ForEach-Object { $_.Value }
- }
- if ($WordList) {
- foreach ($Word in $WordList) {
- foreach ($WordLength in $WordLengthList) {
- $PosTail = $Word.Length - $WordLength
- $dicCtr = $dicWordCount.Item($WordLength)
- for ($i = 0; $i -le $PosTail; $i++) {
- $dicCtr[$Word.SubString($i, $WordLength)]++
- }
- }
- }
- }
- }
- }
-
- end {
- $dicWordCount
- }
- }
-
- $dicWordCount = Get-WordCount -Sentences (Get-Content -ReadCount 0 -Path $FileList)
- Set-Content -Value (
- $dicWordCount.Keys | Sort-Object | ForEach-Object {
- $dicCtr = $dicWordCount[$_]
- foreach ($key in $dicCtr.Keys) {
- '{0,-10} : {1}' -f $key, $dicCtr[$key]
- }
- }) -LiteralPath $FileOut
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |