使用停用词文件过滤单词列表

使用停用词文件过滤单词列表

因此,我有一个包含随机文本的文本文件,我需要列出该文件中存在的所有单词,但过滤我的停用词文件中常见的所有单词。我可以使用什么命令来实现此目的?

答案1

假设“单词”是一个被空格包围的字符串,您可以将所有空格更改为换行符,对结果进行排序并删除重复项。然后只需从该列表中删除停用词即可。

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

tr命令将所有类似空格的字符更改为换行符,并将多个连续的换行符压缩为一个。然后对每行一个单词的列表进行排序,并删除重复的单词(忽略带 的大小写-f)。

您还可以尝试'[:space:][:punct:]'作为第一个参数,tr将文本拆分为类似空格的字符和标点符号上的单词,或者使用明确的字符列表,例如' ,.!?'.

然后将排序后的唯一单词列表与stopwords(包含每行一个停止词的行的文件;更改为您拥有的任何文件)中的单词进行比较,并且保留该列表中不匹配的单词。

-F强制实用程序grep将模式视为字符串而不是作为正则表达式。该-i选项使其使用不区分大小写的匹配。该-x选项让我们只接受全行匹配(而不是子字符串匹配)。该-v选项反转了通常的匹配含义,因此线不是匹配被保留,并从指定文件中读取模式-fgrep

答案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

由于您没有提供任何示例输入/输出,因此做出了一系列假设 - 使用 GNU awk 进行多字符 RS:

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

相关内容