Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Program solitaire puisi menulis Python

Program solitaire puisi menulis Python

王林
王林ke hadapan
2023-05-08 09:04:181770semak imbas

Korpus Puisi

   Mula-mula, kami menggunakan perangkak Python untuk merangkak puisi dan mencipta korpus. Halaman yang dirangkak adalah seperti berikut:

Program solitaire puisi menulis Python

Puisi yang dirangkak

Memandangkan artikel ini terutamanya untuk cuba menunjukkan idea projek, oleh itu , hanya yang merangkak Terdapat 300 puisi Tang, 300 puisi kuno, 300 puisi Lagu, dan puisi Lagu terpilih pada halaman, jumlahnya lebih daripada 1,100 puisi. Untuk mempercepatkan perangkak, gunakan concurrency untuk melaksanakan perangkak dan simpan pada fail poem.txt. Program Python yang lengkap adalah seperti berikut:

import re
import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED

# 爬取的诗歌网址
urls = ['https://so.gushiwen.org/gushi/tangshi.aspx',
       'https://so.gushiwen.org/gushi/sanbai.aspx',
       'https://so.gushiwen.org/gushi/songsan.aspx',
       'https://so.gushiwen.org/gushi/songci.aspx'
       ]

poem_links = []
# 诗歌的网址
for url in urls:
   # 请求头部
   headers = {: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}
   req = requests.get(url, headers=headers)

   soup = BeautifulSoup(req.text, "lxml")
   content = soup.find_all('div', class_="sons")[0]
   links = content.find_all('a')

   for link in links:
       poem_links.append('https://so.gushiwen.org'+link['href'])

poem_list = []
# 爬取诗歌页面
def get_poem(url):
   #url = 'https://so.gushiwen.org/shiwenv_45c396367f59.aspx'
   # 请求头部
   headers = {: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}
   req = requests.get(url, headers=headers)
   soup = BeautifulSoup(req.text, "lxml")
   poem = soup.find('div', class_='contson').text.strip()
   poem = poem.replace(' ', '')
   poem = re.sub(re.compile(r"([sS]*?)"), '', poem)
   poem = re.sub(re.compile(r"([sS]*?)"), '', poem)
   poem = re.sub(re.compile(r"。([sS]*?)"), '', poem)
   poem = poem.replace('!', '!').replace('?', '?')
   poem_list.append(poem)

# 利用并发爬取
executor = ThreadPoolExecutor(max_workers=10)  # 可以自己调整max_workers,即线程的个数
# submit()的参数: 第一个为函数, 之后为该函数的传入参数,允许有多个
future_tasks = [executor.submit(get_poem, url) for url in poem_links]
# 等待所有的线程完成,才进入后续的执行
wait(future_tasks, return_when=ALL_COMPLETED)

# 将爬取的诗句写入txt文件
poems = list(set(poem_list))
poems = sorted(poems, key=lambda x:len(x))
for poem in poems:
   poem = poem.replace('《','').replace('》','') 
              .replace(':', '').replace('“', '')
   print(poem)
   with open('F://poem.txt', 'a') as f:
       f.write(poem)
       f.write('
')

Program ini merangkak lebih daripada 1,100 puisi dan menyimpan puisi ke fail poem.txt untuk membentuk korpus puisi kami. Sudah tentu, puisi ini tidak boleh digunakan secara langsung, dan datanya perlu dibersihkan Sebagai contoh, beberapa puisi mempunyai tanda baca yang tidak teratur, ada yang bukan puisi, tetapi hanya mukadimah puisi, dan lain-lain. Proses ini memerlukan operasi manual, walaupun ia. menyusahkan sedikit, tetapi untuk rangkai kata puisi berikutnya Kesannya juga berbaloi.

Ayat Puisi

 Dengan korpus puisi, kita perlu membahagi-bahagikan pantun ialah: mengikut pengakhiran. ? ! Untuk pemecahan klausa, ini boleh dicapai menggunakan ungkapan biasa. Selepas itu, tulis puisi dengan ayat yang baik ke dalam kamus: kunci (kunci) ialah pinyin perkataan pertama ayat, dan nilai (nilai) ialah puisi yang sepadan dengan pinyin, dan simpan kamus sebagai acar. fail. Kod Python yang lengkap adalah seperti berikut:

import re
import pickle
from xpinyin import Pinyin
from collections import defaultdict

def main():
   with open('F://poem.txt', 'r') as f:
       poems = f.readlines()

   sents = []
   for poem in poems:
       parts = re.findall(r'[sS]*?[。?!]', poem.strip())
       for part in parts:
           if len(part) >= 5:
               sents.append(part)

   poem_dict = defaultdict(list)
   for sent in sents:
       print(part)
       head = Pinyin().get_pinyin(sent, tone_marks='marks', splitter=' ').split()[0]
       poem_dict[head].append(sent)

   with open('./poemDict.pk', 'wb') as f:
       pickle.dump(poem_dict, f)

main()

Kita boleh lihat kandungan fail jeruk (poemDict.pk):

Program solitaire puisi menulis Python

Kandungan fail jeruk (bahagian)

Sudah tentu, satu pinyin boleh sepadan dengan berbilang puisi.

Poetry Solitaire

  Baca fail acar, tulis program dan jalankan program sebagai fail exe. Untuk mengelakkan ralat semasa menyusun fail exe, kita perlu menulis semula fail init.py modul xpinyin, salin semua kod fail ke mypinyin.py, dan gantikan kod berikut dalam kod Tulis Semula

data_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
                            'Mandarin.dat')

