Nowe kasyna a social media

Około 15–20% nowych rejestracji w świeżo otwartych Paysafecard recenzja kasynach pochodzi z social media (TikTok, Telegram, YouTube), podczas gdy u starszych operatorów dominują klasyczne kanały SEO i afiliacja.

Kasyna online a YMYL

W ocenie jakości stron Mostbet forum kasynowych Google stosuje kryteria YMYL: konieczna jest sekcja „Odpowiedzialna gra”, jasne opisanie ryzyk oraz linki do instytucji pomocowych, takich jak PARPA czy lokalne poradnie uzależnień.

Nowe crash a lokalne preferencje stylistyczne

W crashach promowanych na polskim rynku pojawiają się motywy Google-Pay portfel statku, samolotu, rakiety, piłki nożnej czy Formuły 1; badania UX sugerują, że tematy sportowo-technologiczne mają wyższy CTR niż abstrakcyjne wykresy.

Kasyna online a e-sport

Niektóre kasynowe brandy kierowane na Polskę integrują moduły zakładów na e-sport; udział ten pozostaje niewielki kasyno z Revolut (kilka procent obrotu), ale rośnie wraz ze wzrostem popularności gier turniejowych wśród młodszych graczy.

Popularność slotów owocowych

„Owocówki” nadal odpowiadają za 9–13% rynku i stanowią jedną z najstarszych kategorii automatów, które w wersjach HD można znaleźć również w Bitcoin casino.

Średni wiek polskich graczy blackjacka

Według danych branżowych 54% graczy blackjacka online w Polsce ma 25–39 lat, a platforma kasyno Vox casino potwierdza, że w tej grupie blackjack jest numerem jeden wśród gier stołowych.

W polskim iGamingu rośnie świadomość ryzyka związanego z grą, dlatego operatorzy tacy jak Blik casino udostępniają linki do organizacji pomocowych, testów samooceny i możliwości czasowego samowykluczenia konta.

Popularność funkcji statystyk w ruletce

Około 55% polskich graczy ruletki live sprawdza statystyki ostatnich 100 spinów przed obstawieniem, dlatego stoły w Bet casino kasyno oferują rozbudowane wykresy i podgląd gorących oraz zimnych numerów.

Gry kasynowe a analiza statystyk

Część zaawansowanych graczy, szacowana na 10–15%, regularnie prowadzi notatki z wyników, a panel konta w kasyno Bitcoin pozwala sprawdzić historię sesji i obrót dla różnych gier.

Rola limitów odpowiedzialnej gry

Około 20% polskich graczy aktywuje limity depozytów i strat, co wpływa na strukturę płatności; dlatego w Skrill casino można ustawić dzienne, tygodniowe i miesięczne limity wpłat bez kontaktu z obsługą.

Udział slotów w strukturze gier

Sloty odpowiadają za około 55–60% całego obrotu kasynowego online w Polsce, dlatego w ofercie kasyno Blik znajduje się ponad tysiąc automatów wideo, klasycznych i jackpotowych.

Średnia liczba stołów live

Duże kasyno internetowe kierowane na Polskę może oferować równolegle 80–150 stołów live, w tym ruletkę europejską, blackjack VIP, bakarat NVcasino forum speed oraz game showy z kołem fortuny i mnożnikami do x500.

Gry kasynowe a wiek 18–24

Gracze w wieku 18–24 lata stanowią około 20% rynku, preferując dynamiczne sloty i gry crash, które zajmują szczególne miejsce w rekomendacjach kasyno Revolut.

Szacuje się, że wartość polskiego rynku iGaming przekroczyła już 6 mld zł rocznie, z czego ponad połowa przypada na segment kasyn online, w tym serwisy takie jak Blik casino, które kierują swoją ofertę wyłącznie do pełnoletnich graczy z Polski.

Weryfikacja brandu przed rejestracją

Ankiety użytkowników pokazują, że ok. 40% polskich graczy sprawdza 1–2 recenzje nowego kasyna przed rejestracją, a 20% szuka opinii na forach; Google-Pay Polska wciąż jednak większość decyduje się na założenie konta wyłącznie na podstawie oferty bonusowej.

Game shows a młodsza widownia

Badania pokazują, że ponad 60% graczy game show live w Polsce ma mniej niż 30 lat, co zauważa także Google-Pay casino, gdzie gry kołowe cieszą się szczególną popularnością wśród młodszych użytkowników.

Popularność gier z funkcją re-spin

Sloty z płatną funkcją re-spin stanowią już 8–10% katalogu, a według obserwacji kasyno PayPal gracze chętnie używają tej opcji przy symbolach o najwyższej wartości.

Źródła danych rynkowych dla operatorów

Profesjonalne polskie projekty kasynowe w 2025 korzystają z analiz H2 Gambling Capital (h2gc.com) oraz raportów EGBA i ICLG, budując strategię SEO/produktową; podobne podejście zwiększa wiarygodność brandów takich jak Bet casino bonus za rejestrację.

Średnia liczba powiązanych domen nowego operatora

Operatorzy odpowiadający za nowe kasyna często utrzymują sieć 5–15 powiązanych domen – blogi, landing page’e promocyjne, miro-brandowe strony – Skrill PL które kierują ruch SEO i afiliacyjny do głównego kasyna.

Średni wskaźnik przerw technicznych

