Примечания к изучению сторонней библиотеки Python jieba и wordcloud

алгоритм

Это 24-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

библиотека цзеба Библиотека jieba — это сторонняя библиотека с мощными функциями сегментации слов. Он имеет хорошую производительность приложения при сегментации китайского текста. Рабочий механизм есть

Использование китайского тезауруса для определения вероятности связи между китайскими иероглифами Формируйте фразы с высокой вероятностью между китайскими иероглифами, чтобы сформировать результаты сегментации слов. В дополнение к заданной системой сегментации слов, он также поддерживает определяемое пользователем добавление фраз. Есть три формы причастия цзеба:

1. Режим точной сегментации слов: jieba.lcut(string) возвращает результат сегментации слов в виде списка;

2. Полный режим: jieba.lcut(string, cut_all=True), возвращает результат сегментации слов в виде списка, есть избыточность

3. Режим поисковой системы: jieba.lcut_for_search(string), возвращает результат сегментации слов в виде списка, есть избыточность

str="Пример строки, используемой в тесте на заикание"

eg1=jieba.lcut(str)

eg1

['узел', 'баку', 'тест', 'когда', 'использование', 'из', 'строка', 'пример']

eg2=jieba.lcut(str,cut_all=True)

eg2

['заикание', 'баку', 'тест', 'когда', 'использование', 'из', 'символ', 'строка', 'пример']

eg3=jieba.lcu_for_search(str)

eg3

['узел', 'баку', 'тест', 'когда', 'использование', 'из', 'символ', 'строка', 'пример']

Кроме того, библиотека jieba также поддерживает определяемое пользователем добавление фраз для сегментации слов.

В приведенном выше примере мы можем найти это. Хотя, на наш взгляд, дзибаку следует разделить на одно слово. Результаты сегментации не достигли этого эффекта. После выполнения jieba.add_word(word) вы можете получить следующие результаты, выполнив сегментацию слов

jieba.add_word("Джиеба Ку") eg4=jieba.lcut(str) например4

['Jump Baku', 'Тест', 'Когда', 'Использование', 'The', 'Строка', 'Пример']

библиотека wordcloud Библиотека wordcloud — это отличная сторонняя библиотека облаков слов.Используя облако слов как объект WordCloud, можно создать карту облака слов, состоящую из высокочастотных слов в тексте.

Ниже приведены основные шаги использования библиотеки wordcloud для выполнения вышеуказанных операций.

1. Получите содержимое текстового файла .txt и обработайте его

2. Создайте объект типа WordCloud, w=wordcloud.WordCloud()

3. Примените функции .generate() и .to_file(), предоставляемые библиотекой wordcloud, для загрузки текста и вывода его в виде файла изображения (в формате .png или .jpg).

Параметры объекта Word Cloud ширина: указывает ширину изображения, созданного объектом облака слов, по умолчанию 400 пикселей.

высота: высота, по умолчанию двести

min_font_size: указывает минимальный размер шрифта облака слов, по умолчанию 4

max_font_size: максимальный размер шрифта, автоматически настраиваемый в соответствии с высотой

font_step: указывает интервал шага размера шрифта в облаке слов, по умолчанию 1

font_path: указывает путь к файлу шрифта, по умолчанию — None.

max_words: указывает максимальное количество слов, отображаемых в облаке слов, по умолчанию 200.

stop_words: указывает список исключенных слов для облака слов, то есть список слов, которые не отображаются

маска: указывает форму облака слов, по умолчанию это прямоугольник, вам нужно обратиться к функции imread(0)

Пример приложения: Анализ частоты появления персонажей в романе о трех королевствах и рисование облака слов

import jieba import wordcloud

def wordStatistics (txt, excludeWord = нет): слова = jieba.lcut(txt) tempExclude=excludeWord counts = {} # создать пустой тип словаря для слова словами: если len(слово) == 1: Продолжать еще: counts[слово] = counts.get(слово, 0) + 1 элементы = список (количество.элементов()) items.sort(key=lambda x: x[1], reverse=True) # Сортировка по размеру значения ключа, то есть по частоте появления от низкой к высокой для я в диапазоне (15): слово, количество = элементы[i] print("{0:5}".format(word, count))

txt=open("threeKindoms.txt", 'r', encoding='UTF-8').read() #раздел статистики частотности слов исключить={} словоСтатистика(txt) После выполнения вышеуказанного кода полученный результат выглядит следующим образом

Как видите, есть несколько несвязанных или частично совпадающих элементов. Поэтому код нуждается в дальнейшей оптимизации. То есть увеличить количество сливающихся слов, которые не имеют отношения к суждению, то есть перекрывающихся слов. Код реализован следующим образом