ke

data_path = os.path.join(os.getcwd(), 'Mandarin.dat')

supaya kami melengkapkan fail mypinyin.py. Seterusnya, kita perlu menulis kod untuk solitaire puisi (Poem_Jielong.py Kod lengkap adalah seperti berikut:

import pickle
from mypinyin import Pinyin
import random
import ctypes

STD_INPUT_HANDLE = -10
STD_OUTPUT_HANDLE = -11
STD_ERROR_HANDLE = -12

FOREGROUND_DARKWHITE = 0x07  # 暗白色
FOREGROUND_BLUE = 0x09  # 蓝色
FOREGROUND_GREEN = 0x0a  # 绿色
FOREGROUND_SKYBLUE = 0x0b  # 天蓝色
FOREGROUND_RED = 0x0c  # 红色
FOREGROUND_PINK = 0x0d  # 粉红色
FOREGROUND_YELLOW = 0x0e  # 黄色
FOREGROUND_WHITE = 0x0f  # 白色

std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)

# 设置CMD文字颜色
def set_cmd_text_color(color, handle=std_out_handle):
   Bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
   return Bool

# 重置文字颜色为暗白色
def resetColor():
   set_cmd_text_color(FOREGROUND_DARKWHITE)

# 在CMD中以指定颜色输出文字
def cprint(mess, color):
   color_dict = {
                 : FOREGROUND_BLUE,
                 : FOREGROUND_GREEN,
                 : FOREGROUND_SKYBLUE,
                 : FOREGROUND_RED,
                 : FOREGROUND_PINK,
                 : FOREGROUND_YELLOW,
                 : FOREGROUND_WHITE
                }
   set_cmd_text_color(color_dict[color])
   print(mess)
   resetColor()

color_list = ['蓝色','绿色','天蓝色','红色','粉红色','黄色','白色']

# 获取字典
with open('./poemDict.pk', 'rb') as f:
   poem_dict = pickle.load(f)

#for key, value in poem_dict.items():
   #print(key, value)

MODE = str(input('Choose MODE(1 for 人工接龙, 2 for 机器接龙): '))

while True:
   try:
       if MODE == '1':
           enter = str(input('
请输入一句诗或一个字开始:'))
           while enter != 'exit':
               test = Pinyin().get_pinyin(enter, tone_marks='marks', splitter=' ')
               tail = test.split()[-1]
               if tail not in poem_dict.keys():
                   cprint('无法接这句诗。
', '红色')
                   MODE = 0
                   break
               else:
                   cprint('
机器回复:%s'%random.sample(poem_dict[tail], 1)[0], random.sample(color_list, 1)[0])
                   enter = str(input('你的回复:'))[:-1]

           MODE = 0

       if MODE == '2':
           enter = input('
请输入一句诗或一个字开始:')

           for i in range(10):
               test = Pinyin().get_pinyin(enter, tone_marks='marks', splitter=' ')
               tail = test.split()[-1]
               if tail not in poem_dict.keys():
                   cprint('------>无法接下去了啦...', '红色')
                   MODE = 0
                   break
               else:
                   answer = random.sample(poem_dict[tail], 1)[0]
                   cprint('(%d)--> %s' % (i+1, answer), random.sample(color_list, 1)[0])
                   enter = answer[:-1]

           print('
(*****最多展示前10回接龙。*****)')
           MODE = 0

   except Exception as err:
       print(err)
   finally:
       if MODE not in ['1','2']:
           MODE = str(input('
Choose MODE(1 for 人工接龙, 2 for 机器接龙): '))

Sekarang struktur keseluruhan projek adalah seperti berikut (fail Mandarin.dat disalin daripada folder yang sepadan dengan modul xpinyin):

Program solitaire puisi menulis Python

Fail projek

Tukar ke folder ini dan masukkan arahan berikut untuk menjana fail exe:

pyinstaller -F Poem_jielong.py

Fail exe yang dijana ialah Poem_jielong.exe, terletak dalam folder jauh folder ini. Untuk membolehkan exe berjalan dengan jayanya, fail poemDict.pk dan Mandarin.dat perlu disalin ke folder dist.

Ujian dijalankan

Jalankan fail Poem_jielong.exe, halamannya adalah seperti berikut:

Program solitaire puisi menulis Python

halaman permulaan fail exe

Projek ini Terdapat dua mod Poetry Solitaire ; mod lain ialah mesin Solitaire, di mana anda Masukkan puisi atau perkataan dahulu, dan mesin akan mengeluarkan puisi Solitaire berikut secara automatik (sehingga 10).  Mula-mula uji mod Solitaire manual:

Program solitaire puisi menulis Python

Solitaire Manual

 Kemudian uji mod Solitaire mesin:

Program solitaire puisi menulis Python

Atas ialah kandungan terperinci Program solitaire puisi menulis Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam