2017-05-20 99 views
1

以下是這個場景: 我有一系列不同語言的文件,我需要弄清楚哪些文件是英文的。 我的想法是創建一個單詞數組,然後逐個檢查這些單詞的出現次數。最後,我將每個單詞的出現次數加在一起。如果總數足夠高,我會假定文件是英文的。PowerShell:使用單詞列表檢查文件是否爲英文

有點創意谷歌搜索的我開始了這之後:

[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" 
} 

這讓我發現,它的工作至少:

the : 172 
this : 14 
in : 52 
you : 95 
of : 61 
are : 18 
music : 0 

所以我去下一個在哪裏?

我考慮用[System.Int32]$Hits = 0$Hits++將它們加在一起。試圖弄清楚如何。

此外,當我用Notepad ++檢查同一個文件時,我得到了不同的計數,奇怪的是。難道我做錯了什麼?

+0

最終你將不得不作出精確地確定你的意思是什麼「如果總的是硬判決足夠高」。總結英語單詞的總數是微不足道的,門檻是最難的部分(你可能會考慮爲普通英語單詞的總比例*設置一個閾值而不是絕對限制,同時考慮到「音樂音樂」 )。 –

+0

順便說一句。你可以下載拼字遊戲字典,sowpods或類似的東西,然後接近100%的單詞應該被檢測到,並且約80%的邊界應該會給出好的結果。你只需要遍歷文本一次,並檢查每個單詞是否是英語。 – maraca

+0

我必須找到英語出現頻率高且其他語言出現頻率低的詞(我在數組中包含單詞前後空格的原因之一是爲了避免包含這些字符的詞)和這樣做會產生很大的差異,從而更容易設置閾值。這些字是哪一個是另一個論壇的問題。用一本大字典,我會面臨過多重疊的風險(例如英語有法國傳統)。 @maraca,你能再詳細一點嗎? RegEx對我來說仍然是一個難題。 – Mark

回答

3

不是輸出一個字符串,而是輸出一個對象並將它們存儲在一個變量中!

$stringCounts = foreach ($Word in $Words) { 
    $Count = [RegEx]::Matches($Content,[RegEx]::Escape($Word)).Count 
    New-Object psobject -Property @{ 
    Word = $Word 
    Count = $Count 
    } 
} 

現在您可以輕鬆獲得個人數的總和與Measure-Object

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

這應該是: '($ stringCounts | Measure-Object -Property Count -Sum).Sum' 沒有'-Property Count'我得到一個異常。 使用一個對象使得它更專業,所以謝謝。 我可以使用返回的數字與閾值進行比較。 我會等一下,看看有沒有更多的方式來羅馬,可以這麼說。 – Mark

+0

我想只有一條去羅馬的路,因爲沒有人想出不同的東西。你的解決方案可以幫助我解析結果並回答問題,所以我會將其標記爲這樣。謝謝。我會去弄清楚如何處理這裏的單詞。 – Mark

相關問題