불용어 파일을 사용하여 단어 목록 필터링 [닫기]

불용어 파일을 사용하여 단어 목록 필터링 [닫기]

따라서 임의의 텍스트가 포함된 텍스트 파일이 있고 파일에 있는 모든 단어를 나열해야 하지만 불용어 파일에서 공통적으로 나타나는 모든 단어를 필터링해야 합니다. 이를 달성하려면 어떤 명령을 사용할 수 있습니까?

답변1

"단어"가 공백으로 둘러싸인 문자열이라고 가정하면 모든 공백을 줄 바꿈으로 변경하고 결과를 정렬하고 중복 항목을 제거할 수 있습니다. 그런 다음 해당 목록에서 중지 단어를 제거하면 됩니다.

tr -s '[:space:]' '[\n*]' <textfile |
sort -fu |
grep -v -Fix -f stopwords

tr명령은 공백과 유사한 모든 문자를 줄 바꿈으로 변경하고 여러 개의 연속된 줄 바꿈을 하나로 압축합니다. 그런 다음 목록을 한 줄에 한 단어씩 정렬하고 중복 단어를 제거합니다(대소문자 무시 -f).

'[:space:][:punct:]'첫 번째 인수로 tr텍스트를 공백과 유사한 문자 및 구두점으로 단어로 분할하거나 명시적인 문자 목록을 사용하여 시도할 수도 있습니다 ' ,.!?'.

그런 다음 정렬된 고유 단어 목록을 stopwords(한 줄에 불용 단어가 하나씩 있는 줄이 포함된 파일, 가지고 있는 파일로 변경)의 단어와 비교하고 일치하지 않는 단어를 해당 목록에 유지합니다.

-F유틸리티가 grep패턴을 다음과 같이 처리하도록 강제합니다.정규 표현식이 아닌 이 -i옵션을 사용하면 대소문자를 구분하지 않는 일치를 사용합니다. 이 -x옵션을 사용하면 (하위 문자열 일치 대신) 전체 줄 일치만 허용할 수 있습니다. 이 -v옵션은 일반적인 일치 의미를 반전시키므로 다음 줄은아니요일치하는 항목은 유지되고 지정된 파일에서 패턴을 읽습니다 -f.grep

답변2

이 두 파일이 어떻게 생겼는지 알지 못하면 귀하의 질문에 대답하기가 어렵습니다.

하지만 이 한 줄짜리 내용이 효과를 발휘할 것입니다.

comm -3 <(sed 's/\s\+/\n/g' random.txt | sort | uniq) <(sed 's/\s\+/\n/g' stopwords.txt | sort | uniq)

comm -3두 개의 정렬된 파일을 한 줄씩 비교하고 두 파일에 나타나는 줄을 억제합니다.

<(...)한 명령의 출력을 다른 명령에 파일로 제공하는 bash 트릭입니다. 그래서 제가 여기서 하고 있는 일은 두 파일에서 정렬된 단어 목록을 생성하는 것입니다.

sed 's/\s\+/\n/g' random.txt모든 공백과 탭을 개행 문자로 변환합니다. 엄청난! 한 줄에 한 단어씩.

sort그렇게 하고 행을 정렬하면 됩니다.

uniq각 단어가 한 번만 나타나는지 확인하십시오.

tr또는 대신 사용할 수 있습니다 sed.

comm -3 <(tr -s '[:space:]' '\n' < random.txt | sort | uniq) <(tr -s '[:space:]' '\n' < stopwords.txt | sort | uniq)

파일이 매우 큰 경우 이 방법이 더 빠를 수 있습니다.

답변3

입력/출력 예제를 제공하지 않았으므로 다중 문자 RS에 대해 GNU awk를 사용하여 일련의 가정이 이루어졌습니다.

awk -v RS='[^[:alpha:]]*[[:space:]]+[^[:alpha:]]*' '
     {lc=tolower($0)} NR==FNR{a[lc]++; next} !a[lc]++
' stop_words random_text

예를 들어 다음 입력을 사용합니다.

$ head stop_words random_text
==> stop_words <==
a Of in at As
The by I on

==> random_text <==
I wandered lonely as a cloud
That floats on high o'er vales and hills,
When all at once I saw a crowd,
A host, of golden daffodils;
I wandered lonely as a cloud
When all at once I saw a crowd,

$ awk -v RS='[^[:alpha:]]*[[:space:]]+[^[:alpha:]]*' '{lc=tolower($0)} NR==FNR{a[lc]++; next} !a[lc]++' stop_words random_text
wandered
lonely
cloud
That
floats
high
o'er
vales
and
hills
When
all
once
saw
crowd
host
golden
daffodils

관련 정보