Создайте список взвешенных слов из файла .txt случайным образом с Python - PullRequest
0 голосов
/ 18 января 2020

Мне нужен код, который генерирует список из ? значимых слов разговора, случайным образом, в соответствии со статистическим распределением сформированного корпуса, то есть они будут генерироваться с учетом частот, назначенных в этом корпусе.

Я начинаю с этой ссылки, которую я очистил, удаляя стоп-слова (в испанском sh) и оставляя только 500 слов чаще всего:

Wikitext

import requests
wiki_url = "https://es.wiktionary.org/wiki/Wikcionario:Frecuentes-(1-1000)-Subt%C3%ADtulos_de_pel%C3%ADculas"
wiki_texto = requests.get(wiki_url).text

from bs4 import BeautifulSoup
wiki_datos = BeautifulSoup(wiki_texto, "html")

wiki_filas = wiki_datos.findAll("tr")
print(wiki_filas[1])

print("...............................")

wiki_celdas = wiki_datos.findAll("td")
print(wiki_celdas[0:])

fila_1 = wiki_celdas[0:]
info_1 = [elemento.get_text() for elemento in fila_1]
print(fila_1)
print(info_1)
info_1[0] = int(float(info_1[0]))
print(info_1)


print("...............................")

num_or = [int(float(elem.findAll("td")[0].get_text())) for elem in wiki_filas[1:]]
palabras = [elem.findAll("td")[1].get_text().rstrip() for elem in wiki_filas[1:]]
frecuencia = [elem.findAll("td")[2].get_text().rstrip() for elem in wiki_filas[1:]]

print(num_or[0:])
print(palabras[0:])
print(frecuencia[0:])

from pandas import DataFrame
tabla = DataFrame([num_or, palabras, frecuencia]).T
tabla.columns = ["Núm. orden", "Palabras", "Frecuencia"]
print(tabla)

print("...............................")

import pandas as pd
from nltk.corpus import stopwords 
prep = stopwords.words('spanish')
print(prep)

tabla_beta = pd.read_html(wiki_url)[0]
tabla_beta.columns = ["Núm. orden", "Palabras", "Frecuencia"]
tabla_beta = tabla_beta[~tabla_beta['Palabras'].isin(prep)].head(500)
print(tabla_beta)

В результате получается кадр данных из 500 регистров и 3 столбцов, последний столбец - частота каждого слова:

enter image description here

Что мне нужно Теперь это код, который случайным образом генерирует предложение с этими словами, учитывая частоту в столбце 3.

Любая помощь приветствуется! Спасибо.

1 Ответ

1 голос
/ 18 января 2020

Numpy уже предоставляет встроенный параметр "p" - обозначает вероятность - в random.choice для генерации взвешенной выборки. Минимальный пример:

import pandas as pd, numpy as np
from collections import Counter

df = pd.DataFrame(dict(words=["a","e","i","o","u"],weights=np.random.randint(5,15,5)))
df["normalized"]=df["weights"]/sum(df["weights"].values)
print(df)

words   weights normalized
0   a   9   0.204545
1   e   13  0.295455
2   i   8   0.181818
3   o   6   0.136364
4   u   8   0.181818

n = 3
l=np.random.choice(df.words,size=(n,),p=df.normalized)
print(l)
array(['u', 'i', 'i'], dtype=object)

Как вы узнали, соблюдаются ли вероятности? Ответ прост: если n достаточно велико, сумма отдельных вхождений, деленная на n, должна приблизительно быть равна нормированному весу слова:

n = 10000
l=np.random.choice(df.words,size=(n,),p=df.normalized)
c=Counter(l)
for key in c: c[key]=c[key]/n
print(c, sum(c.values()))
Counter({'e': 0.2907, 'a': 0.2055, 'u': 0.1882, 'i': 0.1791, 'o': 0.1365}) 1.0
...