0

私の質問には、対処すべきいくつかの問題があります。2 つのフィールド (ID として使用される数値フィールドと説明として使用される文字列フィールド) を含む csv ファイルをインポートする必要があります。次に、文字列フィールドを個々の単語のセット (list? tuple? dict?) に変換し、他のセットを検索して一致をカウントします。

例:

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

ファイルのインポートは、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 に答える