2016-12-07 7 views
0

У меня есть два больших файла csv. У главного есть поле как имя продукта, а в другом файле csv у меня есть несколько ключевых слов. Я ищу эти ключевые слова в имени продукта в первом CSV-файле. На данный момент мой код выглядит так:Как найти подстроки в строке в двух больших файлах csv (python)

class Keyword: 
    # keyword class for adding match keywords 
     def __init__(self): 
      self.data={} 
     def add(self, keyword, count): 
      if keyword in self.data.keys(): 
      self.data[keyword]+=count 
      else: 
      self.data[keyword]=count 
     def get_match(self): 
      temp = [] 
      for key, value in self.data.iteritems(): 
       temp.append(key) 
       temp.append(value) 
      return temp 

for i, product_row in product_df.iterrows(): 
    product_title = product_row['title'].lower().replace(',','') 
    k = Keyword() 
    for j, keyword_row in keyword_df.iterrows(): 
     if keyword_row['keyword'] in product_title: 
      k.add(keyword_row['keyword'], keyword_row['count']) 

    match_items = k.get_match() 
    if len(match_items)>0: 
     temp = product_row.tolist() 
     temp = [str(x).replace(',','') for x in temp] 
     temp.extend(match_items) 
     print>>sys.stdout, str(temp).strip('[]').replace("'",'') 
    else: 
     pass 

Этот код очень медленно и у меня есть многие из этих CSV файлов, которые должны получить сравнивать друг с другом. Вы знаете более эффективный способ сравнить эти файлы?

+0

исправить код вдавлено пожалуйста. –

+0

Вы считаете, сколько раз каждое ключевое слово * появляется * в поле имени продукта файла csv? – wwii

+0

Пожалуйста, покажите нам несколько строк из каждого файла. – wwii

ответ

0

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

with open("keywords.txt", "r") as f: 
    keywords = f.read().splitlines() 

with open("products.txt") as f: 
    for product_name in f: 
     if any(keyword in product_name for keyword in keywords): 
      print product_name 
+0

Спасибо, удивительно, что он становится намного быстрее. – Moohebat

0

Если ключевые слова действительно отдельные слова, а не многословные выражения, мое первое предложение, чтобы преобразовать название продукта в набор для более быстрого поиска в:

product_title = set(product_row['title'].lower().replace(',','').split()) 
+0

Проблема в том, что ключевые слова могут быть битрамом, триграммой и т. Д. Я хотел бы знать, для каких продуктов эти ключевые слова повторяются. – Moohebat

+0

Вы заботитесь о порядке слов в би-, три и т. Д. -граммах? Если нет, вы можете предварительно преобразовать ключевые слова в настройки, а также вычислить пересечение множеств с указанным набором слов: 'if keyword_row ['keyword'] & product_title:' – DyZ

+0

Да, их порядок важен. – Moohebat