import jieba import wordcloud

def wordStatistics (txt, excludeWord = нет): слова = jieba.lcut(txt) counts = {} # создать пустой тип словаря для слова словами: если слово в excludeWord или len(word)==1: Продолжать elif word=='Кун Мин' или word=='Кун Мин Юэ' или word=='Чжугэ Лян': word='Конг Мин' counts[слово] = counts.get(слово, 0) + 1 elif word=='Цао Цао' или word=='Мэн Дэ' или word=='Премьер-министр' или word=='Мастер': word='Цао Цао' counts[слово] = counts.get(слово, 0) + 1 elif word=='Лю Бэй' or word=='Xuande' или word=='Xuande Yue' или word=='Big Er': word='Лю Бэй' counts[слово] = counts.get(слово, 0) + 1 elif word=='Облако Чанг' или word=='Гуань Гун' или word=='Гуань Юй': word='Гуань Юй' counts[слово] = counts.get(слово, 0) + 1 elif word=='Чжан Фэй' или word=='Идэ': word='Чжан Фэй' counts[слово] = counts.get(слово, 0) + 1 elif word=='Zhao Yun' или word=='Zilong': word='Чжао Юнь' counts[слово] = counts.get(слово, 0) + 1 еще: counts[слово] = counts.get(слово, 0) + 1

items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)  # 根据键值大小即出场频率由低到高排序
for i in range(15):
    word, count = items[i]
    print("{0:<10}{1:>5}".format(word, count))

txt=open("threeKindoms.txt", 'r', encoding='UTF-8').read() #раздел статистики частотности слов exclude={'но сказал',"не могу",'так','не могу','два человека','цзинчжоу'} wordStatistics(txt,excludeWord=исключить)

Новые результаты таковы:

Видно, что после изменения появились и другие новые неактуальные слова. Псевдонимов почти не существует. Конечно, в процессе выделения слов точность статистических результатов зависит от вашего знакомства с Троецарствием. Я несколько раз читал «Троецарствие», и впечатление такое: Цао Цао обычно называют премьер-министром, а лордов больше. Он даже не претендовал на звание императора. А большое ухо Лю Бэя появилось в тот день, когда Люй Бу был убит Цао Цао. После того, как Цао Цао поймал Люй Бу, он спросил Люй Бэя, что с ним делать. Лю Бэй сказал: «Ты еще помнишь, что случилось с Дин Юанем и Дун Чжо?» Поэтому Цао Цао решил казнить Люй Бу. Люй Бу временно сказал Лю Бэю: «Да Эр, ты все еще помнишь, как Сюаньюаньмэнь стрелял из алебарды?» Когда Юань Шао или кто-то еще издевался над Люй Бэем, он пошел просить Лу Бу о помощи. Участвовал в съемке ворот Сюаньюань. Скажи да, я стреляю во что-то на расстоянии 100 футов этой алебардой Фан Тянь Хуа, забудь об этом, большой парень делает деньги на гневе. (Здесь видно, что Лв Бу не безрассудный человек. Ни отвергнуть Лю Бэя, ни невозможно для другой стороны, и это не является оскорблением). Конечно, слово «генерал» не должно иметь статистической частотности, а генералов слишком много. -- не по теме

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

import jieba import wordcloud

def wordStatistics (txt, excludeWord = нет): слова = jieba.lcut(txt) counts = {} # создать пустой тип словаря для слова словами: если слово в excludeWord или len(word)==1: Продолжать elif word=='Кун Мин' или word=='Кун Мин Юэ' или word=='Чжугэ Лян': word='Конг Мин' counts[слово] = counts.get(слово, 0) + 1 elif word=='Цао Цао' или word=='Мэн Дэ' или word=='Премьер-министр' или word=='Мастер': word='Цао Цао' counts[слово] = counts.get(слово, 0) + 1 elif word=='Лю Бэй' or word=='Xuande' or word=='Xuande Yue' or word=='Da'er' or word=='Первый Лорд': word='Лю Бэй' counts[слово] = counts.get(слово, 0) + 1 elif word=='Облако Чанг' или word=='Гуань Гун' или word=='Гуань Юй': word='Гуань Юй' counts[слово] = counts.get(слово, 0) + 1 elif word=='Чжан Фэй' или word=='Идэ': word='Чжан Фэй' counts[слово] = counts.get(слово, 0) + 1 elif word=='Zhao Yun' или word=='Zilong': word='Чжао Юнь' counts[слово] = counts.get(слово, 0) + 1 elif word=='Повелитель постов' or word=='Лю Чан' or word=='Адоу': word='Лю Чан' counts[слово] = counts.get(слово, 0) + 1 еще: counts[слово] = counts.get(слово, 0) + 1

