我有两个琴弦
string1 = "apple banna kiwi mango"
string2 = "aple banana mango lemon"
我希望将这两个字符串相加(而不是串联),即结果应该像这样
result = "apple banana kiwi mango lemon"
我目前的方法很简单。
现在,这是问题所在。它不涵盖其中一个字符串包含一个单词的一半而另一字符串包含单词的另一半(在某些情况下为正确的单词)的部分。我还在脚本中添加了this函数。但是问题仍然存在。我们对在此方面取得进展的任何帮助表示赞赏。
def text_to_vector(text):
words = WORD.findall(text)
return Counter(words)
def get_cosine(vec1, vec2):
intersection = set(vec1.keys()) & set(vec2.keys())
numerator = sum([vec1[x] * vec2[x] for x in intersection])
sum1 = sum([vec1[x]**2 for x in vec1.keys()])
sum2 = sum([vec2[x]**2 for x in vec2.keys()])
denominator = math.sqrt(sum1) * math.sqrt(sum2)
if not denominator:
return 0.0
else:
return float(numerator) / denominator
def merge_string(string1, string2):
i = 0
while not string2.startswith(string1[i:]):
i += 1
sFinal = string1[:i] + string2
return sFinal
for item in c:
for j in d:
vec1 = text_to_vector(item)
vec2 = text_to_vector(j)
r = get_cosine(vec1, vec2)
if r > 0.5:
if r > 0.85:
final.append(item)
break
else:
sFinal = merge_string(item, j)
#print("1.", len(sFinal), len(item), len(j))
if len(sFinal) >= len(item) + len(j) -8:
sFinal = merge_string(j, item)
final.append(sFinal)
#print("2.", len(sFinal), len(item), len(j))
temp.append([item, j])
break
答案 0 :(得分:3)
困难的部分是检查单词是否为有效的英语单词。
为此,您必须拥有字典来对照该单词,或使用 nltk。
pip install nltk
from nltk.corpus import wordnet
set([w for w in (string1 + string2).split() if wordnet.synsets(w)])
Out[41]: {'apple', 'banana', 'kiwi', 'lemon', 'mango'}
要捕获数字(如果存在),请添加isdigit()。
st1 = 'Includes Og Added Sugars'
st2 = 'Includes 09 Added Sugars 09'
set([w for w in (st1 + st2).split() if (wordnet.synsets(w) or w.isdigit())])
Out[30]: {'09', 'Added', 'Includes', 'Sugars'}
要捕获g等缩写,请添加re.match()。
set([w for w in (st1 + st2).split() if (wordnet.synsets(w) or w.isdigit() or re.match(r'\d+g|mg',w))])
Out[40]: {'09', '0g', 'Added', 'Includes', 'Sugars'}
答案 1 :(得分:1)
您是否听说过Levenshtein的距离?我建议使用以下算法:
将列表拆分为元素(string1.split(“”))
通过list(string1)
循环。在其内部遍历list(string2)
,如果说两个元素的Levenshtein距离小于3,则将该元素推入结果数组。
返回result
。
for i in list(string1):
for k in list(string2):
if levenshtein(i,k) < 3:
res.append(i)