2016-11-27 2 views
1

Мне нужно определить, является ли автор определенного текста введенным пользователем melville, shakespeare или ни одним из них. Я начал с поиска 50 лучших слов и их отношения появления для трех из melvilles и текста shakespeares и превращения его в два отдельных списка. Затем я сделал то же самое с неизвестным текстом. Я хочу сравнить список неизвестного текста с melville и шекспировским списком из 50 слов и их соотношением. Если слово в неизвестном тексте есть как в мельвине, так и в шекспире, то я хочу сравнить соотношение слов между мельвиль и шекспиром. Который когда-либо имеет наивысшее значение, мы будем считать, что это из текста. Предпочтительно было бы хорошо пройти все 50 слов для более точного определения. Это мой код до сих пор:Определение автора определенного текста

def identifyAuthor(textFile): 
    counts = {} 
    A = [] 
    B = [] 
    C = [] 

    B = melville() 
    C = shakespeare() 

    for words in [textFile]: 
     text = open(words, 'r').read() 
     test = text.lower() 

    for ch in '!"$%&()*+,-./:;<=>[email protected][\\]^_`{|}~': 
     text = text.replace(ch, ' ') 
     words = text.split() 

    for w in words: 
     counts[w] = counts.get(w, 0) + 1 

    items = list(counts.items()) 
    items.sort() 
    items.sort(key=byFreq, reverse = True) 

    for i in range(50): 
     word, count = items[i] 
     count = count/float(len(counts)) 
     A += [[word, count]] 

    for i in range(50): 
     part1 = filter(lambda x: i in x, A) 
     part2 = reduce(lambda x, y: x + y, part1) 
    return part2[1] 

Проблемы я имею я получаю сообщение об ошибке:

TypeError: reduce() of empty sequence with no initial value Я предполагаю, что это потому, что фильтр не может найти переменный и имею данные для поиска фактическая строка как 'the'? Поэтому мне было интересно, как я могу заставить его работать с переменной, или если я не могу тогда выбрать альтернативу? Любая помощь будет высоко ценится.

+0

Можете ли вы показать нам представление переменной 'part1'? Кажется, это массив 'Bool', поэтому вы не сможете передать его функции' lambda' 'reduce'. –

+0

'i' является целым числом от 0 до 49, а каждый' count' равен, насколько я вижу, отношение от 0 до 1. Итак, как будет «i in x» когда-либо быть истинным? –

+0

@CarlesMitjans part1 должен возвращать, где я есть, однако я не думаю, что это возможно, потому что это переменная, а не слово, подобное «the». Когда я заменяю i на «the», он возвращает [['the', 0.6925910972039971]], что я и хочу. –

ответ

0

Я не намерен это будет ответ, но написать комментарий будет неаккуратно:

a = [] 
a += [['yo',3.24]] 
a += [['ere',1]] 
for i in range(2): 
    part1 = filter(lambda x: i in x, a) 
    try: 
     part2 = reduce(lambda x, y: x + y, part1) 
    except TypeError: 
     pass 
print(part2[1]) 

напечатает:

1 

оговорка исключение Придает ли то, что вы хотите ?

сообщение об ошибке вы получаете от reduce пытается работать на пустых списках, когда filter не удается найти ничего, что соответствует, что произойдет, если вы пытаетесь соответствовать целому числу i в данном случае с отношением, что будет вторых элементов списков в A