给定一小组单词(为了具体起见,假设为 3 个),但更一般地说n,我想在文件中搜索其中两个单词彼此接近的情况。就接近而言,假设这两个单词最多k相距一个字符,其中k是某个常数。
理由:我正在我的收件箱 ( ) 中查找/var/spool/mail/username带有特定关键字的特定电子邮件。我不确定这些关键词是如何出现的。不过有一个词是比较常见的。两个词靠得很近的情况不太常见。
一个具体的激励例子:
“铝”、“行李”、“存储”。
在本例中,我正在搜索有关行李箱的电子邮件。
n就和而言,解决方案k将是最好的。
有关如何将其应用于多个文件的一些指示会很有帮助。
我不在乎解决方案使用什么语言。
从像https://linux.die.net/man/1/hunspell这样的词干工具开始 ,然后使用正则表达式 https://linux.die.net/man/1/grep 然后使用 wc sort 和 unique 按接近程度进行排序这些话是。
伪bash;
WORDS=$1
HAYSTACK=/var/mail
STEMS=$(hunspell --stem $WORDS)
REGEX=$(echo $STEMS | perl -pe 's/ /.*/g')
while read MATCH ; do
FILE=$(echo $MATCH | cut -d : 1)
COUNT=$(echo $MATCH | cut -d : 2 | perl -pe 's/.*('"$REGEXX"').*/$1/g' | wc -c)
echo $COUNT\t$FILE
done < <(grep -rP "$REGEX" $HAYSTACK) | \
sort -nr
Run Code Online (Sandbox Code Playgroud)
如果你想要更快,你可以使用 https://linux.die.net/man/1/locate 和正则表达式来限制单词之间的空间
a.{1,50}b
Run Code Online (Sandbox Code Playgroud)