返回文本之间关联的函数?

考虑我有一个
string1 = "hello hi goodmorning evening [...]"
我有一些小关键字
compare1 = "hello evening"
compare2 = "hello hi"
我需要一个函数来返回文本和关键字之间的关联。例:
function(string1,compare1);  // returns: 4
function(string1,compare2);  // returns: 5 (more relevant)
请注意,5和4仅作为示例。 你可以说 - 编写一个计算出现次数的函数 - 但是对于这个例子,这不起作用,因为它们都有2次出现,但是compare1的相关性较低,因为“你好晚上”并不完全在string1中找到(2个字你好和晚上是你好比你好更多) 有没有任何已知的算法来做到这一点? ADD1: 在这种情况下,像编辑距离这样的算法是行不通的。 因为string1是一个完整的文本(如300-400个单词),并且比较字符串最多为4-5个单词。     
已邀请:
一种动态编程算法 看起来你正在寻找的东西与Smith-Waterman算法的作用非常相似。 来自维基百科:   该算法最初由Temple F. Smith和Michael S. Waterman在1981年提出。与Needleman-Wunsch算法一样,Smith-Waterman是一种动态编程算法。因此,它具有所需的性质,即保证找到关于所使用的评分系统的最佳局部对齐(其包括替换矩阵和间隙评分方案)。 让我们看一个实际的例子,这样你就可以评估它的用处。 假设我们有一个文本:
text = "We the people of the United States, in order to form a more 
perfect union, establish justice, insure domestic tranquility, 
provide for the common defense, 

  promote the general welfare, 

  and secure the blessings of liberty to ourselves and our posterity, 
do ordain and establish this Constitution for the United States of 
America.";  
我隔离了我们要匹配的片段,只是为了方便阅读。 我们将亲和力(或相似性)与字符串列表进行比较:
list = {
   "the general welfare",
   "my personal welfare",
   "general utopian welfare",
   "the general",
   "promote welfare",
   "stackoverflow rulez"
   };  
我已经实现了算法,所以我将计算相似度并将结果标准化:
sw = SmithWatermanSimilarity[ text, #] & /@ list;
swN = (sw - Min[sw])/(Max[sw] - Min[sw])  
然后我们绘制结果: 我认为这与您的预期结果非常相似。 HTH! 一些实现(带源代码) Smith-Waterman CUDA源代码 (GSW) S-M算法解释道 (介绍) 一个交互式的逐步演示 小程序 Java源代码 Python源代码     
看一下从输入数据中创建N-gram然后匹配N-gram。我有一个解决方案,我将每个n-gram视为向量空间中的维度(在我的情况下变为4000维的空间)然后亲和力是两个向量之间角度的余弦(此处涉及点积) )。 困难的部分是提出一个以您想要的方式定义亲和力的指标。 另一种方法是根据compare_x数据中窗口中的单词数来查看滑动窗口和得分。最终得分是总和。     
py-editdist
将为您提供两个字符串之间的Levenshtein编辑距离,这是一个可能有用的指标。 请参阅:http://www.mindrot.org/projects/py-editdist/ 该页面的代码示例:
import editdist

# Calculate the edit distance between two strings
d = editdist.distance("abc", "bcdef")
相关:https://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy-string-comparison     
我认为这里有一个非常好的和完整的答案 http://answers.google.com/answers/threadview?id=337832 对不起它的谷歌答案!     
在这里,您可以找到用于计算字符串之间距离的度量标准列表,以及一个仅执行该操作的开源Java库。 http://en.wikipedia.org/wiki/String_metric 特别是,看看Smith-Waterman算法,记住他们所谓的“Alphabet”可以由我们称之为字符串的东西组成:所以,给定字母表
{A = "hello", B = "hi",C = "goodmorning",D = "evening"}
并调用d距离,你的函数试图计算
d(ABCD,AB) vs d(ABCD,AC)
    
那么,你可以计算比较文本片段的出现次数,即: “a-b-c” - >“a”,“b”,“c”,“a-b”,“b-c”,“a-b-c”(可能是“a-c”,如果你想要的话) 然后计算每个的出现次数,并将它们相加,可能具有(字符串长度)/(整个字符串的长度)的权重。 然后你只需要一种方法来制作这些作品,并对所有作品进行检查。     
虽然现在的Levenshtein距离可能不适合您的目的,但对它的修改可能是:尝试通过分别存储插入,删除和替换来实现它。 然后距离将是以下的总和: 所有替代品 每组连续插入/删除中的空格数减1: (在你的情况下:“hi goodmorning”仅计为两次编辑,'[...]'计为一次。) 当然,你必须对此进行测试,但如果它不能正常工作,请尝试简单地使用连续插入/删除的总和(因此,“早上好”只有1次编辑)。 编辑 P.S。:这假设Levenshtein的工作方式有一个相对较大的变化,你首先想要“对齐”你的数据(找出重要的(超过两个字符)重叠的位置并插入可以算作插入的'null'字符)。 此外,这只是一个未经考验的想法,因此欢迎任何改进的想法。     

要回复问题请先登录注册