2017-01-11 3 views
0

Я пытаюсь определить наиболее распространенные слова или «термины» (я думаю), поскольку я перебираю много разных файлов.Как я могу эффективно вывести человеческие читаемые строки/термины из кода автоматически?

Пример - Для этой строки кода, найденного в файле:

for w in sorted(strings, key=strings.get, reverse=True): 

Я хочу, чтобы эти уникальные строки/термины вернулся в словарь в качестве ключей:

for 
w 
in 
sorted 
strings 
key 
strings 
get 
reverse 
True 

Однако, я хочу этот код можно настраивать, чтобы я мог возвращать строки с периодами или другими символами между ними, потому что я просто не знаю, что имеет смысл, пока я не запустил сценарий и не подсчитал «термины» несколько раз:

strings.get 

Как я могу подойти к этой проблеме? Это помогло бы понять, как я могу сделать эту одну строку за раз, чтобы я мог ее зацикливать, когда я читал строки моего файла. У меня есть основная логика, но сейчас я просто делаю подсчет по уникальной строке вместо «термин»:

strings = dict() 
fname = '/tmp/bigfile.txt' 

with open(fname, "r") as f: 
    for line in f: 
     if line in strings: 
      strings[line] += 1 
     else: 
      strings[line] = 1 

for w in sorted(strings, key=strings.get, reverse=True): 
    print str(w).rstrip() + " : " + str(strings[w]) 

(Да я использовал код из моего небольшого фрагмента кода здесь в качестве примера в верхней части.)

ответ

2

Если только питон маркера вы хотите сохранить вместе это object.attr конструкта, то все маркеры, которые вы заинтересованы, вписываются в регулярное выражение

\w+\.?\w* 

Который в основном означает «один или несколько буквенно-цифровых символов (включая _), необязательно с последующим ., а затем еще несколько символов»

обратите внимание, что это также будет соответствовать число литералов как 42 или 7.6, но это было бы достаточно легко отфильтровать после этого.

, то вы можете использовать collections.Counter для фактического подсчета для вас:

import collections 
import re 

pattern = re.compile(r"\w+\.?\w*") 

#here I'm using the source file for `collections` as the test example 
with open(collections.__file__, "r") as f: 
    tokens = collections.Counter(t.group() for t in pattern.finditer(f.read())) 
    for token, count in tokens.most_common(5): #show only the top 5 
     print(token, count) 

Запуск версии питона 3.6.0a1 выход заключается в следующем:

self 226 
def 173 
return 170 
self.data 129 
if 102 

, который имеет смысл для collections модуля, так как он заполнен классами, которые используют self и определяют методы, а также показывает, что он фиксирует self.data, который подходит для интересующей вас конструкции.

+0

Спасибо. Теперь, если я хотел что-то вроде 'hello $ world' ($ ... некоторые из файлов не являются фактическим кодом btw), чтобы соответствовать как полный термин (вместо' hello' и 'underscore')? Я собираюсь настроить это много. Мне просто нужно начать создавать кучу регулярных выражений «правила»? – Thisisstackoverflow

+0

, дающий конкретные примеры шаблонов, довольно прост, обобщение шаблона на несколько вариантов может быть затруднено, особенно если вы не очень хорошо знакомы с 're'. Я знаю, что обычно я получаю базовый шаблон с помощью re, затем использую методы 'str' для удаления исключений. –

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