Подсчитайте наиболее часто используемые слова из модели Django - PullRequest
0 голосов
/ 07 июня 2019

Я получил базовое приложение Django с приложением BeautifulSoup, которое получает данные об авторе и содержимом, а затем сохраняет их в базе данных. Мне нужно получить топ-10 наиболее часто используемых слов из этой модели содержимого. Я знаю, как получить топ-10 из URL-источника, но мне нужно получить его от Model. Может ли кто-нибудь помочь мне с этой идеей?

    views.py
    .............
    for i in posts:
    link = i.find_all('a', {'class': 'blog-button post-read-button post-button-animation'})[0]
    url = link.get('href')  # getting the url of each post
    fixed_url = '######' + url
    content = session.get(fixed_url, verify=False).content
    soup = BeautifulSoup(content, "lxml")
    author = soup.find_all('span', {'class': 'author-name'})[0].text  # getting the author name
    description = soup.find_all('div', {'class': 'post-content'})[0].text  # getting the content of post
    try:
        a = Author.objects.get(name=author)
    except Author.DoesNotExist:
        author_name = author
        author = Author.objects.create(name=author_name)
        author.save()
    Content.objects.get_or_create(description=description, author=a)
    ..............
    models.py
    class Author(models.Model):
        name = models.CharField(max_length=300)

        def __str__(self):
            return self.name


    class Content(models.Model):
        description = models.TextField()
        author = models.ForeignKey(Author, on_delete=models.CASCADE)

            def __str__(self):
                return self.description

1 Ответ

2 голосов
/ 07 июня 2019

Хорошо, из того, что я понимаю в комментариях, вы хотите, чтобы топ-10 наиболее часто используемых слов в описании для Content.

Создайте метод, который разбивает содержимое на список слов, итерирует по этому списку и использует словарь для отслеживания того, сколько раз слово появилось.

class Content(models.Model):
...
...
# Add this method to class
def get_most_used_words(self, count):
    words = {}
    description = self.description.split()
    for word in description:
        if word in words:
            words[word] += 1
        else:
            words[word] = 1
    top_10_words = sorted(words.items(),key=lambda x:-x[1])[:count]
    return top_10_words

Теперь вы можетеиспользуйте метод выше, как это

c = Content.objects.last() # Get the last content
print(c.get_most_used_words(10)) # Get the top 10 most used words
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...