Hướng dẫn sentence generator from word list python - trình tạo câu từ danh sách từ python

Vì vậy, tôi đang cố gắng học Python và tôi đã viết mã này được cho là tạo câu từ danh sách các từ ngẫu nhiên và số ngẫu nhiên, tôi đã bắt đầu với mã này nhưng tôi không chắc nó có hoạt động

Đây là mã của tôi:

import random

num = random.randrange[0, 9]
drug = ['Advil', 'Synthroid', 'Crestor', 'Nexium', 'Vyvanse', 'Lyrica']
form = ['capsule', 'tablet', 'Powder', 'gel', 'liquid solution', 'Eye drops']

lines = []
for item in drug, form:
    line = '- the patient was prescribed [' + num + '][dosage] [' + item.form + '][form] of [' + item.drug + '] for [' + num + 'days][Duration]
    lines.append[line]

Đây là kết quả tôi mong đợi:

[the patient was prescribed [1][Dosage] [capsule][Form] of [Advil][Drug] for [5 days][Duration],
the patient was prescribed [2][Dosage] [Powder][Form] of [Nexium][Drug] for [6 days][Duration],
the patient was prescribed [5][Dosage] [luiquid solution][Form] of [Vyvanse][Drug] for [4 days][Duration],
...]

Ảnh của RawPixel trên unplash

Hãy nói thật lòng: các tiêu đề tin tức hôm nay là điên rồ. Họ đặc biệt điên rồ nếu họ quan tâm Donald Trump. Thật điên rồ đôi khi bạn tự hỏi liệu họ có thật không! Là những gì bạn đọc một cái gì đó thực sự đã xảy ra hoặc chỉ là một bộ sưu tập ngẫu nhiên các từ được tạo thành một tiêu đề tin tức? Cần một ví dụ?
Need an example?

Donald Trump ‘đã cấm kỳ lân‘ đến Bắc Triều Tiên

Điên rồ, phải không? Được cho là, tiêu đề này dựa trên một cái gì đó, đứa trẻ nhỏ của nữ diễn viên Alyssa Milano nói. Không trưởng thành sẽ nghĩ ra điều gì đó thật lố bịch

Sean Donald Trump là một con kỳ lân, cưỡi một con kỳ lân trên cầu vồng, theo Sean Spicer

Oh boy.to Me, nghe có vẻ như được tạo bởi một trình tạo câu ngẫu nhiên. Mặc dù thật đáng buồn, tôi đã tự hỏi bao nhiêu [hoặc nếu] các tiêu đề tin tức được tạo ngẫu nhiên có thể trở nên điên rồ hơn thế. Vì vậy, tôi quyết định xây dựng một kịch bản Python và tự mình xem.
To me, that sounds like it was generated by a random sentence generator. While it sadly wasn’t, I wondered how much [or if] randomly generated news headlines could get crazier than that. So I decided to build a Python script and see for myself.

Kịch bản bao gồm một máy quét web nhanh để có càng nhiều tiêu đề tin tức càng tốt và sử dụng chúng trong trình tạo câu mô hình Markov để tạo tiêu đề tin tức giả mạo thực sự của riêng tôi. Mặc dù kiểu dữ liệu từ điển Python có vẻ phù hợp ban đầu cho mô hình Markov, tôi muốn sử dụng khung dữ liệu và gấu trúc cho nó. Đơn giản vì tôi muốn thực hành một số chức năng của gấu trúc và cuối cùng tôi không quan tâm đến cách thức thanh lịch nhất của người Viking để làm điều đó trong trường hợp này, nhưng tôi muốn có một kết quả nhanh chóng và tìm hiểu điều gì đó trên đường. đang truy cập một trang web tin tức phổ biến bằng cách sử dụng từ khóa 'Donald Trump'. Sau đó tôi đã cách ly văn bản chứa các tiêu đề và viết chúng vào một tệp văn bản. Tôi thấy trang web này cực kỳ hữu ích để thiết lập đoạn mã nhỏ của mình:
First, I set up a script which is accessing a popular news site using the keywords ‘Donald Trump’. I then isolated the text containing the headlines and wrote them into a text file. I found this website extremely helpful to set up my little piece of code:

//realpython.com/python-web-scraping-practical-introduction/

