在多个文档中搜索常用词

在多个文档中搜索常用词

我有一首歌的歌词。(.txt)

我还有其他 50 首歌曲的歌词。

我正在寻找一种方法来分析/搜索这 50 首歌曲的歌词以及第一首歌的歌词,并找出这 50 首歌词中哪一首与第一首歌最相似(基于共享的单词/词汇)。

我很抱歉用外行人的口吻说话——这不是我的知识领域!

任何帮助或指点都将不胜感激

答案1

这是我的解决方案,我假设您只关心匹配的单词数,而不是匹配的次数(例如,两首歌曲中出现 5 次的“Baby”值 5 倍的“分值”)。

第一的:

cat songname.txt | sed ':a;N;$!ba;s/\n/ /g' | tr -cd '[[:alnum:]]\ ' | sed 's#\ \ #\ #g' | sed 's#\ #\n#g' | sort | uniq -i > songnamewords.txt

这会将所有换行符转换为空格,删除所有非字母数字字符(逗号),删除所有双空格,将每个单词放在单独的行上,对它们进行排序并删除重复的行。

您需要对所有想要比较的歌曲执行此操作,然后:

cat songname1words.txt songname2words.txt | sort | uniq -d | wc -l

这将为您提供匹配的单词数。

我尝试了几个例子:

魔力红 (Maroon 5) 乐队的 Animals 和贾斯汀·比伯的 Baby 有 29 个词是相同的。

Maroon 5 乐队的 Animals 和 Opeth 乐队的 Grand Conjuration 有 10 个词是相同的。

这些都是您所期望的结果。

另外,您可以将其与所有其他歌词文件进行比较:

a="songname1words.txt" && for f in *; do if [[ "$f" != "$a" ]]; then printf $(cat "$a" "$f" | sort | uniq -d | wc -l) && echo " - $f" | sort; fi; done

其中“songname1words.txt”是您想要与之进行比较的文件名。

这会将所有其他文本文件与此文件进行比较,跳过与自身之间的比较,然后按分数对它们进行排序,以便将匹配数为 1 的文件放在最顶部。

它给出如下输出:

29 - 比伯词.txt

10-opethwords.txt

相关内容