2013-11-07 2 views
3

Скажем, у меня есть параграф. Я отделяю это в предложения по sent_tokenize:Как найти, какие предложения имеют больше всего общего?

variable = ['By the 1870s the scientific community and much of the general public had accepted evolution as a fact.', 
    'However, many favoured competing explanations and it was not until the emergence of the modern evolutionary synthesis from the 1930s to the 1950s that a broad consensus developed in which natural selection was the basic mechanism of evolution.', 
    'Darwin published his theory of evolution with compelling evidence in his 1859 book On the Origin of Species, overcoming scientific rejection of earlier concepts of transmutation of species.'] 

Теперь я разделить каждое предложение на слова и добавить его в какой-либо переменной. Как я могу найти две группы предложений, которые имеют наибольшее число одинаковых слов. Я не знаю, как это сделать. Если у меня 10 предложений, тогда у меня будет 90 проверок (между каждым предложением.) Спасибо.

+0

Это на самом деле 45 проверок, а не 90. Вы делите на 2, так как порядок не имеет значения. – alexis

ответ

5

Вы можете использовать перекресток python sets.

Если у вас есть три предложения, как, например:

a = "a b c d" 
b = "a c x y" 
c = "a q v" 

Вы можете проверить, сколько из одних и тех же слов происходит в двух предложениях, выполнив:

sameWords = set.intersection(set(a.split(" ")), set(c.split(" "))) 
numberOfWords = len(sameWords) 

С этим вы можете перебирать свой список предложений и найти два с самыми одинаковыми словами в них. Это дает нам:

sentences = ["a b c d", "a d e f", "c x y", "a b c d x"] 

def similar(s1, s2): 
    sameWords = set.intersection(set(s1.split(" ")), set(s2.split(" "))) 
    return len(sameWords) 

currentSimilar = 0 
s1 = "" 
s2 = "" 

for sentence in sentences: 
    for sentence2 in sentences: 
     if sentence is sentence2: 
      continue 
     similiarity = similar(sentence, sentence2) 
     if (similiarity > currentSimilar): 
      s1 = sentence 
      s2 = sentence2 
      currentSimilar = similiarity 

print(s1, s2) 

Там могут быть некоторые dynamic programming soultion к этой проблеме, если производительность является проблемой.

+2

Вы можете немного ускорить это: а) сформировать набор для каждого предложения один, не один раз для сравнения; b) нет необходимости сравнивать как '(a, b)', так и '(b, a)' – alexis

1
import itertools 

sentences = ["There is no subtle meaning in this.", "Don't analyze this!", "What is this sentence?"] 
decomposedsentences = ((index, set(sentence.strip(".?!,").split(" "))) for index, sentence in enumerate(sentences)) 
s1,s2 = max(itertools.combinations(decomposedsentences, 2), key = lambda sentences: len(sentences[0][1]&sentences[1][1])) 
print("The two sentences with the most common words", sentences[s1[0]], sentences[s2[0]]) 
Смежные вопросы