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”只算作两次编辑,“[…]”算作一次编辑。)
此外,这只是一个未经测试的想法,因此欢迎提出任何改进意见。我认为这个问题有一个非常好的完整答案 抱歉,这是谷歌的答案 一种动态规划算法 看起来你要找的东西和他们的非常相似 来自维基百科: 该算法由坦普尔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])
我认为这与你的预期结果非常相似
嗯
一些实现(带源代码)