2016-10-21 5 views
3

Поэтому у меня есть список строк, как показано ниже:Python - Перебрать список строк и групп частичных соответствия строк

list = ["I love cat", "I love dog", "I love fish", "I hate banana", "I hate apple", "I hate orange"] 

Как итерация по списку и группа частично совпадающие строки без заданных ключевых слов. Результат должен выглядеть следующим образом:

list 1 = [["I love cat","I love dog","I love fish"],["I hate banana","I hate apple","I hate orange"]] 

Огромное спасибо.

+0

Что вы уже пробовали? Некоторые стартовый код, чтобы другие знали, что вы уже делали, и где вы застряли, полезно при разработке ответов. – TheF1rstPancake

+0

['itertools groupby'] (https://docs.python.org/2/library/itertools.html#itertools.groupby) будет полезен для этого. – RoadRunner

+0

Как вы определяете частичное совпадение? – wwii

ответ

0

Избегайте слов, таких как list, именовать переменные. Также list 1 не является допустимой переменной python.

Попробуйте это:

import sys 
from itertools import groupby 

#Assuming you group by the first two words in each string, e.g. 'I love', 'I hate'. 

L = ["I love cat", "I love dog", "I love fish", "I hate banana", "I hate apple", "I hate orange"] 

L = sorted(L) 

result = [] 

for key,group in groupby(L, lambda x: x.split(' ')[0] + ' ' + x.split(' ')[1]): 
    result.append(list(group)) 

print(result) 
+2

'' 'sorted''' возвращает значение, но вы его не присваиваете. Возможно, вместо этого используйте list.sort() для сортировки на месте. – wwii

0

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

from itertools import groupby 

my_list = ["I love cat","I love dog","I love fish","I hate banana","I hate apple","I hate orange"]; 

each_word = sorted([x.split() for x in my_list]) 

# I assumed the keywords would be everything except the last word 
grouped = [list(value) for key, value in groupby(each_word, lambda x: x[:-1])] 

result = [] 
for group in grouped: 
    temp = [] 
    for i in range(len(group)): 
     temp.append(" ".join(group[i])) 
    result.append(temp) 

print(result) 

Выход:

[['I hate apple', 'I hate banana', 'I hate orange'], ['I love cat', 'I love dog', 'I love fish']] 
+0

Возможно, вы должны убедиться, что итерабельность сортируется перед использованием itertools.groupby(). – wwii

+0

Да, это правда @wwii. Спасибо за предложение, я это исправлю.Я также понял, что половина кода не нужна, и ее можно улучшить. – RoadRunner

+0

Кроме того, что вы считаете частичным матчем? – RoadRunner

3

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

index = {} 
for sentence in sentence_list: 
    for word in set(sentence.split()): 
     index.setdefault(word, set()).add(sentence) 

Или этот подход, клавиши со индексной всеми возможными полными словами фразы префиксами:

index = {} 
for sentence in sentence_list: 
    number_of_words = length(sentence.split()) 
    for i in xrange(1, number_of_words): 
     key_phrase = sentence.rsplit(maxsplit=i)[0] 
     index.setdefault(key_phrase, set()).add(sentence) 

И затем, если вы хотите, чтобы найти все предложения, которые содержат ключевое слово (или начать с фразой, если это ваш индекс):

match_sentences = index[key_term] 

или данный набор ключевых слов:

matching_sentences = reduce(list_of_keywords[1:], lambda x, y: x & index[y], initializer = index[list_of_keywords[0]]) 

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

return [list(index[k]) for k in index if len(k.split()) == 2] 
1

Последовательность согласования будет делать задачу для вас. Настройте коэффициент оценки для получения лучших результатов.

Попробуйте это:

from difflib import SequenceMatcher 
sentence_list = ["I love cat", "I love dog", "I love fish", "I hate banana", "I hate apple", "I hate orange"] 
result=[] 
for sentence in sentence_list: 
    if(len(result)==0): 
     result.append([sentence]) 
    else: 
     for i in range(0,len(result)): 
      score=SequenceMatcher(None,sentence,result[i][0]).ratio() 
      if(score<0.5): 
       if(i==len(result)-1): 
        result.append([sentence]) 
      else: 
       if(score != 1): 
        result[i].append(sentence) 

Выход:

[['I love cat', 'I love dog', 'I love fish'], ['I hate banana', 'I hate apple', 'I hate orange']]