2015-02-04 2 views
0

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

list1 = ['accounting',..., 'yields', 'zero-bond'] 
list2 = ['accounting', 'actual cost', ..., 'zero-bond'] 
vocabulary_list = ['accounting', 'actual cost', ..., 'yields', 'zero-bond'] 

sample_text = "Accounting experts predict an increase in yields for zero-bond and yields for junk-bonds." 

desired_output = ['accounting':1, 'actual cost':0, ..., 'yields':2, 'zero-bond':1] 

, что я пробовал:

def word_frequency(fileobj, words): 
    """Build a Counter of specified words in fileobj""" 
    # initialise the counter to 0 for each word 
    ct = Counter(dict((w, 0) for w in words)) 
    file_words = (word for line in fileobj for word in line)    
    filtered_words = (word for word in file_words if word in words)  
    return Counter(filtered_words) 

def print_summary(filepath, ct): 
    words = sorted(ct.keys()) 
    counts = [str(ct[k]) for k in words] with open(filepath[:-4] + '_dict' + '.txt', mode = 'w') as outfile: 
    outfile.write('{0}\n{1}\n{2}\n\n'.format(filepath,', '.join(words),', '.join(counts))) 
    return outfile 

Есть ли способ сделать это в Python? Я понял, как управлять этим с помощью словарного списка слов (1token), но не смог найти решение для случая с несколькими словами?

+0

Какое у вас решение для одного слова? Каким образом (ы) это не работало для выражений? –

+0

def word_frequency (fileobj, words): «" Создать счетчик заданных слов в файлеobj "" " # инициализировать счетчик 0 для каждого слова ct = Counter (dict ((w, 0) для w в словах)) file_words = (слово для строки в fileobj для слова в строке) filtered_words = (слово в слово file_words, если слово в словах) возвращает счетчик (filtered_words) –

+0

защиту print_summary (путь_к_файл, кт): слова = отсортировано (ct.keys()) counts = [str (ct [k]) для k в словах] с открытым (путь к файлу [: - 4] + '_dict' + '.txt', mode = 'w') в качестве outfile : outfile.write ('{0} \ n {1} \ n {2} \ n \ n'.format (filepath,', '.join (words),', '.join (counts))) return outfile –

ответ

0

Если вы хотите, чтобы рассмотреть слова, оканчивающиеся с пунктуацией вам необходимо очистить текст также т.е. 'yields' и 'yields!'

from collections import Counter 
c = Counter() 
import re 

vocabulary_list = ['accounting', 'actual cost','yields', 'zero-bond'] 
d = {k: 0 for k in vocabulary_list} 
sample_text = "Accounting experts predict actual costs an increase in yields for zero-bond and yields for junk-bonds.".lower() 
splitted = set(sample_text.split()) 
c.update(splitted) # get count of all words 

for k in d: 
    spl = k.split() 
    ln = len(spl) 
    # if we have multiple words we cannot split 
    if ln > 1: 
     check = re.findall(r'\b{0}\b'.format(k),sample_text) 
     if check: 
      d[k] += len(check) 
    # else we are looking for a single word 
    elif k in splitted: 
     d[k] += c[k] 
print(d) 

Для цепи всех списков в один Vocab Dict:

from collections import Counter 
from itertools import chain 
import re 

c = Counter() 

l1,l2 = ['accounting', 'actual cost'], ['yields', 'zero-bond'] 
vocabulary_dict = {k:0 for k in chain(l1,l2)} 
print(vocabulary_dict) 
sample_text = "Accounting experts predict actual costs an increase in yields for zero-bond and yields for junk-bonds.".lower() 
splitted = sample_text.split() 
c.update(splitted) 

for k in vocabulary_dict: 
    spl = k.split() 
    ln = len(spl) 
    if ln > 1: 
     check = re.findall(r'\b{0}\b'.format(k),sample_text) 
     if check: 
      vocabulary_dict[k] += len(check) 
    elif k in sample_text.split(): 
     vocabulary_dict[k] += c[k] 
print(vocabulary_dict) 

Вы можете создать два dicts один для фраз, а другой для слов и сделать проход над каждым.

+0

Хорошее решение Padraic, но это не работает для примера, подобного этому: sample_text = "специалисты по бухгалтерскому учету. .. фактические затраты ... предсказывают увеличение доходности для нулевой облигации и доходности »-> (« фактическая стоимость »: 0,« учет »: 1 ...) –

+0

@ DominikScheld, да только что заметил два слова, I отредактирует –

+0

спасибо много Padraic :) одна маленькая вещь отсутствует, вывод вашего скрипта (... 'yields': 1) он должен быть (... 'yields': 2) вместо этого? –