Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 返回文本之间亲缘关系的函数?_Algorithm_Text_Full Text Search_Relevance - Fatal编程技术网

Algorithm 返回文本之间亲缘关系的函数?

Algorithm 返回文本之间亲缘关系的函数?,algorithm,text,full-text-search,relevance,Algorithm,Text,Full Text Search,Relevance,考虑到我有一个 string1 = "hello hi goodmorning evening [...]" 我有一些次要的关键词 compare1 = "hello evening" compare2 = "hello hi" 我需要一个函数,返回文本和关键字之间的相关性。例如: function(string1,compare1); // returns: 4 function(string1,compare2); // returns: 5 (more relevant) 请注意

考虑到我有一个

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的相关性较小,因为“hello Night”不完全在string1中找到(hello和Night这两个词比hello hi更遥远)

有没有已知的算法可以做到这一点

地址1:

像“编辑距离”这样的算法在这种情况下不起作用。
因为string1是一个完整的文本(比如300-400个单词),而比较字符串最多为4-5个单词。

py editdist
将给出两个字符串之间的长度,这是一个可能有用的度量

见:

该页面中的代码示例:

import editdist

# Calculate the edit distance between two strings
d = editdist.distance("abc", "bcdef")

相关:

看看如何从输入数据中创建N-gram,然后在N-gram上进行匹配。我有一个解决方案,其中我将每个n-gram视为向量空间中的一个维度(在我的例子中,它变成了4000维的空间),然后亲和性是两个向量之间角度的余弦(这里涉及点积)

困难的部分是以您想要的方式提出定义亲和性的度量


另一种方法是查看滑动窗口,并根据窗口中的compare_x数据中的单词数进行评分。最后的分数是总和。

在这里,您可以找到一个用于计算字符串之间距离的指标列表,以及一个用于计算字符串之间距离的开源java库。 特别是,看看Smith–Waterman算法,记住他们所谓的“字母表”可以由我们称之为字符串的东西组成:因此,给定字母表

{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”)

然后计算每个字符串的出现次数,并求和,可能的权重为(字符串长度)/(整个字符串的长度)

然后,您只需要找到一种方法来生成这些片段,并对所有片段进行检查。

虽然现有的片段可能不适合您的目的,但可以对其进行修改:尝试通过分别存储插入、删除和替换来实现它

然后,距离将是以下各项的总和:

  • 所有替代品
  • 每组连续插入/删除中的空格数减去一:
    • (在您的例子中,“hi Goodworning”只算作两次编辑,“[…]”算作一次编辑。)
当然,您必须对此进行测试,但是如果它不起作用,请尝试简单地使用连续插入/删除的总和(因此,“hi good morning”仅为1次编辑)

编辑

注意:这假设Levenshtein的工作方式发生了相对较大的变化,您希望首先“对齐”数据(找出有明显重叠(两个以上字符)的地方,并插入“空”字符,这将被视为插入)


此外,这只是一个未经测试的想法,因此欢迎提出任何改进意见。

我认为这个问题有一个非常好的完整答案

抱歉,这是谷歌的答案

一种动态规划算法 看起来你要找的东西和他们的非常相似

来自维基百科:

该算法由坦普尔F.史密斯和迈克尔S.沃特曼于1981年首次提出。和算法一样,史密斯·沃特曼也是一个变种。因此,它具有期望的特性,即保证找到关于所使用的评分系统(包括替换矩阵和差距评分方案)的最佳局部对齐

让我们看一个实际的例子,这样您可以评估它的有用性

假设我们有一个文本:

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])  
然后我们绘制结果:

sw = SmithWatermanSimilarity[ text, #] & /@ list;
swN = (sw - Min[sw])/(Max[sw] - Min[sw])  

我认为这与你的预期结果非常相似

一些实现(带源代码)


您是在寻找简单的字符串编辑距离比较还是完全语义对等?e、 猫和猫更相似吗?两者都不相似。。我需要像计数发生次数+根据单词距离给出权重这样的东西(正如我之前解释的:string1是一篇有300-400个单词的文章,比较字符串只有3-4个单词)你的关键字总是成对出现吗?更重要的是,有更多的匹配词或更好的接近度。不总是成对的,比较字符串最多可以是5-6个单词2。50%-50%Hm即使很有趣,我也不认为你可以使用这个滑动窗口,因为你不能选择alyawys在我看来适用的winodws尺寸。我的想法更像这样:首先只计算occorunces,然后根据找到的键之间的字符数删除一些点。但我不敢相信,这项工作还没有一个已知的算法。。。它在搜索相关的东西中非常重要。使用ngrams注册其他解决方案我不清楚如何创建它没有明确的解决方案,因为不同的目的需要不同的指标。你为什么这么说?我很确定其他人已经为此编写了算法(我不认为这太难),我在这里找到了问题的一些数学解决方案:在第31页,有一个解决方案“对于查询的每个项t,q={t1,…,tn},我们计算一个累加器acc,它包含当前元素中t的接近度分数