Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PowerShell:使用单词列表检查文件是否为英文_Powershell - Fatal编程技术网

PowerShell:使用单词列表检查文件是否为英文

PowerShell:使用单词列表检查文件是否为英文,powershell,Powershell,以下是场景: 我有一系列不同语言的文件,我需要找出哪一个是英语。 我的想法是创建一个单词数组,然后逐个检查文件中出现的单词。最后,我将每个单词的出现次数加在一起。如果总数足够高,我会假设文件是英文的 在进行了一点创造性的谷歌搜索之后,我开始这样做: [System.Array]$Words = ' the ',' this ',' in ',' you ',' of ',' are ','music' [System.String]$Content = Get-Content -Path &l

以下是场景: 我有一系列不同语言的文件,我需要找出哪一个是英语。 我的想法是创建一个单词数组,然后逐个检查文件中出现的单词。最后,我将每个单词的出现次数加在一起。如果总数足够高,我会假设文件是英文的

在进行了一点创造性的谷歌搜索之后,我开始这样做:

[System.Array]$Words = ' the ',' this ',' in ',' you ',' of ',' are ','music'

[System.String]$Content = Get-Content -Path <FileName>

ForEach ($Word in $Words) {
  $Count = [RegEx]::Matches($Content,[RegEx]::Escape($Word)).Count
  Write-Output -InputObject "$Word : $Count"
}
那我下一步要去哪里

我考虑使用
[System.Int32]$Hits=0
$Hits++
将它们添加到一起。只是想弄清楚怎么做


而且,当我用Notepad++检查同一个文件时,我得到了不同的计数,这很奇怪。我做错什么了吗?

不要输出字符串,而是输出一个对象并将其存储在变量中

$stringCounts = foreach ($Word in $Words) {
  $Count = [RegEx]::Matches($Content,[RegEx]::Escape($Word)).Count
  New-Object psobject -Property @{
    Word = $Word
    Count = $Count
  }
}
现在,您可以使用
测量对象
轻松获得单个计数的总和:

$TotalCount = ($stringCounts |Measure-Object Count -Sum).Sum

最终,你必须做出的艰难决定是明确说明“如果总数足够高”的确切含义。总结总的英语单词计数是微不足道的,门槛是很难的部分(你可能会考虑设置一个阈值的共同比例的英语单词比绝对限制。还考虑到文件,如代码>音乐音乐< < /代码>)。Btw.你可以下载拼字词典,sowpods或类似的东西,然后接近100%的单词应该被检测到,大约80%的边界应该会给出很好的结果。你只需要在文本中迭代一次,检查每个单词是否为英语。我必须找到在英语中出现率高而在其他语言中出现率低的单词(我在数组中的单词周围放置前导空格和尾随空格的原因之一是为了避免包含这些字符的单词)这样做会产生巨大的差异,从而更容易设置阈值。哪些词是另一个论坛的问题。有了一本大词典,我会冒着太多重叠的风险(例如英语有法语的传统)@马拉卡,你能再详细一点吗?正则表达式对我来说仍然是一个棘手的话题。@Mark ok那么区别就更微妙了,但是
“word”
仍然与
\bword\b
不同。单词边界可以是返回值
\n
,也可以是标点符号,只要在单词周围加上空格,这些单词就会丢失。另外请注意,除非另有规定,否则正则表达式通常区分大小写。@请注意,英文单词实际上并不多,您可以将它们存储在哈希映射中(很抱歉,我不知道powershell,所以我不知道那里存在什么),检查映射中的单词是否为O(1)。是的,有一些常见的单词,但法语和英语还是有很大的不同,想想看,如果80%的单词都是相同的,那么理解其他欧洲语言就没有问题了。如果是该语言,10个单词中的2个错误是高的,但如果不是,则不是。顺便说一句,德语、法语和英语可能只有通过观察umlauts和重音才能区分。这应该是:
($stringCounts | Measure Object-Property Count-Sum)。Sum
没有
-Property Count
我得到一个例外。不过,使用对象会让它更专业,所以谢谢。然后,我可能会使用返回的数字与阈值进行比较。我会等一会儿,看看是否还有更多的路可以去罗马,可以这么说。我想只有一条路可以去罗马,因为没有人想出不同的办法。您的解决方案可以帮助我分析结果并回答问题,因此我将对其进行标记。非常感谢。我会从这里找出如何使用这些单词。
$TotalCount = ($stringCounts |Measure-Object Count -Sum).Sum