Vào bất kỳ ngày nào, điều này sẽ cho tôi khoảng 100 tiêu đề tin tức. Không tệ, nhưng tất nhiên làm điều đó một lần cho rất ít từ ngữ để làm việc và chuỗi Markov của tôi đang có nguy cơ rơi vào một chuỗi từ duy nhất - và trong trường hợp xấu nhất - chỉ đơn giản là lặp lại và tiêu đề tin tức hiện có . Rất may, thật dễ dàng để thiết lập một bộ lập lịch tác vụ trong Windows sẽ thực thi tệp của tôi mỗi ngày trong nền và để tệp văn bản của tôi phát triển liên tục. Tất cả những gì tôi phải làm bây giờ là kiên nhẫn và chờ đợi cho đến khi một lượng tiêu đề đáng kể được tích lũy. Sau khoảng 1 1/2 tuần tôi có hơn 1000 tiêu đề. Tôi quyết định rằng đó là đủ cho một dự án rất không khoa học và vô nghĩa như vậy. Sau khi tải tệp văn bản của tôi và thực hiện một số việc dọn dẹp thô trong việc loại bỏ một số chữ ký đầu ra tin tức định kỳ và dấu câu gấp đôi, v.v., cuối cùng tôi có thể bắt đầu làm việc văn bản vào mô hình Markov của mình. Tôi quyết định sử dụng tiền tố hoặc ‘chì của một từ. Tôi không muốn có được thông tin chi tiết về chuỗi Markov, nhưng trong ngắn gọn tôi sẽ tóm tắt nó như thế này: Đối với mỗi từ chúng tôi thu thập từng từ sau trong bất kỳ câu nào. Dựa trên tần suất của một từ sau so với ‘đối thủ của nó, chúng tôi sẽ chỉ định khả năng của một từ theo một từ chính nhất định. Sau đó, chúng tôi có thể bắt đầu với một từ ngẫu nhiên từ toàn bộ danh sách các từ trong văn bản của chúng tôi và sau đó chọn ngẫu nhiên từ tiếp theo trong câu của chúng tôi với xác suất dựa trên khả năng chúng tôi đã gán. Word for Word, chúng tôi sẽ tạo một câu mới dựa trên các thuộc tính của văn bản chúng tôi sử dụng làm đầu vào. Tin tức thực sự trong → tin tức giả mạo thực sự.
For each word we collect each following word in any sentence. Based on the frequency of a following word compared to its ‘rivals’, we will assign the likelihood of a word following a certain lead word. We can then start with a random word from the entire list of words in our text and then randomly select the next word in our sentence with probabilities based on the likelihoods we assigned. Word for word we will create a new sentence that is based on the properties of the text we used as input. Real news in → real fake news out.

Sau khi chia tệp văn bản thành các từ riêng lẻ và lưu trữ chúng trong một biến ‘words’, tôi đã xác định khung dữ liệu gấu trúc với ba cột: một cột ‘lead’ Xác định từ hàng đầu. Đối với mỗi từ hàng đầu, có một từ ‘theo sau và được ghi lại trong cột thứ hai của chúng tôi

[the patient was prescribed [1][Dosage] [capsule][Form] of [Advil][Drug] for [5 days][Duration],
the patient was prescribed [2][Dosage] [Powder][Form] of [Nexium][Drug] for [6 days][Duration],
the patient was prescribed [5][Dosage] [luiquid solution][Form] of [Vyvanse][Drug] for [4 days][Duration],
...]
0. Cột thứ ba -________ 11- sẽ hiển thị số lần chúng ta có thể quan sát một sự kết hợp nhất định của một ’chì và một‘ theo dõi trong văn bản của chúng tôi. Chúng ta sẽ lấp đầy những cột này bằng những gì? Chà, cột đầu tiên rất dễ dàng - đơn giản là mỗi từ trong văn bản của chúng tôi sẽ được viết thành một hàng trong cột này. Đối với mỗi từ có chỉ mục I trong văn bản của chúng tôi, từ sau đây là từ có chỉ mục I + 1. Chúng tôi chỉ cần bắt đầu bằng cách điền vào cột ‘theo dõi văn bản của chúng tôi một lần nữa, nhưng lần này bắt đầu với từ thứ hai trong văn bản. Đối với một văn bản ban đầu n hàng, điều này lấp đầy các từ N-1 theo dõi. Từ cuối cùng trong văn bản của chúng tôi không tự động có người theo dõi, vì vậy chúng tôi sẽ sử dụng một biến chuỗi tổng hợp để lấp đầy khoảng trống. Tôi gọi nó là ‘Endword, [xin vui lòng không nhầm lẫn nó với một điều âm thanh tương tự mà Tổng thống được cho là đã nói trên một số băng tập sự bí ẩn].

