如何提取两个字符串之间的相似性

如何提取两个字符串之间的相似性

我在两个不同的句子中有两个字符串:

字符串 1:30 mutation alanine for valine

字符串2:alanine at position 30

有没有办法找到它们之间的相似之处,因为很明显它们都有 30 和丙氨酸,例如使用正则表达式?

答案1

您可以做的一件事是检查两个字符串中出现的单词:

$ comm -12 <(sed 's/ /\n/g' <<<$str1 | sort) <(sed 's/ /\n/g' <<<$str2 | sort )
30
alanine

解释

  • 比较comm command文件。使用-1-2标志,它将打印在中找到的那些行两个都文件。

  • sed 's/ /\n/g' <<<$str1 | sort:这只是将 中的所有空格替换为换行符$str1,打印到标准输出,然后通过标准输出,sort因为comm需要对其输入文件进行排序。有关格式的更多信息<<<$var,请参见Bash:这里是字符串

  • <(command)格式称为进程替换,更多相关信息这里

上面命令的最终结果将是两个字符串中出现的所有单词的列表。

答案2

也许wdiff可以帮助你?将字符串放入两个文件中,然后将它们与wdiff

echo "30 mutation alanine for valine" > file1
echo "alanine at position 30" > file2
wdiff -t file1 file2

输出的屏幕截图:

输出的屏幕截图

答案3

我想不出使用普通正则表达式的方法,因为你所做的有点复杂。

用像这样的语言红宝石你可以分裂通过正则表达式 ( ) 将字符串转换为空格分隔的单词数组,\s+并得到路口&两个结果数组的( ) 。

"30 mutation alanine for valine".split( /\s+/ ) & "alanine at position 30".split( /\s+/ )
=> ["30", "alanine"]

空格实际上是 Ruby 中 split 的默认值,因此可以缩短为

"30 mutation alanine for valine".split & "alanine at position 30".split

答案4

这是一个awk解决方案:

$ awk '{for(i=1;i<=NF;i++){a[$i]++}}
    END {
        for(i in a) {
            if(a[i] > 1) {
                print i
            }
        }
    }' file1 file2
30
alanine

相关内容