查找列表中哪个字符串最接近字符

问题描述 投票:0回答:2

我有一个已解析为列表的pdf文档,例如:

listTxt = ['met een motor, losse delen van caravans, losse delen van ',
           'aanhangwagens die in uw woonhuis, schuur of garage op ',
           'hetzelfde adres staan tot maximaal € 1.250,-.',
           ' ',
           ' horen deze losse delen bij een bedrijf? Of zijn ze bedoeld ',
           'aanhangwagens die niet kapot zijn verzekerd',  '• Schade door grondwater dat onverwacht het woonhuis ',
           'binnenstroomt door afvoerleidingen en apparaten die daarop ',
           'zijn aangesloten.',
           '• Schade door water dat uit een aquarium stroomt als het ',
           'aquarium onverwacht kapot is gegaan. We betalen ook voor de ',
           'inhoud van het aquarium tot maximaal € 1.250,-.',
           '• Schade door water dat uit een waterbed stroomt. Maar alleen als ',
           'het waterbed onverwacht kapot is gegaan.']

现在,我想返回距离(距离)最近的欧元符号(€)的字符串。我看过各种算法,例如levenshtein距离等,但是我的任务实际上很简单,并且该距离可以仅仅是字符数。

带有条件的作品类:

for t in list:
    if 'aanhangwagens' and '€' in t:
        print(t)

结果:

hetzelfde adres staan tot maximaal € 1.250,-.
inhoud van het aquarium tot maximaal € 1.250,-.

但是我希望'aanhangwagens'中的listTxt [1]确实接近下一个文本listTxt [2](带有€),所以所需的输出是:

'aanhangwagens die in uw woonhuis, schuur of garage op ', 'hetzelfde adres staan tot maximaal € 1.250,-.'

对于水族馆短语,它可以正常工作,因为水族馆和€位于同一字符串中,即listTxt[11]

'hetzelfde adres staan tot maximaal € 1.250,-.'

python text-mining
2个回答
0
投票

根据您的定义,我写了一些寻找包含某些字符的短线的内容。首先,您需要计算两个列表“ resa”和“ rese”。他们告诉您列表中是否包含给定的字符串。例如,如果您在列表[“ abc”,“ ccd”,“ efg”,“ agf”]中查找“ a”,则结果列表将为[1,0,0,1]。您需要为“ aanhangwagens”和欧元符号计算这些值。使用这些列表,您可以检查欧元列表中的1与“ aanhangwagens”列表中的1之间的距离。

在您的示例中,搜索“ aanhangwagens”的结果为:[0,1,0,0,0,1,0,0,0,0,0,0,0,0]欧元给:[0,0,1,0,0,0,0,0,0,0,0,1,0,0]

我编写的算法保留最接近的字符串,但如果两个字符串的距离相同,它将把它们都放在结果列表中。请使用此代码之前,请运行一些测试,我不能保证您在任何情况下都可以使用。

resa=[]
rese=[]
for t in listTxt:
    if 'aanhangwagens' in t:
        resa.append(1)
    else:
        resa.append(0)
    if '€' in t:
        rese.append(1)
    else:
        rese.append(0)

def close_line(aliste, alista, alistTxt):
    all_closest_lines=[]
    for i in range(len(aliste)):
        if(aliste[i]==0):
            continue
        else:
            closest_line=[]
            amin=max(len(aliste), len(alista))
            for j in range(len(alista)):
                if(alista[j]==0):
                    continue
                else:
                    if(abs(i-j)<amin):
                        amin=abs(i-j)
                        closest_line=[]
                        closest_line.append([alistTxt[j], "Closest to € in position{}".format(i)])
                    elif(abs(i-j)==amin):
                        closest_line.append([alistTxt[j], "Closest to € in position{}".format(i)])
            all_closest_lines+=closest_line
    return(all_closest_lines)

print(close_line(rese, resa, listTxt))

结果:

[['aanhangwagens die in uw woonhuis, schuur of garage op ', 'Closest to € in position2'], ['aanhangwagens die niet kapot zijn verzekerd', 'Closest to € in position11']]

0
投票

您可以尝试为每个句子生成一个分数,然后找到与有用句子组相对应的分数组。然后,您将获得每个“比赛”的总分。我在下面做了一个粗略的实现。

import numpy as np


listTxt = ['met een motor, losse delen van caravans, losse delen van ',
           'aanhangwagens die in uw woonhuis, schuur of garage op ',
           'hetzelfde adres staan tot maximaal € 1.250,-.',
           ' ',
           ' horen deze losse delen bij een bedrijf? Of zijn ze bedoeld ',
           'aanhangwagens die niet kapot zijn verzekerd',  '• Schade door grondwater dat onverwacht het woonhuis ',
           'binnenstroomt door afvoerleidingen en apparaten die daarop ',
           'zijn aangesloten.',
           '• Schade door water dat uit een aquarium stroomt als het ',
           'aquarium onverwacht kapot is gegaan. We betalen ook voor de ',
           'inhoud van het aquarium tot maximaal € 1.250,-.',
           '• Schade door water dat uit een waterbed stroomt. Maar alleen als ',
           'het waterbed onverwacht kapot is gegaan.']

euro = np.array([string.count('€') for string in listTxt])
ahw = np.array([string.count('aanhangwagen') for string in listTxt])

all_values = np.add(euro,ahw)


score = []
matches = []
for i, value in enumerate(all_values):
    if value > 0:
        score.append(value)
        matches.append(listTxt[i])
    elif score:
        print(sum(score), matches)
        score = []
        matches = []

它计算在每个句子中找到“€”或“ aanhangwagen”的次数,然后对结果求和。然后进行一个小循环,以找到零之间的“关闭”值组。

通过这种方式,您可以对不同(句子组)句子进行排名,并在它们旁边获得关于这些句子中搜索词的搜索次数的分数。

在这种情况下,结果是:

2 ['aanhangwagens die in uw woonhuis, schuur of garage op ', 'hetzelfde adres staan tot maximaal € 1.250,-.']
1 ['aanhangwagens die niet kapot zijn verzekerd']
1 ['inhoud van het aquarium tot maximaal € 1.250,-.']

您想要的是什么!

© www.soinside.com 2019 - 2024. All rights reserved.