Cara menggunakan Python untuk menulis program solitaire puisi

PHPz
Lepaskan: 2023-05-13 17:37:06
ke hadapan
1724 orang telah melayarinya

Korpus Puisi

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

Cara menggunakan Python untuk menulis program solitaire puisi

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, jumlah keseluruhan 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('
')
Salin selepas log masuk

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, nilai (nilai) ialah puisi yang sepadan dengan pinyin, dan simpan kamus sebagai fail acar. . 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()
Salin selepas log masuk

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

Cara menggunakan Python untuk menulis program solitaire puisi

Kandungan fail jeruk (bahagian)

Sudah tentu, satu pinyin boleh sepadan dengan berbilang puisi.

Solitari Puisi

  Baca fail jeruk, tulis program dan jalankan atur cara 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')
Salin selepas log masuk

ke

data_path = os.path.join(os.getcwd(), 'Mandarin.dat')
Salin selepas log masuk

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 机器接龙): '))
Salin selepas log masuk

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

Cara menggunakan Python untuk menulis program solitaire puisi

Fail projek

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

pyinstaller -F Poem_jielong.py
Salin selepas log masuk

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:

Cara menggunakan Python untuk menulis program solitaire puisi

halaman permulaan fail exe

Projek ini Terdapat dua mod Poetry Solitaire Satu ialah manual Solitaire, di mana anda mula-mula memasukkan puisi atau perkataan, dan kemudian komputer membalas dengan ayat dan bertanggungjawab terhadap peraturan 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:

Cara menggunakan Python untuk menulis program solitaire puisi

Solaire Manual

 Kemudian uji mod Solitaire mesin:

Cara menggunakan Python untuk menulis program solitaire puisi

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

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan