0

我的问题有几个问题需要解决。我需要导入一个包含两个字段的 csv 文件(一个用作 ID 的数字字段,一个用作描述的字符串字段)。然后,将字符串字段转换为单个单词的集合(列表?元组?字典?)并搜索其他集合以计算匹配项。

例子:

id_field | desc_field
1        | some description
2        | some other description
3        | some third other description

我需要的是一个 id_field 匹配列表

id_field 1 has 2 matches in id_field 2
id_field 1 has 2 matches in id_field 3
id_field 2 has 3 matches in id_field 3

ETC

导入csv文件应该很容易使用:

import csv
reader = csv.reader(open('SOMEFILE.csv'), delimiter=',', quotechar='"'

我确信我可以使用 find 或 in 运算符来查找和计算单词,但是我在编写可以让我搜索 csv 字符串字段的代码时遇到了麻烦。

4

2 回答 2

0

这应该这样做:

import csv
reader = csv.reader(open('SOMEFILE.csv'), delimiter=',', quotechar='"')
data = [[line[0], line[1].split()] for line in reader]

for no1, words1 in data:
    for i in range(int(no1), len(data)):
        no2, words2 = data[i][0], data[i][1]
        matches = len(words1 + words2) - len(set(words1 + words2))
        print 'id_field', no1, 'has', matches, 'matches in id_field', no2

如果您对代码有任何问题或疑问,请告诉我。我假设您只想像在您的示例中那样检查前向,即当在 1 上检查与 2 和 3 的匹配时,在 2 上时只检查 3(如果有 3 行)。

如果您想排除零匹配的情况,您可以在打印之前添加以下行并缩进打印:

if matched > 0:
于 2013-10-04T19:19:03.857 回答
0
import csv  
import itertools
import re

id_2_desc = {}

with open('SOMEFILE.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter='|')

    for n, (id_field, desc_field) in enumerate(reader):
        if n > 0:
            id_2_desc[id_field.strip()] = desc_field.strip()


id_fields = id_2_desc.keys()


for id_field1, id_field2 in itertools.combinations(id_fields, 2):
    desc_field1 = id_2_desc[id_field1]
    desc_field2 = id_2_desc[id_field2]

    desc_tokens1 = re.split('\s+', desc_field1)
    desc_tokens2 = re.split('\s+', desc_field2)

    matches = set(desc_tokens1) & set(desc_tokens2)

    print 'id_field {} has {} matches in id_field {}'.format(id_field1, len(matches), id_field2)
于 2013-10-04T19:19:35.713 回答