![在多个文档中搜索常用词](https://linux22.com/image/1427807/%E5%9C%A8%E5%A4%9A%E4%B8%AA%E6%96%87%E6%A1%A3%E4%B8%AD%E6%90%9C%E7%B4%A2%E5%B8%B8%E7%94%A8%E8%AF%8D.png)
我有一首歌的歌词。(.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