我想做模糊字符串比较,但与使用哪个库混淆.
选项1:
import Levenshtein
Levenshtein.ratio('hello world', 'hello')
Result: 0.625
Run Code Online (Sandbox Code Playgroud)
选项2:
import difflib
difflib.SequenceMatcher(None, 'hello world', 'hello').ratio()
Result: 0.625
Run Code Online (Sandbox Code Playgroud)
在这个例子中,两者给出了相同的答案.但我更喜欢使用__CODE__.专家的任何建议.谢谢.
__CODE__
我正在进行临床信息规范化(拼写检查),其中我检查每个给定的单词对900,000字的医学词典.我更关注时间复杂度/性能.
在这种情况下,你认为两者都表现相似吗?
在python中是否存在一种"开箱即用"的方式来生成两个文本之间的差异列表,然后将此差异应用于一个文件以获取另一个文件,以后再进行?
我想保留文本的修订历史记录,但如果只有一个编辑的行,我不想保存每个修订版的整个文本.我查看了difflib,但是我看不到如何生成仅包含已编辑行的列表,这些行仍可用于修改一个文本以获取另一个文本.
import difflib
a='abcd'
b='ab123'
seq=difflib.SequenceMatcher(a=a.lower(),b=b.lower())
seq=difflib.SequenceMatcher(a,b)
d=seq.ratio()*100
print d
Run Code Online (Sandbox Code Playgroud)
我使用上面的代码,但获得的输出是0.0.我怎样才能得到有效答案?
我试图比较两个文本文件并输出比较文件中的第一个字符串,该字符串不匹配但由于我是python的新手而遇到困难.有人可以给我一个使用这个模块的示例方法.
当我尝试这样的事情:
result = difflib.SequenceMatcher(None, testFile, comparisonFile)
Run Code Online (Sandbox Code Playgroud)
我收到一个错误,说'file'类型的对象没有len.
我正在尝试使用difflib为包含推文的两个文本文件生成diff.这是代码:
#!/usr/bin/env python
# difflib_test
import difflib
file1 = open('/home/saad/Code/test/new_tweets', 'r')
file2 = open('/home/saad/PTITVProgs', 'r')
diff = difflib.context_diff(file1.readlines(), file2.readlines())
delta = ''.join(diff)
print delta
Run Code Online (Sandbox Code Playgroud)
这是PTITVProgs文本文件:
Watch PTI on April 6th (7) Dr Israr Shah at 10PM on Business Plus in "Talking Policy". Rgds #PTI
CORRECTION!! Watch PTI on April 6th (5) @Asad_Umar at 8PM on ARY News. Rgds #PTI
Watch PTI on April 6th (5) @Asad_Umar at 8PM on AAJ News (6) PTI vs PMLN at 8PM on …Run Code Online (Sandbox Code Playgroud) 我有一个句子列表,如:
errList = [ 'Ragu ate lunch but didnt have Water for drinks',
'Rams ate lunch but didnt have Gatorade for drinks',
'Saya ate lunch but didnt have :water for drinks',
'Raghu ate lunch but didnt have water for drinks',
'Hanu ate lunch but didnt have -water for drinks',
'Wayu ate lunch but didnt have water for drinks',
'Viru ate lunch but didnt have .water 4or drinks',
'kk ate lunch & icecream but did have Water for drinks',
'M ate …Run Code Online (Sandbox Code Playgroud) 使用Python,我想将两个字符串之间的差异输出为统一的diff(-u),同时可选地忽略空行(-B)和空格(-w).
由于字符串是在内部生成的,我宁愿不处理将一个或两个字符串写入文件,运行GNU diff,修复输出,最后清理的细微差别.
虽然difflib.unified_diff生成统一的差异,但似乎不允许我调整空格和空行的处理方式.我看过它的实现,我怀疑,唯一的解决方案是复制/破解该函数的主体.
有更好的吗?
目前我正在使用以下内容剥离填充字符:
import difflib
import re
import sys
l = "line 1\nline 2\nline 3\n"
r = "\nline 1\n\nline 2\nline3\n"
strip_spaces = True
strip_blank_lines = True
if strip_spaces:
l = re.sub(r"[ \t]+", r"", l)
r = re.sub(r"[ \t]+", r"", r)
if strip_blank_lines:
l = re.sub(r"^\n", r"", re.sub(r"\n+", r"\n", l))
r = re.sub(r"^\n", r"", re.sub(r"\n+", r"\n", r))
# run diff
diff = difflib.unified_diff(l.splitlines(keepends=True), r.splitlines(keepends=True))
sys.stdout.writelines(list(diff))
Run Code Online (Sandbox Code Playgroud)
当然,这会导致输出为除原始输入之外的其他东西的差异.例如,将上面的文本传递给GNU diff 3.3作为"diff -u -w"运行,"line 3"作为上下文的一部分显示,上面将显示"line3".
我正在使用difflib python包.无论我是否设置isjunk参数,计算的比率都是相同的.是不是当忽略空间的区别isjunk是lambda x: x == " "?
In [193]: difflib.SequenceMatcher(isjunk=lambda x: x == " ", a="a b c", b="a bc").ratio()
Out[193]: 0.8888888888888888
In [194]: difflib.SequenceMatcher(a="a b c", b="a bc").ratio()
Out[194]: 0.8888888888888888
Run Code Online (Sandbox Code Playgroud) 我想使用类似difflib.get_close_matches但不是最相似的字符串,我想获取索引(即列表中的位置)。
列表的索引更加灵活,因为可以将索引与其他数据结构(与匹配的字符串相关)相关联。
例如,而不是:
>>> words = ['hello', 'Hallo', 'hi', 'house', 'key', 'screen', 'hallo', 'question', 'format']
>>> difflib.get_close_matches('Hello', words)
['hello', 'hallo', 'Hallo']
Run Code Online (Sandbox Code Playgroud)
我想:
>>> difflib.get_close_matches('Hello', words)
[0, 1, 6]
Run Code Online (Sandbox Code Playgroud)
似乎不存在获取此结果的参数,是否有替代方法可以difflib.get_close_matches()返回索引?
我知道我可以使用difflib.SequenceMatcher, 然后将字符串与ratio(或quick_ratio)进行一对一比较。但是,我担心这会非常低效,因为:
我将不得不创建数千个 SequenceMatcher 对象并比较它们(我希望get_close_matches避免使用该类):
编辑:错误。我检查了 的源代码get_close_matches,它实际上使用SequenceMatcher.
没有截止(我猜有一种优化可以避免计算所有字符串的比率)
编辑:部分错误。该代码是get_close_matches没有任何重大的优化,除了它使用real_quick_ratio,quick_ratio而ratio产品总数。无论如何,我可以轻松地将优化复制到我自己的函数中。我也没有考虑到 SequenceMatcher 有设置序列的方法:set_seq1, set_seq2,所以至少我不必每次都创建一个对象。
据我了解,所有 python 库都是 C 编译的,这会提高性能。 …
如何告诉difflib.get_close_matches()忽略大小写?我有一个字典,其中包含一个包含大小写的定义格式.但是,测试字符串可能具有完全大小写或没有大小写,这些应该是等效的.但是,结果需要适当地大写,因此我不能使用修改后的字典.
import difflib
names = ['Acacia koa A.Gray var. latifolia (Benth.) H.St.John',
'Acacia koa A.Gray var. waianaeensis H.St.John',
'Acacia koaia Hillebr.',
'Acacia kochii W.Fitzg. ex Ewart & Jean White',
'Acacia kochii W.Fitzg.']
s = 'Acacia kochi W.Fitzg.'
# base case: proper capitalisation
print(difflib.get_close_matches(s,names,1,0.9))
# this should be equivalent from the perspective of my program
print(difflib.get_close_matches(s.upper(),names,1,0.9))
# this won't work because of the dictionary formatting
print(difflib.get_close_matches(s.upper().capitalize(),names,1,0.9))
Run Code Online (Sandbox Code Playgroud)
输出:
['Acacia kochii W.Fitzg.']
[]
[]
Run Code Online (Sandbox Code Playgroud)
工作代码:
根据Hugh Bothwell的回答,我修改了如下代码以获得一个有效的解决方案(当返回多个结果时,它也应该有效):
import difflib
names = ['Acacia koa …Run Code Online (Sandbox Code Playgroud) difflib ×10
python ×10
string ×2
diff ×1
nltk ×1
python-3.x ×1
revision ×1
scikit-learn ×1
similarity ×1
text ×1