2017-02-02 2 views
0

Ist es möglich, ein Element aus einer Liste mit Python nach der Zipf-Verteilung auszuwählen?Wählen Sie Elemente aus der Liste mit einer Zipf-ähnlichen Auswahl in Python

Angenommen, ich habe eine Liste:

objlist = ['Here', 'in', 'the', 'wall', 'why'] 

Bisher habe ich https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.zipf.html gesehen, aber ich kann die Lösung nicht herausgefunden.

Vielen Dank im Voraus.

+0

Meinst du die tatsächliche Häufigkeit dieser Wörter in der englischen Sprache? –

+0

Ja. Ich möchte die Elemente nach Zipfs Verteilung auswählen. Wenn ich deine Frage verstehe – Antonis

Antwort

0

Verwenden Sie einfach den Ausgang numpy.random.zipf(shape_parameter) als Index für Ihre Liste. Allerdings gibt es das Problem, dass die ZIPF-Distribution nicht gebunden ist und der Wert möglicherweise größer als Ihr Index ist. Setzen Sie es in einen try:except: Block ein.
Wenn Sie Ihren Code mehrmals ausführen, werden verschiedene Werte aus Ihrer Liste gezeichnet. Da die ZIPF-Distribution jedoch nicht gebunden ist und Ihr Listenindex nicht vorhanden ist, wird sie nicht exakt zipf-verteilt.

Saple Code:

objlist = ['Here', 'in', 'the', 'wall', 'why'] 
index = np.random.zipf([1.2, 1.2]) 
for idx in index: 
    if idx < len(objlist): 
     print(objlist[idx]) 
    else: 
     print "Index {} exceed list".format(idx) 

Wikipedia: Zipf Distribution

+0

Hhm interessanter Vorschlag. Ist es möglich, ein Beispiel für Code zu setzen? Es ist ein bisschen schwierig für mich, weil ich die Verteilung nicht verstehen kann. – Antonis

+0

Sehr nützlich. Eine letzte Frage. Wenn ich 2 Werte entsprechend auswählen möchte, wie kann ich das erreichen? – Antonis

+0

Bitte akzeptieren Sie die Antwort und Upvote, wenn Sie es mögen. Es ist mindestens eine Belohnung für die Arbeit, die Sie nicht bezahlt haben;) – UpSampler

0

Ich hoffe, im Ihre Forderungen nicht Missverständnis, hier ist mein Code:

import random 
objlist = ['Here', 'in', 'the', 'wall', 'why'] 
print random.choice(objlist) 
+0

upvote das wählt einfach Wert zufällig.Ich möchte die Zips Verteilung in Auswahl folgen. – Antonis

2

nach Auswahl der tatsächlichen empirischen Zipf Verteilung, Sie benötige zuerst eine Tabelle der Häufigkeiten der englischen Wörter. Wenn die 100.000 häufigsten tun, können Sie eine here bekommen.

Das ist ein pdf ist, ist Text leichter zu handhaben, so dass es zu konvertieren, auf Linux können Sie

pdftotext freq100000.pdf

Dies tun schaffen eine Textdatei freq100000.txt, die Sie mit dem folgenden kleinen Skript verwenden können

import re 
import numpy as np 

record = re.compile('[0-9]+ [0-9]+ [a-z]+') 
data = {} 
for line in open('freq100000.txt'): 
    m = record.match(line.strip()) 
    if not m is None: 
     rank, freq, word = m.group(0).split() 
     data[word] = int(rank), int(freq) 

def rel_freqs(wlist): 
    freqs = np.array([data[word.lower()][1] for word in wlist]) 
    ps = np.add.accumulate(freqs) 
    choice = np.searchsorted(ps, np.random.randint(ps[-1])) 
    return choice 

rel_freqs(['Here', 'in', 'the', 'wall', 'why']) 

Die Funktion rel_freqs wählt nach dem Zufallsprinzip ein Wort aus einer Liste aus und gibt ihren Index zurück. Die Wahrscheinlichkeit, ein Wort zu zeichnen, ist proportional zu seiner Häufigkeit im Englischen.

+0

Ok, ich verstehe Ihren Standpunkt und danke Ihnen. Aber ich bin Neuling mit Distributionen und ich bin mit diesem Beispiel verwickelt.Ich möchte dies im Falle meiner Liste anpassen und es ist schwierig – Antonis

+0

Ok, lasst uns Schritt für Schritt versuchen: Ist es dir gelungen, (1) das Wörterbuch herunterzuladen? (2) es in Text umwandeln? (3) Ausführen des Skripts? - Ich füge eine Zeile hinzu, die den Funktionsaufruf anzeigt. –

+0

Ok, ich habe es verstanden. +1. Ich werde es versuchen. Danke. – Antonis

Verwandte Themen