items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)  # 根据键值大小即出场频率由低到高排序
for i in range(15):
    word, count = items[i]
    print("{0:<10}{1:>5}".format(word, count))

txt=open("threeKindoms.txt", 'r', encoding='UTF-8').read() #раздел статистики частотности слов exclude={'Но он сказал',"Не могу",'Поэтому','Нет','Два человека','Цзинчжоу','Общее','Переговоры','На следующий день','Введение', «Армия», «как», «сержант», «налево и направо»
«Даси», «Мир», «Сегодня», «Итак», «Вэй Бин», «Не смей», «Сучжоу», «Ваше величество», «Один человек», «Люди и лошади», Я не знаю», «Ханьчжун», «Я только вижу».
,'Генералы','Солдаты Шу','Движение на лошадях','Крик','Префект','Дуду','Этот человек','Госпожа','Потомки','Позади','В городе' , «Сын неба», «Одна сторона», «Почему бы и нет»} wordStatistics(txt,excludeWord=исключить) Следующий шаг — нарисовать простую карту облака слов на основе статистики частотности слов. Здесь вам нужно использовать функцию, предоставляемую библиотекой wordcloud, для рисования графических облаков в соответствии с частотой использования.

.generate_from_frequencies(text)

import jieba import wordcloud

def wordStatistics (txt, excludeWord = нет): слова = jieba.lcut(txt) counts = {} # создать пустой тип словаря для слова словами: если слово в excludeWord или len(word)==1: Продолжать elif word=='Кун Мин' или word=='Кун Мин Юэ' или word=='Чжугэ Лян': word='Конг Мин' counts[слово] = counts.get(слово, 0) + 1 elif word=='Цао Цао' или word=='Мэн Дэ' или word=='Премьер-министр' или word=='Мастер': word='Цао Цао' counts[слово] = counts.get(слово, 0) + 1 elif word=='Лю Бэй' or word=='Xuande' or word=='Xuande Yue' or word=='Da'er' or word=='Первый Лорд': word='Лю Бэй' counts[слово] = counts.get(слово, 0) + 1 elif word=='Облако Чанг' или word=='Гуань Гун' или word=='Гуань Юй': word='Гуань Юй' counts[слово] = counts.get(слово, 0) + 1 elif word=='Чжан Фэй' или word=='Идэ': word='Чжан Фэй' counts[слово] = counts.get(слово, 0) + 1 elif word=='Zhao Yun' или word=='Zilong': word='Чжао Юнь' counts[слово] = counts.get(слово, 0) + 1 elif word=='Повелитель постов' or word=='Лю Чан' or word=='Адоу': word='Лю Чан' counts[слово] = counts.get(слово, 0) + 1 еще: counts[слово] = counts.get(слово, 0) + 1

items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)  # 根据键值大小即出场频率由低到高排序
for i in range(15):
    word, count = items[i]
    print("{0:<10}{1:>5}".format(word, count))

return counts

txt=open("threeKindoms.txt", 'r', encoding='UTF-8').read() #раздел статистики частотности слов exclude={'Но он сказал',"Не могу",'Поэтому','Нет','Два человека','Цзинчжоу','Общее','Переговоры','На следующий день','Введение', «Армия», «как», «сержант», «налево и направо»
«Даси», «Мир», «Сегодня», «Итак», «Вэй Бин», «Не смей», «Сучжоу», «Ваше величество», «Один человек», «Люди и лошади», Я не знаю», «Ханьчжун», «Я только вижу».
,'Генералы','Солдаты Шу','Движение на лошадях','Крик','Префект','Дуду','Этот человек','Госпожа','Потомки','Позади','В городе' , «Сын неба», «Одна сторона», «Почему бы и нет»} результат = wordStatistics (txt, excludeWord = исключить) # рисуем облачную часть графика w=wordcloud.WordCloud(font_path="msyh.ttf",max_words=15,background_color="white",font_step=2) w.generate_from_frequencies (результат) w.to_file("три королевства.png") На самом деле, кажется, что в части рисования облаков всего три строки кода, но на самом деле это на какое-то время задержало меня. Я действительно тупой~ Потому что я не знал, что он предоставляет функцию рисования облаков графа в соответствии с частотой, то есть размером словарного значения ключа. Позже я просмотрел пример кода официального сайта, чтобы понять. научился.

Если вам нужен txt-файл, вы можете забрать его из Baidu Cloud: Ссылка на сайт:disk.baidu.com/yes/1SW я XQ0 вы…Код извлечения: 2vz4 Пожалуйста, послушайте следующую разбивку~