import pandas as pd
dict_df = pd.DataFrame[columns = [‘lead’, ‘follow’, ‘freq’]]
dict_df['lead']=words
follow = words[1:]
follow.append['EndWord']

Trước khi tôi tiếp tục, tôi sẽ tạo ra một mảng các từ riêng biệt chứa tất cả các từ cuối cùng của mỗi câu. Trong mã sau của tôi, tôi sẽ sử dụng các từ cuối này để kết thúc câu được tạo ngẫu nhiên của tôi. Điều này có tác dụng phụ tốt đẹp mà tôi không phải lo lắng về chuỗi Markov của mình chạy trên các tiêu đề trên khắp, có nghĩa là từ cuối cùng của một tiêu đề không nên được coi là dẫn đầu cho từ đầu tiên của tiêu đề sau. Sau tất cả, tôi không xử lý một văn bản liên tục, mà với các câu cá nhân và độc lập. Bằng cách cắt câu của tôi sau khi trình tạo câu của tôi nhận được một

[the patient was prescribed [1][Dosage] [capsule][Form] of [Advil][Drug] for [5 days][Duration],
the patient was prescribed [2][Dosage] [Powder][Form] of [Nexium][Drug] for [6 days][Duration],
the patient was prescribed [5][Dosage] [luiquid solution][Form] of [Vyvanse][Drug] for [4 days][Duration],
...]
2 như vậy, đây không phải là một mối quan tâm.

end_words = []
for word in words:
if word[-1] in ['.','!','?'] and word != '.':
end_words.append[word]
print[end_words]

Càng xa càng tốt. Bây giờ tôi đếm sự xuất hiện của từng sự kết hợp của từ chì và theo dõi và gán kết quả cho cột tần số bằng group_by và biến đổi.

dict_df['freq']= dict_df.groupby[by=['lead','follow']]['lead','follow'].transform['count'].copy[]

Các hàng vẫn không phải là duy nhất, vì vậy tôi xóa các hàng trùng lặp trước khi sử dụng chức năng trục trong Python để tạo một ma trận lớn với mỗi từ chì như chỉ số hàng và mỗi từ theo dõi dưới dạng một cột. Tần số của sự kết hợp của từ chì theo hàng I và từ sau trong cột J sau đó là phần tử a_ij trong ma trận này.

dict_df = dict_df.drop_duplicates[]
pivot_df = dict_df.pivot[index = 'lead', columns= 'follow', values='freq']

Đối với mỗi hàng, sau đó tôi tổng hợp tất cả các tần số và chia từng phần tử theo hàng i cho tổng số hàng i. Điều này dẫn đến tỷ lệ phần trăm tổng lên đến 1 mà trình tạo câu của tôi sẽ sử dụng làm phân phối xác suất khi chọn từ theo dõi cho một từ chì nhất định. Ví dụ. Nếu sau từ ‘giả, chúng tôi quan sát gấp 7 lần từ‘ tin tức và 3 lần từ ‘tan, thì xác suất kết quả sẽ được chọn sẽ lần lượt là 0,7 và 0,3.

sum_words = pivot_df.sum[axis=1]
pivot_df = pivot_df.apply[lambda x: x/sum_words]

