Mula-mula, kami menggunakan perangkak Python untuk merangkak puisi dan mencipta korpus. Halaman yang dirangkak adalah seperti berikut:
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(' ')
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.
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()
Kita boleh lihat kandungan fail jeruk (poemDict.pk):
Kandungan fail jeruk (bahagian)
Sudah tentu, satu pinyin boleh sepadan dengan berbilang 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')
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 机器接龙): '))
Kini struktur keseluruhan projek adalah seperti berikut (fail Mandarin.dat disalin daripada folder yang sepadan dengan modul xpinyin):
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.
Jalankan fail Poem_jielong.exe, halamannya adalah seperti berikut:
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:
Solaire Manual
Kemudian uji mod Solitaire mesin:
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!