2013-07-03 2 views
0

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

Я попытался использовать следующий код: Обратите внимание, что rest (list, word) удаляет слово из списка и возвращает обновленный список. linecount - количество строк в raw.

raw=open("raw_dataset_1","r") 
queryfile=open("queries","r") 
query=queryfile.readline().split() 
query_size=len(query) 
two=0 
three=0 
four=0 

while linecount>0: 
    line=raw.readline().split() 
    if query_size>=2: 
     for word1 in query: 
      beta=rest(query,word1) 
      for word2 in beta: 
       if (word1 in line) and (word2 in line): 
        two+=1 
        print line 
    if (query_size>=3): 
     for word3 in query: 
      beta=rest(query,word3) 
      for word4 in beta: 
       gama=rest(beta,word4) 
       for word5 in gama: 
        if (((word3 in line) and (word4 in line)) and (word5 in line)): 
         three+=1 
         print line 
    linecount-=1 

print two 
print three 

Он работает, хотя есть избыточность, я могу разделить «два» на 2, чтобы получить необходимое количество) Есть ли лучший подход, чтобы сделать это?

+0

@Vidit Нет. Хочу хочу fi n строк, содержащих более одного слова запроса. Например, мой запрос «sun tree». И у меня есть линии «яблочное дерево манго», «солнце неба» и «звезда луны солнца». Тогда число строк, в которых встречается 2 слова запроса, равно 1, т. Е. «Sun tree sky» (эта строка содержит 2 слова запроса) – nish

ответ

2

Я бы взял более общий подход. Предполагая query список ваших слов запроса и raw_dataset_1 это имя файла, который вы анализируете, я хотел бы сделать что-то вроде:

# list containing the number of lines with 0,1,2,3... occurrances of query words. 
wordcount = [0,0,0,0,0]  
for line in file("raw_dataset_1").readlines(): 
    # loop over each query word, see if it occurs in the given line, and just count them. 
    # The bracket inside will create a list of elements (query_word) from your query word list (query) 
    # but add only those words which occur in the line (if query_word in line). [See list comprehension] 
    # E.g. if your line contain three query words those three will be in the list. 
    # You are not interested in what those words are, so you just take the length of the list (len). 
    # Finally, number_query_words_found is the number of query words present in the current line of text. 
    number_query_words_found = len([query_word for query_word in query if query_word in line]) 
    if number_query_words_found<5: 
     # increase the line-number by one. The index corresponds to the number of query-words present 
     wordcount[number_query_words_found] += 1 

print "Number of lines with 2 query words: ", wordcount[2] 
print "Number of lines with 3 query words: ", wordcount[3] 

Этот код не проверен и может быть оптимизирована. Файл будет полностью прочитан (неэффективен для больших файлов), а список wordcount будет статическим, должен выполняться динамически (чтобы допускать любые вхождения слов. Но что-то вроде этого должно работать, за исключением того, что я неправильно понял ваш вопрос. Для понимания списка см. Например: here .

+0

не могли бы вы объяснить эту строку «len ([query_word для query_word в запросе, если query_word in line]) " – nish

+0

Я обновил сообщение. Надеюсь, теперь это становится яснее. – Alex

+0

Я получаю NameError: name 'line' не определен – nish

2

Я хотел бы использовать наборы для этого:

raw=open("raw_dataset_1","r") 
queryfile=open("queries","r") 
query_line = queryfile.readline() 
query_words = query_line.split() 
query_set = set(query_words) 
query_size = len(query_set) # Note that this isn't actually used below 

for line in raw: # Iterating over a file gives you one line at a time 
    words = line.strip().split() 
    word_set = set(words) 
    common_set = query_set.intersection(word_set) 
    if len(common_set) == 2: 
     two += 1 
    elif len(common_set) == 3: 
     three += 1 
    elif len(common_set) == 4: 
     four += 1 

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

+0

@munn: Большое спасибо :). Да, я использую эту идею – nish

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