2013-09-14 13 views
3

Итак, вот моя проблема. У меня очень большой файл csv, который имеет 3 столбца. Первый столбец - это уникальные идентификаторы. Второй столбец - это строка, которая является английским предложением. Третий столбец представляет собой цепочку словных тегов, которые описывают предложение во втором столбце (обычно 3 тега, максимум 5). Вот пример.Поиск совпадений слов

id | sentence      | tags 
1 | "people walk dogs in the park" | "pet park health" 
2 | "I am allergic to dogs"  | "allergies health" 

Что я хочу сделать, это найти все совпадения слов тега со словами в предложениях. Таким образом, желаемый результат для приведенного выше примера будет выглядеть примерно так.

("walk","pet"),1 
("health","dogs"),2 
("allergies","dogs"),1 
etc... 

где первая запись является слово пара (первый из предложения, второй тег слово), а затем количество раз, они сосуществуют.

Мне интересно, что лучший способ сделать это. Я думал, что, возможно, я мог бы придумать словарь python, где ключ - это тег-слово, а значение - это набор идентификаторов, где это слово тега появляется. Я мог бы сделать то же самое со всеми словами, которые появляются во всех предложениях (после удаления стоп-слов). Тогда я мог бы подсчитать количество идентификаторов в пересечении обоих множеств для каждой комбинации двух слов, которые дали бы мне количество раз, когда они будут происходить.

Однако, похоже, что это займет очень много времени (огромный файл csv!). У меня также может закончиться память. Может ли кто-нибудь подумать о лучшем способе сделать это. Может быть, импортировать файл в базу данных и запустить какой-то запрос?

ответ

6

Я думаю, что это легко с itertools.product() и collections.Counter():

import csv 
from itertools import product 
from collections import Counter 

rdr = csv.reader(open(r"data.csv"), quotechar='"',delimiter='|') 
c = Counter((x, y) for _, a, b in rdr for x, y in product(a.split(), b.split())) 

Что касается обработки большого файла, я думаю, вы можете попробовать какую-то карту-свертка - читать CSV построчно и сохранить все комбинации в другой файл :

with open(r"data.csv") as r, open(r"data1.csv", "w") as w: 
    rdr = csv.reader(r, quotechar='"', delimiter='|') 
    for _, a, b in rdr: 
     for x, y in product(a.split(), b.split()): 
      w.write("{},{}\n".format(x, y)) 

Следующий шаг должен был бы прочитать второй файл и создать счетчик:

with open(r"c:\temp\data1.csv") as r: 
    for l in r: 
     c[l.rstrip('\n')] += 1 

update Я начал видеть, есть ли какая-либо каркасная конструкция для Python. Вот первая ссылка googling - Disco map-reduce framework. На самом деле у него есть tutorial, который показывает, как создавать и запускать работу Дискотеки, которая учитывает слова - я думаю, что это может быть полезно для вас (по крайней мере, я пойду и попробую :)). И еще один - https://github.com/michaelfairley/mincemeatpy.

+0

Спасибо большое! Я попробую. Только один вопрос. Когда вы говорите о снижении карты, вы говорите об использовании нескольких кластеров? Потому что у меня нет доступа к этому. – user1893354

+0

@ user1893354 Я ни в коем случае не гуру больших кластеров, возможно, я не должен использовать слова map-reduce. Я имею в виду более ручную обработку. Если у вас недостаточно памяти для загрузки всех данных из файла, вы можете загружать их по строкам, сохранять кортежи в файл, а затем запускать другую программу для подсчета кортежей. Я думаю, что было бы полезно загрузить эти расщепленные данные в SQL и подсчитать частоты там (вы можете создавать индексы для ускорения процесса). –

+0

Вот что я подумал. Я просто хотел уточнить. Благодаря! – user1893354

Смежные вопросы