Наименее частые слова - python 3 - PullRequest
0 голосов
/ 01 августа 2020

Как удалить все специальные символы в приведенном ниже параграфе и вычислить менее часто используемые слова, количество которых <3, и вывести последние 20 менее часто используемых слов - в python</p>

Input

Lorem ipsum dolor sit amet, conctetur adipiscing elit. Aliquam sem odio, varius ne c aliquam ne c, tempor Commodo ante. Pellentesque sit amet augue vel ante dictum placerat ut ut sapien. Proin maximus eu diam in posuere. Suspendisse in lectus in lectus finibus auctor. Nam sed porttitor arcu. Vestibulum augue odio, posuere quis libero sed, pharetra sollicitudin est. Done c sit amet nun c eu nisi malesuada elementum id ut purus.Nun c sit amet% massa rhoncus, venenatis eros sit amet, ornare augue. Nun c a mi sed est tincidunt facilisis at ne c diam. Сделано c ne c ex lorem. Morbi vitae diam tincidunt, dignissim arcu ut, facilisis nisi. Maecenas non felis #ullamcorper, viverra augue id, consquat_nun c. Suspendisse Potenti. Proin tempor, sapien ut ornare placerat, sapien mauris luctus sapien, eget aliquam turpis urna at quam. Sed a & eros vel @ ante vestibulum vulputate. Suspendisse vitae vulputate velit. Suspendisse! ligula nisl, semper ut sodales et, ultricies porttitor felis. Нун c a c mattis erat, aliquet pretium risus. Nullam quis congue lacus, et mollis nulla. Монахиня c лаорет в ниши сит амет фасили * сис. Cras rutrum justo ut eros mollis volutpat. Sed quis mi nun c. Nun c sed bibendum nibh, quis bibendum toror.

Ожидаемый результат:

