Это хорошее использование для набора инструментов для естественного языка ( NLTK ). Этот набор инструментов может быть слишком мощным для того, что вы пытаетесь сделать, но он также может быть ярлыком.Нет смысла изобретать велосипед для создания сюжета.
например, предположим, что у меня есть следующий текст (temp.txt)
Сколько дерева будет бросать сурок, если сурок мог бросить дерево?Он бросил бы, он сделал бы столько, сколько мог, И бросил бы так много дерева, как сурок, Если бы сурок мог бросить дерево.
вот код для генерации и построения простого freqDist
from nltk.tokenize import word_tokenize as tokenize
from nltk.probability import FreqDist
from nltk.text import Text
def freqDist(infile):
'''tokenize and return a simple fd'''
fn = open('/home/matt/temp','r')
tokens = tokenize(fn.read())
fn.close()
t = Text(tokens)
fd = FreqDist(t)
return fd
-
Предполагая, что вы не используете функцию, давайте посмотрим на следующеедает нам
>>> tokens
['How', 'much', 'wood', 'would', 'a', 'woodchuck', 'chuck', 'If', 'a', 'woodchuck', 'could', 'chuck', 'wood', '?', 'He', 'would', 'chuck', ',', 'he', 'would', ',', 'as', 'much', 'as', 'he', 'could', ',', 'And', 'chuck', 'as', 'much', 'wood', 'as', 'a', 'woodchuck', 'would', 'If', 'a', 'woodchuck', 'could', 'chuck', 'wood', '.']
>>> t
<Text: How much wood would a woodchuck chuck If...>
>>> fd
<FreqDist with 43 outcomes>
>>> fd[wood]
4
и, наконец,
>>#Freq of the top five words
>>fd.plot(10)

Но, вы хотите длины токена!
, которые мы можем сгенерировать с помощьюпростая модификация кода
from nltk.tokenize import word_tokenize as tokenize
from nltk.probability import FreqDist
from nltk.text import Text
def fDist(infile):
'''tokenize and return a simple fd'''
fn = open(infile,'r')
tokens = tokenize(fn.read())
token_lengths = [len(token) for token in tokens]
#if you do not want to include only words (not punctuation)
#token_lengths = [len(token) for token in tokens if token.isalpha()]
fn.close()
t = Text(token_lengths)
fd = FreqDist(t)
return fd
, так что ...
>>fd=Fdist('/home/user/temp.txt')
>>fd.plot()

Позволяет соединить его, чтобы сделать что-то полезное и многократно используемое
from nltk.tokenize import word_tokenize as tokenize
from nltk.probability import FreqDist
from nltk.text import Text
import sys
def fDist(infile):
'''tokenize and return a simple fd'''
fn = open(infile,'r')
tokens = tokenize(fn.read())
token_lengths = [len(token) for token in tokens]
#if you do not want to include only words (not punctuation)
#token_lengths = [len(token) for token in tokens if token.isalpha()]
fn.close()
t = Text(token_lengths)
fd = FreqDist(t)
return fd
def main():
fd = fDist(sys.argv[1])
fd.plot()
if __name__ == '__main__':
main()
теперь вы можете вызвать вышеуказанное из строки cmd следующим образом:
./fdist.py infile.txt
вы могли бы пойти дальше и добавить несколько проверок, чтобы убедиться, что у вас есть правильный файл, но это выходит за рамкиэтого вопроса.