如何在Python中获得字符串与另一个字符串类似的概率?
我想获得像0.9(意味着90%)等十进制值.最好使用标准的Python和库.
例如
similar("Apple","Appel") #would have a high prob.
similar("Apple","Mango") #would have a lower prob.
Run Code Online (Sandbox Code Playgroud) 我想找到两个字符串之间的字符串相似性.此页面包含其中一些示例.Python有Levenshtein算法的实现.在这些约束下,是否有更好的算法(并且希望是python库).
除了Levenshtein距离(或Levenshtein比率)以外的其他东西对我的情况更好吗?
我需要一种算法,可以比较两个文本文件并突出显示它们的差异(甚至更好!)可以以有意义的方式计算它们的差异(比如两个相似的文件应该具有高于两个不同文件的相似性得分,单词"相似"以正常术语定义).它听起来很容易实现,但事实并非如此.
实现可以在c#或python中.
谢谢.
我正在寻找一种算法,或者至少是关于如何在两个或多个不同的字符串中找到类似文本的操作理论......
就像这里提出的问题一样:查找具有相似文本的文章的算法,区别在于我的文本字符串只会是少数单词.
就像说我有一个字符串:"进入清澈的蓝天",我正在与以下两个字符串进行比较:"颜色是天蓝色"和"在蓝色的晴空中"
我正在寻找一种可用于匹配两者中文本的算法,并决定它们的匹配程度.在我的情况下,拼写和标点符号将是重要的.我不希望它们影响发现真实文本的能力.在上面的例子中,如果颜色参考被存储为"'天蓝色'",我希望它仍然能够匹配.但是,列出的第3个字符串应该比第二个字符串更好,等等.
我敢肯定谷歌这样的地方可能会使用类似于"你是不是的意思:"的功能......
*编辑*
在与朋友交谈时,他与一位撰写有关此主题的论文的人合作.我想我可能会与阅读此内容的所有人分享,因为其中描述了一些非常好的方法和流程......
编辑:此代码已作为基本模块处理和发布:https://github.com/hyperreality/Poetry-Tools
我是一名语言学家,他最近选择了python,我正在开展一个项目,希望自动分析诗歌,包括检测诗歌的形式.即如果它找到一个带有0101010101应力模式的10音节线,它会声明它是抑扬格五音阶.一首5-7-5音节模式的诗将是ha句.
我正在使用以下代码,一个更大的脚本的一部分,但我有许多问题,列在程序下面:
脚本中的语料库只是诗歌的原始文本输入.
import sys, getopt, nltk, re, string
from nltk.tokenize import RegexpTokenizer
from nltk.util import bigrams, trigrams
from nltk.corpus import cmudict
from curses.ascii import isdigit
...
def cmuform():
tokens = [word for sent in nltk.sent_tokenize(corpus) for word in nltk.word_tokenize(sent)]
d = cmudict.dict()
text = nltk.Text(tokens)
words = [w.lower() for w in text]
regexp = "[A-Za-z]+"
exp = re.compile(regexp)
def nsyl(word):
lowercase = word.lower()
if lowercase not in d:
return 0
else:
first = [' '.join([str(c) …
Run Code Online (Sandbox Code Playgroud) 假设我有2个字符串
AAABBBCCCCC
Run Code Online (Sandbox Code Playgroud)
和
AAAABBBBCCCC
Run Code Online (Sandbox Code Playgroud)
鉴于我只能删除我应该删除的字符,使这些字符串尽可能相似
这样他们就变成了
AAABBBCCCC
Run Code Online (Sandbox Code Playgroud)
找出从每个字符串中删除哪些字符的有效算法是什么?
我正在粉碎我的脑细胞,想着涉及弦的子串的溶解,在另一个弦中寻找它们.
考虑我有一个
string1 = "hello hi goodmorning evening [...]"
Run Code Online (Sandbox Code Playgroud)
我有一些小关键字
compare1 = "hello evening"
compare2 = "hello hi"
Run Code Online (Sandbox Code Playgroud)
我需要一个函数来返回文本和关键字之间的关联.例:
function(string1,compare1); // returns: 4
function(string1,compare2); // returns: 5 (more relevant)
Run Code Online (Sandbox Code Playgroud)
请注意,5和4仅作为示例.
你可以说 - 编写一个计算出现次数的函数 - 但是对于这个例子,这不起作用,因为它们都有2次出现,但是compare1的相关性较低,因为"你好晚上"并不是在string1中找到的(2个字你好和晚上是你好比你好更多)
有没有任何已知的算法来做到这一点?
ADD1:
在这种情况下,像编辑距离这样的算法是行不通的.因为string1是一个完整的文本(如300-400个单词),并且比较字符串最多为4-5个单词.
假设我有一个带有拼写错误和类似小变化的电影名单 -
"Pirates of the Caribbean: The Curse of the Black Pearl"
"Pirates of the carribean"
"Pirates of the Caribbean: Dead Man's Chest"
"Pirates of the Caribbean trilogy"
"Pirates of the Caribbean"
"Pirates Of The Carribean"
Run Code Online (Sandbox Code Playgroud)
如何组合或查找这样的单词集,最好使用python和/或redis?
是否有任何工具可以在Python中进行URL比较?
例如,如果我有http://google.com
,google.com/
我想知道他们可能是同一个网站.
如果我要手动构建一个规则,我可能会大写它,然后剥离该http://
部分,并删除最后一个字母数字字符后的任何内容..但我可以看到这个失败,因为我相信你也可以.
有没有这样做的图书馆?你会怎么做?
我需要将冷线索与我们客户的数据库相匹配.
这些销售线索来自第三方提供商(数千条记录),销售人员要求我们(用他们的话说)"过滤掉我们的客户",这样他们就不会试图将我们的服务卖给老牌客户.
显然,线索中存在拼写错误.Charles成为Charlie,Joseph成为Joe等等.所以我不能真正做一个过滤器,比较lead_first_name和client_first_name等.
我需要使用某种字符串相似性机制.
现在我正在使用可爱的difflib将引导的名字和姓氏与生成的列表进行比较Client.objects.all()
.它可以工作,但由于客户端的数量,它往往很慢.
我知道大多数sql数据库都有soundex和差异函数.在下面的更新中查看我对它的测试 - 它不像difflib那样有用.
还有其他解决方案吗?有更好的解决方案吗?
编辑:
至少在我的数据库中,Soundex的表现不如difflib.
这是一个简单的测试 - 在包含"Joseph Lopes"的表格中查找"Joe Lopes":
with temp (first_name, last_name) as (
select 'Joseph', 'Lopes'
union
select 'Joe', 'Satriani'
union
select 'CZ', 'Lopes'
union
select 'Blah', 'Lopes'
union
select 'Antonio', 'Lopes'
union
select 'Carlos', 'Lopes'
)
select first_name, last_name
from temp
where difference(first_name+' '+last_name, 'Joe Lopes') >= 3
order by difference(first_name+' '+last_name, 'Joe Lopes')
Run Code Online (Sandbox Code Playgroud)
以上返回"Joe Satriani"作为唯一的比赛.即使将相似度阈值降低到2也不会将"Joseph Lopes"作为潜在匹配.
但是difflib做得更好:
difflib.get_close_matches('Joe Lopes', ['Joseph Lopes', 'Joe Satriani', …
Run Code Online (Sandbox Code Playgroud)