['ultricies', 'a c', 'mattis', 'erat', 'aliquet' , Pretium, risus, Nullam, congue, lacus, mollis, nulla, laoreet, Cras, rutrum, justo, volutpat, bibendum ',' nibh ',' toror ']

Я попробовал:

#!/bin/python3

import math
import os
import random
import re
import sys

from collections import Counter

def stringmethod(para, special1, special2, list1, strfind):
    # Write your code here
    word1=para
    for char in special1:
        word1 = word1.replace(char,"")

    word1=str(word1)
    slist=word1.split()

    c = Counter(slist).most_common()[-20:]
    lst=[]
    for i in range(0,len(c)):
        l1,l2=c[i]
        lst.append(l1)
    
    print(lst)


if __name__ == '__main__':

и получил

['semper', 'sodales', 'ultricies', 'ac', 'mattis', 'erat', 'aliquet', 'pretium', 'risus', 'Nullam', 'congue', 'lacus', 'nulla', 'laoreet', 'Cras', 'rutrum', 'justo', 'volutpat', 'nibh', 'tortor']

вместо

['ultricies', 'ac', 'mattis', 'erat', 'aliquet', 'pretium', 'risus', 'Nullam', 'congue', 'lacus', 'mollis', 'nulla', 'laoreet', 'Cras', 'rutrum', 'justo', 'volutpat', 'bibendum', 'nibh', 'tortor']

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

прежде всего, позвольте мне оптимизировать строку вашего кода.

def stringmethod(para, special1, special2, list1, strfind):
    # Remove special characters from para and add the new string to word1. 
    word1=para.translate({ord(c): None for c in special1})

Хорошо, теперь к проблеме ... проблема заключается в понимании фразы «менее часто», которая является не то же самое, что «наименее часто», особенно когда ваша основная инструкция добавляет фильтр count <3. </p>

Подумайте об этом так, если запрос является последней записью менее часто встречающихся слов в тексте, который count < 3, из которого вы получите словарь, подобный этому:

Original: {'pear': 1, 'apple': 2, 'red': 3}
Original after filter count<3: {'pear': 1, 'apple': 2}

Less used:
    'apple':2 is part of the less used group, and is the last record

Least used:
    {'apple': 2, 'pear': 1} - Ordered to reflect usage
    'pear': 1 - is the last record, on the LEAST used word group. 

Попробуйте следующую функцию - она ​​вернет список с каждым словом в порядке появления, количество которых меньше 3 (2 и 1) .

def word_count(str):
    counts = dict()
    words = str.split()
    for word in words:
        if word in counts:
            counts[word] += 1
        else:
            counts[word] = 1
    d=dict((k, v) for k,v in counts.items() if v<3)
    return list(d)[-20:]
0 голосов
/ 01 августа 2020

Разделение / удаление может быть выполнено с помощью re gex, подсчет может быть выполнен с помощью collections.Counter.most_common() в 2 строках, например:

t =("Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
    "Aliquam sem odio, varius nec aliquam nec, tempor commodo "
    "ante. Pellentesque sit amet augue vel ante dictum placerat"
    " ut ut sapien. Proin maximus eu diam in posuere. "
    "Suspendisse in lectus in lectus finibus auctor. Nam sed " 
    "porttitor arcu. Vestibulum augue odio, posuere quis libero"
    " sed, pharetra sollicitudin est. Donec sit amet nunc eu "
    "nisi malesuada elementum id ut purus.Nunc sit amet % massa"
    " rhoncus, venenatis eros sit amet, ornare augue. Nunc a mi"
    " sed est tincidunt facilisis at nec diam. Donec nec ex lorem."
    " Morbi vitae diam tincidunt, dignissim arcu ut, facilisis "
    "nisi. Maecenas non felis #ullamcorper, viverra augue id, "
    "consequat_nunc. Suspendisse potenti. Proin tempor, sapien "
    "ut ornare placerat, sapien mauris luctus sapien, eget aliquam"
    " turpis urna at quam. Sed a&eros vel@ ante vestibulum vulputate."
    " Suspendisse vitae vulputate velit. Suspendisse! ligula nisl, "
    "semper ut sodales et, ultricies porttitor felis. Nunc ac mattis"
    " erat, aliquet pretium risus. Nullam quis congue lacus, et mollis"
    " nulla. Nunc laoreet in nisi sit amet facili*sis. Cras rutrum justo"
    " ut eros mollis volutpat. Sed quis mi nunc. Nunc sed bibendum nibh,"
    " quis bibendum tortor.")

from collections import Counter 
import re

c = Counter((w for w in re.split("[ .,]",t) if re.match(r"^[a-zA-Z]+$", w)))
print([w for w,cnt in c.most_common() if cnt < 3][-20:])

, что дает:

['semper', 'sodales', 'ultricies', 'ac', 'mattis', 'erat', 'aliquet', 'pretium', 
 'risus', 'Nullam', 'congue', 'lacus', 'nulla', 'laoreet', 'Cras', 'rutrum', 'justo',
 'volutpat', 'nibh', 'tortor']

Это 20 слов, встречающихся 1 раз в обратном порядке .

Всего один раз встречается следующее:

print([w for w,cnt in c.most_common() if cnt == number])
['Lorem', 'ipsum', 'dolor', 'consectetur', 'adipiscing', 'elit', 'Aliquam',
 'sem', 'varius', 'commodo', 'Pellentesque', 'vel', 'dictum', 'maximus', 
 'finibus', 'auctor', 'Nam', 'Vestibulum', 'libero', 'pharetra', 
 'sollicitudin', 'malesuada', 'elementum', 'purus', 'massa', 'rhoncus', 
 'venenatis', 'a', 'ex', 'lorem', 'Morbi', 'dignissim', 'Maecenas', 'non', 
 'viverra', 'potenti', 'mauris', 'luctus', 'eget', 'turpis', 'urna', 'quam',
 'vestibulum', 'velit', 'ligula', 'nisl', 'semper', 'sodales', 'ultricies', 
 'ac', 'mattis', 'erat', 'aliquet', 'pretium', 'risus', 'Nullam', 'congue', 
 'lacus', 'nulla', 'laoreet', 'Cras', 'rutrum', 'justo', 'volutpat', 'nibh', 
 'tortor']

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

...