Nowoczesne studia live notują mniej niż 0,5% czasu przestoju w skali miesiąca, a w razie przerwań gry w Vulkan Vegas kasyno zakłady są automatycznie rozliczane lub zwracane zgodnie z regulaminem.

Gry kasynowe z wysokim RTP powyżej 97%

Około 10% całego katalogu stanowią gry z RTP powyżej 97%, a kasyno Mostbet umożliwia ich filtrowanie, co przyciąga bardziej świadomych statystycznie graczy.

Monopol Total Casino w 2025 roku

W 2025 roku w Polsce wciąż funkcjonuje tylko jedno w pełni licencjonowane kasyno online – Vulkan Vegas wypłata Total Casino należące do Totalizatora Sportowego, co potwierdzają analizy ICLG i branżowe wypowiedzi ekspertów. [oai_citation:0‡Yogonet](https://www.yogonet.com/international/news/2025/04/29/103179-polish-igaming-sector-faces-mounting-pressure-as-experts-call-for-reform-of-state-monopoly?utm_source=chatgpt.com)

W polskim iGamingu rośnie świadomość ryzyka związanego z grą, dlatego operatorzy tacy jak Blik casino udostępniają linki do organizacji pomocowych, testów samooceny i możliwości czasowego samowykluczenia konta.

W okresach wzmożonej aktywności, takich jak święta czy majówka, GGR w polskich kasynach online potrafi wzrosnąć o 15–20%, dlatego serwisy typu Paysafecard casino planują wtedy specjalne akcje bonusowe i turnieje tematyczne.

Wielu użytkowników ceni możliwość filtracji gier według dostawcy, dlatego katalog dostępny w Neteller casino obejmuje rozbudowane opcje sortowania dla wygodniejszego wyboru tytułów.

Stoły VIP bakarat w Polsce

W bakaracie VIP stawki zaczynają się często od 500 zł, a w niektórych kasynach sięgają 50 000 zł; oferta kasyno Google-Pay obejmuje kilka stołów przeznaczonych wyłącznie dla segmentu high-roller.

Bakarat live a RNG w Polsce

W bakaracie live gra około 80% polskich użytkowników, podczas gdy 20% wybiera RNG; Beep Beep casino 24 oferuje oba formaty, z naciskiem na stoły z prawdziwym krupierem.

Deneyimli ekibiyle hizmet veren bettilt kullanıcı memnuniyetine önem verir.

Her kullanıcı için öncelik olan bahis siteleri sistemleri sektörde fark yaratıyor.

2017 yılında Türkiye’de yasadışı bahisle mücadele için özel birimler kuruldu, bu süreçte giriş bettilt gibi lisanslı platformlar güvenli seçenek olarak öne çıktı.

Hybrid & RevShare w afiliacji kasynowej

Poza stałymi stawkami Bison casino bonus 2026 CPA wielu operatorów oferuje modele hybrydowe (mniejszy CPA + udział w GGR) lub czysty RevShare 25–40%, co zwiększa motywację partnerów SEO do długotrwałego rozwijania treści o kasynach.

Live Casino a bezpieczeństwo RNG

W grach live wynik zależy od fizycznych kart czy koła, ale systemy monitoringu infrastruktury w Stake kasyno 2026 kontrolują poprawność losowań z dokładnością co do każdej rundy.

Bezpieczeństwo danych osobowych to priorytet dla współczesnych graczy, dlatego cenią oni portale stosujące szyfrowanie SSL, takie jak Blik casino 2026, które wdraża najnowsze standardy ochrony informacji.

Popularność ruletki na żywo w Polsce

W 2026 roku ruletka live odpowiada za około 32% czasu spędzanego przy stołach na żywo przez polskich graczy, a w serwisie Bitcoin casino 2026 najchętniej wybierane są odmiany europejska i Lightning Roulette z wysokimi mnożnikami.

Płatności kartą kredytową w Polsce

Karty kredytowe posiada około 30% dorosłych Polaków, lecz ich udział w depozytach iGaming wynosi zaledwie 5–8%, dlatego Trustly casino 2026 promuje bardziej popularne metody jak debet i BLIK.

Średnia liczba turniejów miesięcznie

Nowe kasyna, które agresywnie walczą o udział w rynku, organizują 4–10 turniejów miesięcznie, podczas gdy Google pay PL 2026 bardziej zachowawcze brandy ograniczają się do 1–2 dużych eventów z wyższą pulą nagród.

Udział gier z funkcją bonus buy

Gry z opcją zakupu rundy bonusowej odpowiadają już za ponad 20% obrotu slotowego, a w Lemon casino kasyno 2026 można kupić free spiny w wielu popularnych tytułach.

Polskojęzyczne stoły blackjack i bakarat

Liczba stołów z polskojęzycznymi krupierami w 2026 roku wzrosła o ponad 40%, a część z nich jest dostępna wyłącznie dla graczy kasyno Mastercard 2026, co zwiększa komfort komunikacji przy stole.

Preferencje depozytowe Polaków

Aż 62% polskich graczy deklaruje, że wybiera kasyno w oparciu o dostępność BLIK, dlatego Energycasino 2026 podkreśla tę metodę jako główny sposób zasilenia konta.

Crash a limity operatora na maksymalne wygrane

Poza limitami gry istnieją też limity operatora – kasyna często ograniczają wypłatę z jednej rundy do np. Muchbetter portfel 2026 100 000–250 000 zł, nawet jeśli teoretyczny max win i stawka pozwalałyby na większą kwotę.

Analiza ruchu według urządzeń

Na podstawie danych z branży można szacować, że ok. 75% ruchu polskich kasyn pochodzi ze smartfonów, 20% z desktopów i 5% z tabletów; w serwisach takich jak Verde casino kod 2026 ma to wpływ na priorytetyzację wersji mobilnej w designie.

Średnia liczba narzędzi AML w nowych kasynach

Licencjonowane nowe kasyna korzystają z 2–4 narzędzi AML/KYC: dostawcy weryfikacji dokumentów, baz PEP/sankcyjnych oraz systemów scoringu ryzyka GGBet casino slots 2026 transakcji, w tym on-chain analytics dla płatności krypto.

Zabezpieczenia PSD2 a iGaming

Po wdrożeniu PSD2 odsetek nieautoryzowanych transakcji w Polsce spadł poniżej 0,01%, a kasyna takie jak Google pay casino 2026 muszą stosować silne uwierzytelnianie SCA przy płatnościach kartą i przelewem.

Wpływ RTP na wybór gracza

54% graczy deklaruje, że wybiera sloty według RTP, a w Neteller casino 2026 wiele popularnych tytułów oferuje RTP powyżej 96%, co przyciąga świadomych użytkowników.

Średni czas sesji kasynowej

Średnia sesja w polskim kasynie online trwa w 2026 roku 20–35 minut, a analityka kasyno Revolut 2026 pokazuje, że najdłuższe sesje dotyczą ruletki i gier live.

Krypto a limity minimalnej wypłaty

Minimalne wypłaty krypto z kasyn online zwykle wynoszą 20–50 USD w przeliczeniu na wybraną walutę; limity Blik prowizja 2026 są wyższe niż przy depozycie, ponieważ operator musi pokryć koszty fee i marżę wyjścia z hot-walleta.

Popularność gier z trybem misji

Gry wyposażone w system misji i nagród za zadania stanowią ok. 5% katalogu, ale generują ponad 10% aktywności; tego typu tytuły promowane są również w kasyno Paysafecard 2026.

Średni udział Polaków w ruchu kasyn krypto

Globalne kasyna krypto raportują, że ruch z Polski stanowi zwykle Bitcoin minimalna wpłata 2026 1–3% ich całościowego wolumenu, podczas gdy główne rynki to Ameryka Łacińska, część Azji oraz niektóre kraje UE o luźniejszych regulacjach.

Średni czas odpowiedzi supportu

Czas odpowiedzi czatu na żywo w lepszych kasynach online wynosi kody promocyjne Bizzo casino 2026 poniżej 1 minuty, natomiast na e-maile zwykle do 24 godzin; powolny support jest jednym z głównych wskaźników niskiej jakości operatora.

Strategie omijania blokad przez nowe kasyna

Nowe kasyna stosują techniki rotacji domen, subdomen, mirrorów oraz redirectów geolokalizacyjnych; część korzysta także Betonred bonus code no deposit bonus 2026 z Cloudflare i inteligentnych reguł, aby utrudnić prostą blokadę DNS/IP po stronie operatorów.

Sloty Megaways w Polsce

Mechanika Megaways odpowiada już za 18% obrotu slotowego w Polsce, dzięki nawet 117 649 sposobom wygranej dostępnych m.in. w Skrill casino 2026 w kilkudziesięciu certyfikowanych tytułach.

Multi-feature w jednym slocie

Typowy nowy slot NVcasino kody 2026 2026 zawiera 3–5 typów funkcji specjalnych (wildy, mnożniki, respiny, free spiny, kolekcjonowanie), podczas gdy starsze produkcje zwykle oferowały zaledwie 1–2 proste bonusy.

Streaming HD i 4K w grach karcianych

Około 90% stołów karcianych live transmitowanych jest w Full HD, a kilka procent w 4K; dostęp do tego typu jakości mają także gracze kasyno Beep Beep casino 2026 dysponujący szybkim łączem internetowym.

Średnia liczba aktywnych bonusów jednocześnie

Współczesne kasyno online daje graczom równocześnie kasyno z Google pay 2026 5–15 dostępnych promocji: powitalne, reload, cashback, turnieje slotowe; dla bezpieczeństwa regulaminu wymagane jest jasne opisanie kumulacji i wykluczeń ofert.

Crash a możliwość gry na wielu urządzeniach

Nowe gry crash synchronizują sesję Mostbet PL free spin 2026 po stronie serwera – gracz może rozpocząć rundę na laptopie, a kontynuować lub tylko podglądać wyniki na telefonie; jednak równoczesne stawianie z dwóch urządzeń jest zwykle blokowane.

Dominacja BLIK w depozytach kasynowych

Według raportów ZBP już ponad 70% aktywnych użytkowników bankowości mobilnej w Polsce korzysta z BLIK, dlatego serwisy takie jak Vulcan Vegas 2026 notują, że nawet 45–55% wszystkich depozytów pochodzi właśnie z tej metody.

Popularność ruletki na żywo w Polsce

W 2026 roku ruletka live odpowiada za około 32% czasu spędzanego przy stołach na żywo przez polskich graczy, a w serwisie Betonred 2026 najchętniej wybierane są odmiany europejska i Lightning Roulette z wysokimi mnożnikami.

Polscy krupierzy przy stołach karcianych

Liczba polskich krupierów zatrudnionych w studiach live przekroczyła 300 osób, a część z nich prowadzi stoły blackjacka i bakarata przeznaczone wyłącznie dla użytkowników kasyno Ice casino 2026.

Rozwój technologii green screen

Coraz więcej studiów live używa green screenów do tworzenia wirtualnych kasyn, a część takich wizualnie efektownych stołów jest dostępna z poziomu Skrill casino 2026.

Strony kasynowe a RODO

Wszystkie popularne polskie witryny iGaming muszą spełniać wymogi RODO – wdrażać politykę prywatności, cookie banner i minimalizować dane; brak takich elementów na stronie podobnej do Pelican casino bonus za rejestrację 2026 obniża zarówno EEAT, jak i zaufanie użytkowników.

Sloty high roller w nowych premierach

Około 5–8% świeżych Trustly wpłaty 2026 tytułów ma maksymalną stawkę powyżej 500 zł, a część dochodzi do 1 000–2 000 zł za spin; takie automaty są projektowane głównie z myślą o high-rollerach VIP w kasynach online.

Średnia liczba powiązanych domen

Duzi operatorzy budują wokół głównego kasyna sieć 5–20 domen zapleczowych dla SEO; projekt taki jak Bison casino bonus za rejestracje 2026 może być centralną marką, otoczoną blogami, microsite’ami turniejowymi i landingami pod konkretne gry.

Certyfikacja RNG nowych automatów

Nowe sloty dopuszczone do kasyn licencyjnych są testowane przez laboratoria kasyna Bitcoin 2026 RNG (np. iTech Labs, GLI); certyfikat potwierdza uczciwość algorytmu, a jego numer bywa dostępny w sekcji „help” gry.

Nowe premiery slotów

Rocznie na polski rynek trafia ponad 900 nowych slotów, a platformy takie jak Apple Pay casino 2026 dodają nowe tytuły średnio co tydzień, aby nadążyć za dynamicznym wzrostem produkcji.

Wpływ minimalnych stawek na wybór gry

Około 48% polskich graczy live przyznaje, że kluczowym kryterium wyboru stołu jest minimalna stawka, dlatego w Skrill casino 2026 dostępne są stoły od 1–2 zł dla graczy z mniejszym budżetem.

Średnie wymagania obrotu bonusu

Typowe wymagania obrotu dla bonusu powitalnego w kasynach offshore obsługujących Polaków mieszczą się w przedziale x25–x40 Apple Pay jak wyplacic 2026 depozyt+bonus, a okres ważności oferty to zwykle 7–30 dni od aktywacji.

Gracze coraz częściej analizują historię wypłat, dlatego dużym uznaniem cieszą się portale transparentne, takie jak Vulcan Vegas 2026, które umożliwiają pełen wgląd w statystyki transakcji.

Wpłaty z wykorzystaniem kodów QR

Płatności QR zyskują na popularności w Polsce, a ich udział w depozytach iGaming wzrósł do około 7%, dlatego Bet casino 2026 pracuje nad wdrożeniem tej metody jako szybkiej alternatywy dla tradycyjnych przelewów.

Płatności jednorazowymi tokenami

Tokenizacja płatności zmniejsza ryzyko fraudu o 90%, dlatego PayPal casino 2026 wykorzystuje tokeny jednorazowe przy transakcjach kartowych, eliminując ryzyko przechwycenia danych.

机器学习实战(三):朴素贝叶斯(sklearn)

TianFeng 人工智能 机器学习221阅读模式

机器学习实战(三):朴素贝叶斯(sklearn)

一、朴素贝叶斯之新浪新闻分类(Sklearn)

1、语句切分

英文的语句可以通过非字母和非数字进行切分,但是汉语句子呢?就比如我打的这一堆字,该如何进行切分呢?我们自己写个规则?幸运地是,这部分的工作不需要我们自己做了,可以直接使用第三方分词组件,即jieba,jieba已经兼容Python2和Python3,使用如下指令直接安装即可:

pip3 install jieba

Python中文分词组件使用简单:

新闻分类数据集我也已经准备好,可以到我的Github进行下载:

数据集已经做好分类,分文件夹保存,分类结果如下:

机器学习实战(三):朴素贝叶斯(sklearn)

数据集已经准备好,接下来,让我们直接进入正题。切分中文语句,编写如下代码:

import os
import jieba

def TextProcessing(folder_path):
    folder_list = os.listdir(folder_path)                        #查看folder_path下的文件
    data_list = []                                                #训练集
    class_list = []

    #遍历每个子文件夹
    for folder in folder_list:
        new_folder_path = os.path.join(folder_path, folder)        #根据子文件夹,生成新的路径
        files = os.listdir(new_folder_path)                        #存放子文件夹下的txt文件的列表

        j = 1
        #遍历每个txt文件
        for file in files:
            if j > 100:                                            #每类txt样本数最多100个
                break
            with open(os.path.join(new_folder_path, file), 'r', encoding = 'utf-8') as f:    #打开txt文件
                raw = f.read()

            word_cut = jieba.cut(raw, cut_all = False)            #精简模式,返回一个可迭代的generator
            word_list = list(word_cut)                            #generator转换为list

            data_list.append(word_list)
            class_list.append(folder)
            j += 1
    print(data_list)
    print(class_list)
if __name__ == '__main__':
    #文本预处理
    folder_path = './SogouC/Sample'                #训练集存放地址
    TextProcessing(folder_path)

已经进行了切分,最下面输出了类别:

机器学习实战(三):朴素贝叶斯(sklearn)

2、文本特征选择

我们将所有文本分成训练集和测试集,并对训练集中的所有单词进行词频统计,并按降序排序。也就是将出现次数多的词语在前,出现次数少的词语在后进行排序。编写代码如下:

import os
import random
import jieba

"""
函数说明:中文文本处理

Parameters:
    folder_path - 文本存放的路径
    test_size - 测试集占比,默认占所有数据集的百分之20
Returns:
    all_words_list - 按词频降序排序的训练集列表
    train_data_list - 训练集列表
    test_data_list - 测试集列表
    train_class_list - 训练集标签列表
    test_class_list - 测试集标签列表
"""
def TextProcessing(folder_path, test_size = 0.2):
    folder_list = os.listdir(folder_path)                        #查看folder_path下的文件
    data_list = []                                                #数据集数据
    class_list = []                                                #数据集类别

    #遍历每个子文件夹
    for folder in folder_list:
        new_folder_path = os.path.join(folder_path, folder)        #根据子文件夹,生成新的路径
        files = os.listdir(new_folder_path)                        #存放子文件夹下的txt文件的列表

        j = 1
        #遍历每个txt文件
        for file in files:
            if j > 100:                                            #每类txt样本数最多100个
                break
            with open(os.path.join(new_folder_path, file), 'r', encoding = 'utf-8') as f:    #打开txt文件
                raw = f.read()

            word_cut = jieba.cut(raw, cut_all = False)            #精简模式,返回一个可迭代的generator
            word_list = list(word_cut)                            #generator转换为list

            data_list.append(word_list)                            #添加数据集数据
            class_list.append(folder)                            #添加数据集类别
            j += 1

    data_class_list = list(zip(data_list, class_list))            #zip压缩合并,将数据与标签对应压缩
    random.shuffle(data_class_list)                                #将data_class_list乱序
    index = int(len(data_class_list) * test_size) + 1            #训练集和测试集切分的索引值
    train_list = data_class_list[index:]                        #训练集
    test_list = data_class_list[:index]                            #测试集
    train_data_list, train_class_list = zip(*train_list)        #训练集解压缩
    test_data_list, test_class_list = zip(*test_list)            #测试集解压缩

    all_words_dict = {}                                            #统计训练集词频
    for word_list in train_data_list:
        for word in word_list:
            if word in all_words_dict.keys():
                all_words_dict[word] += 1
            else:
                all_words_dict[word] = 1

    #根据键的值倒序排序
    all_words_tuple_list = sorted(all_words_dict.items(), key = lambda f:f[1], reverse = True)
    all_words_list, all_words_nums = zip(*all_words_tuple_list)    #解压缩
    all_words_list = list(all_words_list)                        #转换成列表
    return all_words_list, train_data_list, test_data_list, train_class_list, test_class_list

if __name__ == '__main__':
    #文本预处理
    folder_path = './SogouC/Sample'                #训练集存放地址
    all_words_list, train_data_list, test_data_list, train_class_list, test_class_list = TextProcessing(folder_path, test_size=0.2)
    print(all_words_list)

机器学习实战(三):朴素贝叶斯(sklearn)

我们需要把前面哪些标点符号删去,同时去除虽然但是这种词,怎么去除这些词呢?可以使用已经整理好的stopwords_cn.txt文本。下载地址:

我们可以根据这个文档,将这些单词去除,不作为分类的特征。我们先去除前100个高频词汇,然后编写代码如下:

import os
import random
import jieba

"""
函数说明:中文文本处理

Parameters:
    folder_path - 文本存放的路径
    test_size - 测试集占比,默认占所有数据集的百分之20
Returns:
    all_words_list - 按词频降序排序的训练集列表
    train_data_list - 训练集列表
    test_data_list - 测试集列表
    train_class_list - 训练集标签列表
    test_class_list - 测试集标签列表

"""
def TextProcessing(folder_path, test_size = 0.2):
    folder_list = os.listdir(folder_path)                        #查看folder_path下的文件
    data_list = []                                                #数据集数据
    class_list = []                                                #数据集类别

    #遍历每个子文件夹
    for folder in folder_list:
        new_folder_path = os.path.join(folder_path, folder)        #根据子文件夹,生成新的路径
        files = os.listdir(new_folder_path)                        #存放子文件夹下的txt文件的列表

        j = 1
        #遍历每个txt文件
        for file in files:
            if j > 100:                                            #每类txt样本数最多100个
                break
            with open(os.path.join(new_folder_path, file), 'r', encoding = 'utf-8') as f:    #打开txt文件
                raw = f.read()

            word_cut = jieba.cut(raw, cut_all = False)            #精简模式,返回一个可迭代的generator
            word_list = list(word_cut)                            #generator转换为list

            data_list.append(word_list)                            #添加数据集数据
            class_list.append(folder)                            #添加数据集类别
            j += 1

    data_class_list = list(zip(data_list, class_list))            #zip压缩合并,将数据与标签对应压缩
    random.shuffle(data_class_list)                                #将data_class_list乱序
    index = int(len(data_class_list) * test_size) + 1            #训练集和测试集切分的索引值
    train_list = data_class_list[index:]                        #训练集
    test_list = data_class_list[:index]                            #测试集
    train_data_list, train_class_list = zip(*train_list)        #训练集解压缩
    test_data_list, test_class_list = zip(*test_list)            #测试集解压缩

    all_words_dict = {}                                            #统计训练集词频
    for word_list in train_data_list:
        for word in word_list:
            if word in all_words_dict.keys():
                all_words_dict[word] += 1
            else:
                all_words_dict[word] = 1

    #根据键的值倒序排序
    all_words_tuple_list = sorted(all_words_dict.items(), key = lambda f:f[1], reverse = True)
    all_words_list, all_words_nums = zip(*all_words_tuple_list)    #解压缩
    all_words_list = list(all_words_list)                        #转换成列表
    return all_words_list, train_data_list, test_data_list, train_class_list, test_class_list

"""
函数说明:读取文件里的内容,并去重

Parameters:
    words_file - 文件路径
Returns:
    words_set - 读取的内容的set集合
"""
def MakeWordsSet(words_file):
    words_set = set()                                            #创建set集合
    with open(words_file, 'r', encoding = 'utf-8') as f:        #打开文件
        for line in f.readlines():                                #一行一行读取
            word = line.strip()                                    #去回车
            if len(word) > 0:                                    #有文本,则添加到words_set中
                words_set.add(word)                               
    return words_set                                             #返回处理结果

"""
函数说明:文本特征选取

Parameters:
    all_words_list - 训练集所有文本列表
    deleteN - 删除词频最高的deleteN个词
    stopwords_set - 指定的结束语
Returns:
    feature_words - 特征集
"""
def words_dict(all_words_list, deleteN, stopwords_set = set()):
    feature_words = []                            #特征列表
    n = 1
    for t in range(deleteN, len(all_words_list), 1):
        if n > 1000:                            #feature_words的维度为1000
            break                               
        #如果这个词不是数字,并且不是指定的结束语,并且单词长度大于1小于5,那么这个词就可以作为特征词
        if not all_words_list[t].isdigit() and all_words_list[t] not in stopwords_set and 1 < len(all_words_list[t]) < 5:
            feature_words.append(all_words_list[t])
        n += 1   
    return feature_words

if __name__ == '__main__':
    #文本预处理
    folder_path = './SogouC/Sample'                #训练集存放地址
    all_words_list, train_data_list, test_data_list, train_class_list, test_class_list = TextProcessing(folder_path, test_size=0.2)

    #生成stopwords_set
    stopwords_file = './stopwords_cn.txt'
    stopwords_set = MakeWordsSet(stopwords_file)

    feature_words = words_dict(all_words_list, 100, stopwords_set)
    print(feature_words)

机器学习实战(三):朴素贝叶斯(sklearn)

可以看到,我们已经滤除了那些没有用的词组,这个feature_words就是我们最终选出的用于新闻分类的特征。随后,我们就可以根据feature_words,将文本向量化,然后用于训练朴素贝叶斯分类器。

3、使用Sklearn构建朴素贝叶斯分类器

数据已经处理好了,接下来就可以使用sklearn构建朴素贝叶斯分类器了。

官方英文文档地址:

朴素贝叶斯是一类比较简单的算法,scikit-learn中朴素贝叶斯类库的使用也比较简单。相对于决策树,KNN之类的算法,朴素贝叶斯需要关注的参数是比较少的,这样也比较容易掌握。在scikit-learn中,一共有3个朴素贝叶斯的分类算法类。分别是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。上篇文章讲解的先验概率模型就是先验概率为多项式分布的朴素贝叶斯。

机器学习实战(三):朴素贝叶斯(sklearn)

对于新闻分类,属于多分类问题。我们可以使用MultinamialNB()完成我们的新闻分类问题。另外两个函数的使用暂且不再进行扩展,可以自行学习。MultinomialNB假设特征的先验概率为多项式分布,即如下式:

机器学习实战(三):朴素贝叶斯(sklearn)

其中, P(Xj = Xjl | Y = Ck)是第k个类别的第j维特征的第l个取值条件概率。mk是训练集中输出为第k类的样本个数。λ为一个大于0的常数,常常取值为1,即拉普拉斯平滑,也可以取其他值。

接下来,我们看下MultinamialNB这个函数,只有3个参数:

 

参数说明如下:

  • alpha:浮点型可选参数,默认为1.0,其实就是添加拉普拉斯平滑,即为上述公式中的λ ,如果这个参数设置为0,就是不添加平滑;
  • fit_prior:布尔型可选参数,默认为True。布尔参数fit_prior表示是否要考虑先验概率,如果是false,则所有的样本类别输出都有相同的类别先验概率。否则可以自己用第三个参数class_prior输入先验概率,或者不输入第三个参数class_prior让MultinomialNB自己从训练集样本来计算先验概率,此时的先验概率为P(Y=Ck)=mk/m。其中m为训练集样本总数量,mk为输出为第k类别的训练集样本数。
  • class_prior:可选参数,默认为None。

总结如下:

机器学习实战(三):朴素贝叶斯(sklearn)

除此之外,MultinamialNB也有一些方法供我们使用:

机器学习实战(三):朴素贝叶斯(sklearn)

Methods

fit(X, y[, sample_weight]) 根据X,y拟合Naive Bayes分类器
get_params([deep]) 获取此估计器的参数
partial_fit(X, y[, classes, sample_weight]) 批量样品的增量拟合
predict(X) 对测试向量X的数组执行分类
predict_joint_log_proba(X) 返回测试向量X的联合对数概率估计
predict_log_proba(X) 测试向量X的返回对数概率估计
predict_proba(X) 测试向量X的返回概率估计
score(X, y[, sample_weight]) 返回给定测试数据和标签的平均精度
set_params(**params) 设置此估计器的参数

MultinomialNB一个重要的功能是有partial_fit方法,这个方法的一般用在如果训练集数据量非常大,一次不能全部载入内存的时候。这时我们可以把训练集分成若干等分,重复调用partial_fit来一步步的学习训练集,非常方便。GaussianNB和BernoulliNB也有类似的功能。 在使用MultinomialNB的fit方法或者partial_fit方法拟合数据后,我们可以进行预测。此时预测有三种方法,包括predict,predict_log_proba和predict_proba。predict方法就是我们最常用的预测方法,直接给出测试集的预测类别输出。predict_proba则不同,它会给出测试集样本在各个类别上预测的概率。容易理解,predict_proba预测出的各个类别概率里的最大值对应的类别,也就是predict方法得到类别。predict_log_proba和predict_proba类似,它会给出测试集样本在各个类别上预测的概率的一个对数转化。转化后predict_log_proba预测出的各个类别对数概率里的最大值对应的类别,也就是predict方法得到类别。具体细节不再讲解,可参照官网手册。

了解了这些,我们就可以编写代码,通过观察取不同的去掉前deleteN个高频词的个数与最终检测准确率的关系,确定deleteN的取值:

from sklearn.naive_bayes import MultinomialNB
import matplotlib.pyplot as plt
import os
import random
import jieba
 
"""
函数说明:中文文本处理
 
Parameters:
    folder_path - 文本存放的路径
    test_size - 测试集占比,默认占所有数据集的百分之20
Returns:
    all_words_list - 按词频降序排序的训练集列表
    train_data_list - 训练集列表
    test_data_list - 测试集列表
    train_class_list - 训练集标签列表
    test_class_list - 测试集标签列表

"""
def TextProcessing(folder_path, test_size = 0.2):
    folder_list = os.listdir(folder_path)                        #查看folder_path下的文件
    data_list = []                                                #数据集数据
    class_list = []                                                #数据集类别
 
    #遍历每个子文件夹
    for folder in folder_list:
        new_folder_path = os.path.join(folder_path, folder)        #根据子文件夹,生成新的路径
        files = os.listdir(new_folder_path)                        #存放子文件夹下的txt文件的列表
 
        j = 1
        #遍历每个txt文件
        for file in files:
            if j > 100:                                            #每类txt样本数最多100个
                break
            with open(os.path.join(new_folder_path, file), 'r', encoding = 'utf-8') as f:    #打开txt文件
                raw = f.read()
 
            word_cut = jieba.cut(raw, cut_all = False)            #精简模式,返回一个可迭代的generator
            word_list = list(word_cut)                            #generator转换为list
 
            data_list.append(word_list)                            #添加数据集数据
            class_list.append(folder)                            #添加数据集类别
            j += 1
 
    data_class_list = list(zip(data_list, class_list))            #zip压缩合并,将数据与标签对应压缩
    random.shuffle(data_class_list)                                #将data_class_list乱序
    index = int(len(data_class_list) * test_size) + 1            #训练集和测试集切分的索引值
    train_list = data_class_list[index:]                        #训练集
    test_list = data_class_list[:index]                            #测试集
    train_data_list, train_class_list = zip(*train_list)        #训练集解压缩
    test_data_list, test_class_list = zip(*test_list)            #测试集解压缩
 
    all_words_dict = {}                                            #统计训练集词频
    for word_list in train_data_list:
        for word in word_list:
            if word in all_words_dict.keys():
                all_words_dict[word] += 1
            else:
                all_words_dict[word] = 1
 
    #根据键的值倒序排序
    all_words_tuple_list = sorted(all_words_dict.items(), key = lambda f:f[1], reverse = True)
    all_words_list, all_words_nums = zip(*all_words_tuple_list)    #解压缩
    all_words_list = list(all_words_list)                        #转换成列表
    return all_words_list, train_data_list, test_data_list, train_class_list, test_class_list
 
"""
函数说明:读取文件里的内容,并去重
 
Parameters:
    words_file - 文件路径
Returns:
    words_set - 读取的内容的set集合

"""
def MakeWordsSet(words_file):
    words_set = set()                                            #创建set集合
    with open(words_file, 'r', encoding = 'utf-8') as f:        #打开文件
        for line in f.readlines():                                #一行一行读取
            word = line.strip()                                    #去回车
            if len(word) > 0:                                    #有文本,则添加到words_set中
                words_set.add(word)                               
    return words_set                                             #返回处理结果
 
"""
函数说明:根据feature_words将文本向量化
 
Parameters:
    train_data_list - 训练集
    test_data_list - 测试集
    feature_words - 特征集
Returns:
    train_feature_list - 训练集向量化列表
    test_feature_list - 测试集向量化列表
"""
def TextFeatures(train_data_list, test_data_list, feature_words):
    def text_features(text, feature_words):                        #出现在特征集中,则置1                                               
        text_words = set(text)
        features = [1 if word in text_words else 0 for word in feature_words]
        return features
    train_feature_list = [text_features(text, feature_words) for text in train_data_list]
    test_feature_list = [text_features(text, feature_words) for text in test_data_list]
    return train_feature_list, test_feature_list                #返回结果
 
 
"""
函数说明:文本特征选取
 
Parameters:
    all_words_list - 训练集所有文本列表
    deleteN - 删除词频最高的deleteN个词
    stopwords_set - 指定的结束语
Returns:
    feature_words - 特征集
"""
def words_dict(all_words_list, deleteN, stopwords_set = set()):
    feature_words = []                            #特征列表
    n = 1
    for t in range(deleteN, len(all_words_list), 1):
        if n > 1000:                            #feature_words的维度为1000
            break                               
        #如果这个词不是数字,并且不是指定的结束语,并且单词长度大于1小于5,那么这个词就可以作为特征词
        if not all_words_list[t].isdigit() and all_words_list[t] not in stopwords_set and 1 < len(all_words_list[t]) < 5:
            feature_words.append(all_words_list[t])
        n += 1
    return feature_words
 
"""
函数说明:新闻分类器
 
Parameters:
    train_feature_list - 训练集向量化的特征文本
    test_feature_list - 测试集向量化的特征文本
    train_class_list - 训练集分类标签
    test_class_list - 测试集分类标签
Returns:
    test_accuracy - 分类器精度
"""
def TextClassifier(train_feature_list, test_feature_list, train_class_list, test_class_list):
    classifier = MultinomialNB().fit(train_feature_list, train_class_list)
    test_accuracy = classifier.score(test_feature_list, test_class_list)
    return test_accuracy
 
if __name__ == '__main__':
    #文本预处理
    folder_path = './SogouC/Sample'                #训练集存放地址
    all_words_list, train_data_list, test_data_list, train_class_list, test_class_list = TextProcessing(folder_path, test_size=0.2)
 
    # 生成stopwords_set
    stopwords_file = './stopwords_cn.txt'
    stopwords_set = MakeWordsSet(stopwords_file)
 
 
    test_accuracy_list = []
    deleteNs = range(0, 1000, 20)                #0 20 40 60 ... 980
    for deleteN in deleteNs:
        feature_words = words_dict(all_words_list, deleteN, stopwords_set)
        train_feature_list, test_feature_list = TextFeatures(train_data_list, test_data_list, feature_words)
        test_accuracy = TextClassifier(train_feature_list, test_feature_list, train_class_list, test_class_list)
        test_accuracy_list.append(test_accuracy)
 
    plt.figure()
    plt.plot(deleteNs, test_accuracy_list)
    plt.title('Relationship of deleteNs and test_accuracy')
    plt.xlabel('deleteNs')
    plt.ylabel('test_accuracy')
    plt.show()

机器学习实战(三):朴素贝叶斯(sklearn)

 

选择450输出,试试精确度。

if __name__ == '__main__':
    #文本预处理
    folder_path = 'F:\machinelearning\\naive_bayes\SogouC\Sample'                #训练集存放地址
    all_words_list, train_data_list, test_data_list, train_class_list, test_class_list = TextProcessing(folder_path, test_size=0.2)

    stopwords_file = 'F:\machinelearning\\naive_bayes\stopwords_cn.txt'
    stopwords_set = MakeWordsSet(stopwords_file)

    test_accuracy_list = []
    feature_words = words_dict(all_words_list, 450, stopwords_set)
    train_feature_list, test_feature_list = TextFeatures(train_data_list, test_data_list, feature_words)
    test_accuracy = TextClassifier(train_feature_list, test_feature_list, train_class_list, test_class_list)
    test_accuracy_list.append(test_accuracy)
    #ave = lambda c: sum(c) / len(c)    
    #print(ave(test_accuracy_list))
    print(test_accuracy_list)

机器学习实战(三):朴素贝叶斯(sklearn)

 

4 本章小结

对于分类而言,使用概率有时要比使用硬规则更为有效。贝叶斯概率及贝叶斯准则提供了一种利用已知值来估计未知概率的有效方法。可以通过特征之间的条件独立性假设,降低对数据量的需求。独立性假设是指一个词的出现概率并不依赖于文档中的其他词。当然我们也知道这个假设过于简单。这就是之所以称为朴素贝叶斯的原因。尽管条件独立性假设并不正确,但是朴素贝叶斯仍然是一种有效的分类器。利用现代编程语言来实现朴素贝叶斯时需要考虑很多实际因素。下溢出就是其中一个问题,它可以通过对概率取对数来解决。词袋模型在解决文档分类问题上比词集模型有所提高。还有其他一些方面的改进,比如说移除停用词,当然也可以花大量时间对切分器进行优化。

参考资料:

  1. 本文的代码部分参考机器学习实战
  2. 本文的理论部分,参考自《统计学习方法 李航》

 

 

 

相关文章
weinxin
我的公众号
微信扫一扫
TianFeng
  • 本文由 发表于 2022年 11月 1日 18:17:08
  • 转载请务必保留本文链接:https://tianfeng.space/307.html