텍스트 파일에서 가장 일반적인 10개의 단어를 찾고 싶습니다. 첫째, 솔루션은 키 입력(즉, 내 시간)에 맞게 최적화되어야 합니다. 둘째, 성능을 위해서입니다. 지금까지 제가 선정한 TOP 10은 다음과 같습니다.
cat test.txt | tr -c '[:alnum:]' '[\n*]' | uniq -c | sort -nr | head -10
6 k
2 g
2 e
2 a
1 r
1 k22
1 k
1 f
1 eeeeeeeeeeeeeeeeeeeee
1 d
(word, numberOfOccurences)를 사전에 저장하고 값을 정렬하는 Java, Python 등의 프로그램을 만들 수도 있고, MapReduce를 사용할 수도 있지만 키 입력에 맞게 최적화할 것입니다.
거짓 긍정이 있습니까? 더 좋은 방법이 있나요?
답변1
이것은 "가장 일반적인 N개 항목"을 찾는 가장 일반적인 방법입니다. 단, a 가 누락되어 sort
있고 무료로 하나가 있습니다 cat
.
tr -c '[:alnum:]' '[\n*]' < test.txt | sort | uniq -ci | sort -nr | head -10
sort
앞에 a를 추가하지 않으면 uniq -ci
잘못된 싱글톤 단어가 많이 나올 수 있습니다. uniq
전체적인 독특함이 아닌 라인만 독특합니다.
"단어 중지"라는 트릭을 사용하고 싶을 수도 있습니다. 영어 텍스트(죄송하지만 여기서는 북미 단일 언어)를 보면 "of", "and", "the"와 같은 단어가 거의 항상 처음 두세 자리를 차지합니다. 이를 제거하고 싶을 수도 있습니다. GNU Groff 배포판에는 eign
꽤 좋은 불용어 목록이 포함된 파일이 있습니다. 내 Arch 배포판에는 이 항목이 있지만 나도 본 것 같 거나 이전 Unix에서도 /usr/share/groff/current/eign
본 것 같습니다 ./usr/share/dict/eign
/usr/dict/eign
다음과 같이 불용어를 사용할 수 있습니다.
tr -c '[:alnum:]' '[\n*]' < test.txt |
fgrep -v -w -f -i /usr/share/groff/current/eign |
sort | uniq -ci | sort -nr | head -10
내 생각엔 대부분의 인간 언어는 의미 있는 단어 빈도수에서 유사한 "불용 단어"를 제거해야 할 것 같지만, 다른 언어에 대한 불용 단어 목록을 어디서 가져오도록 제안되는지 모르겠습니다.
-w
on 플래그는 fgrep
전체 단어 일치를 활성화합니다. 이렇게 하면 짧은 중지만 포함된 단어(예: "a" 또는 "i")에 대한 잘못된 긍정을 방지할 수 있습니다. 이 플래그는 단어를 비교할 때 -i
켜지고 uniq
대소 문자를 무시합니다.fgrep
답변2
이것은 utf-8에서 더 잘 작동합니다.
$ sed -e 's/\s/\n/g' < test.txt | sort | uniq -c | sort -nr | head -10
답변3
AWK를 사용해 보자!
이 함수는 제공된 파일에 있는 각 단어의 발생 빈도를 내림차순으로 나열합니다.
function wordfrequency() {
awk '
BEGIN { FS="[^a-zA-Z]+" } {
for (i=1; i<=NF; i++) {
word = tolower($i)
words[word]++
}
}
END {
for (w in words)
printf("%3d %s\n", words[w], w)
} ' | sort -rn
}
다음과 같이 파일에서 호출할 수 있습니다.
$ cat your_file.txt | wordfrequency
처음 10개 단어의 경우:
$ cat your_file.txt | wordfrequency | head -10
원천:AWK 일 루비
답변4
하스켈을 사용해보자!
점점 언어전쟁이 되고 있는 것 아닌가요?
import Data.List
import Data.Ord
main = interact $ (=<<) (\x -> show (length x) ++ " - " ++ head x ++ "\n")
. sortBy (flip $ comparing length)
. group . sort
. words
용법:
cat input | wordfreq
또는:
cat input | wordfreq | head -10