Với tất cả điều này tại chỗ, tôi có thể xác định chức năng của mình cho trình tạo câu. Tôi lấy một từ bắt đầu để khởi tạo trình tạo câu. Từ này có thể là một từ được chọn ngẫu nhiên từ tập hợp tất cả các từ. Nhưng vì văn bản của tôi chỉ bao gồm các tiêu đề của Donald Trump, tôi nghĩ rằng thật hợp lý khi đảm bảo tên của anh ấy xuất hiện trong tiêu đề tin tức giả của chúng tôi. Trong các ví dụ của tôi, do đó tôi bắt đầu với ‘Donald. Bắt đầu với từ này, trình tạo chọn một từ theo dõi dựa trên ma trận xác suất chúng tôi thiết lập. Nó sẽ tiếp tục bằng cách sử dụng từ theo dõi được chọn làm từ dẫn đầu mới để nối từ sau từ vào câu của chúng tôi. Nếu trình tạo câu có được một từ nằm trong mảng các từ cuối của chúng tôi, câu sẽ lấy từ này là phần cuối cùng và trả lại câu của chúng tôi. Nếu trình tạo đến tổng hợp của chúng tôi ‘Endword, chúng tôi đã xác định trước đó, nó sẽ chỉ rút một từ mới theo dõi cho từ chính đưa chúng tôi xuống con đường ngõ cụt này. Điều tương tự cũng áp dụng nếu chúng ta nhận được một từ kết thúc và câu của chúng ta chỉ dài 2 từ [tôi đã có một vài câu ví dụ chỉ đọc một Donald Donald Trump. Giống như trong Donald Donald Trump.

from numpy.random import choice
def make_a_sentence[start]:
word= start
sentence=[word]
while len[sentence] < 30:
next_word = choice[a = list[pivot_df.columns], p = [pivot_df.iloc[pivot_df.index ==word].fillna[0].values][0]]
if next_word == 'EndWord':
continue
elif next_word in end_words:
if len[sentence] > 2:
sentence.append[next_word]
break
else :
continue
else :
sentence.append[next_word]
word=next_word
sentence = ' '.join[sentence]
return sentence
sentence = make_a_sentence['Donald']

Và đó là nó.

Tôi chắc chắn đã giành chiến thắng trong một cuộc thi sắc đẹp [Trump đã tổ chức] với mã này, nhưng nó rất nhanh, bẩn, Python-Noob thân thiện và thực hiện công việc. Được cấp, văn bản càng lớn, toàn bộ quá trình gán xác suất sẽ càng chậm, nhưng đối với mẫu của tôi, vẫn chỉ mất vài giây nên tôi không thấy sự cần thiết phải tối ưu hóa thời gian. Thay vào đó, hãy để một số tiêu đề giả mạo thực sự của các tiêu đề giả mạo: Thay vào đó:

Donald vấp phải những lời chỉ trích về Trump bị ám ảnh bởi Star Wars Burn. - [Âm thanh hợp lý]
- [Sounds plausible]

Donald Trump đã phá vỡ bài kiểm tra lòng trung thành của Donald Trump thực sự.- [Thật tuyệt nếu điều đó xảy ra?]
- [How cool would it be if that happened?]

Đội Donald Trump, hồ sơ khiếu nại chống lại người da trắng.- [vâng, có lẽ là không]
- [Yeah…. probably not]

Donald Trumps những người giỏi nhất tự hào.- [Tệ nhất của anh ấy]
- [His worst too]

Donald Trumps các trợ lý cảm thấy làm tổng thống của mình vào mùa thu này .- [Tất cả chúng ta đều làm tất cả chúng ta đều làm]
- [We all do… we all do]

Donald Trump, Omarosa và các cá nhân khác, bao gồm cả Tổng thống thứ 45 là Junior Mint .- [Fresh?]
-[Fresh?]

Donald Trump, cho đến nay bạn đã đi xa .- [Có thể hơi xa so với sở thích của tôi]
-[Maybe a bit too far for my taste]

Tất nhiên đây là một số ví dụ thành công. Rất nhiều câu được đưa ra là vô nghĩa [không phải là covfefe xứng đáng, nhưng vẫn vô nghĩa]:

Donald Trump biết ai là người làm việc của Aretha Franklin cho cựu trợ lý Omarosa Manigault Newman .- [???]
-[???]

Vậy chúng ta đã học được gì thông qua điều này? Bạn là một độc giả, có lẽ không nhiều. Nhưng tôi đã có một vài tiếng cười vui vẻ với mã của mình và phải làm việc với dữ liệu trong một cấu trúc mà tôi thường gặp phải. Nếu bạn có phản hồi hoặc đề xuất, xin vui lòng tiếp cận. Cảm ơn!

P.S.:

Nếu bạn muốn một phiên bản tinh vi hơn của chuỗi Trump Markov, hãy xem Trình tạo Tweet tweet ngẫu nhiên này bởi một người thông minh hơn:

//filiph.github.io/markov/

Bài Viết Liên Quan

Chủ Đề