首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >合并类似的Strings Python

合并类似的Strings Python
EN

Stack Overflow用户
提问于 2018-09-17 13:09:31
回答 2查看 2.2K关注 0票数 2

我有两根绳子

代码语言:javascript
运行
复制
string1 = "apple banna kiwi mango"
string2 = "aple banana mango lemon"

我希望这两个字符串的加法结果(而不是连接),即结果应该类似于

代码语言:javascript
运行
复制
result = "apple banana kiwi mango lemon"

我目前的做法相当简单。

  1. 标记多行字符串(上述字符串在标记化之后),删除任何噪声(特殊/换行符/空字符串)
  2. 下一步是识别字符串的余弦相似性,如果它高于0.9,则将其中一个字符串添加到最终结果中。

现在,问题就在这里。它不包括一个字符串包含一个单词的一半,另一个字符串包含另一半(在某些情况下是正确的单词)的部分。我还在脚本中添加了this函数。但问题依然存在。任何关于如何在这方面取得进展的帮助都是非常感谢的。

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-17 13:36:35

困难的部分是检查这个单词是否是一个有效的英语单词。

要做到这一点,要么需要有一本字典来检查这个单词,要么使用nltk。

代码语言:javascript
运行
复制
     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'}

若要捕获数字,如果存在,请添加is位数()。

代码语言:javascript
运行
复制
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这样的缩写,mg添加re.match()。

代码语言:javascript
运行
复制
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'}
票数 4
EN

Stack Overflow用户

发布于 2018-09-17 13:19:00

你听说过莱文的距离吗?我建议采用以下算法:

  1. 将列表拆分为元素( Split 1拆分(“"))
  2. 循环通过list(string1)。在它内部循环通过list(string2),如果Levenshtein对这两个元素的距离小于3,则将元素推到结果数组。
  3. 返回result

for i in list(string1): for k in list(string2): if levenshtein(i,k) < 3: res.append(i)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52368556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档