信息论:尝试使用其他文本的随机属性创建新文本 PYTHON
INFORMATION THEORY: trying to create new texts using stochastic properties of other texts PYTHON
最近翻到了Shannon的书,看到了有趣的一章:http://math.harvard.edu/~ctm/home/text/others/shannon/entropy/entropy.pdf
我想做的是在 python 中创建一个函数,这样给定一个文本和一个顺序,创建另一个长度为 N 的文本,其随机属性的 k 阶近似文字:
def create_text(text, N, n)
但是,我不知道实现这样一个功能的算法。我想我应该计算字母的频率,但是我如何根据给定的顺序将一些字母与其他字母相关联?
我的尝试:
计算一个字母出现的频率很容易。我开始计算两个字母的频率(我认为它们被称为双字母组)。好吧,我实现了一个递归函数,它似乎适用于小的 tetx,但对于更大的 tetx,它恰好超过了递归深度。当我试图改变递归深度的限制时,它就挂了。然而,对于小文本,它几乎可以工作:
# Input: text, letter, (recursive argument), dictionary for bigrams
def find_next (txt, x, index_txt, dic):
total = txt.count(x)
current = txt.find(x, index_txt)
if current == -1: return
print (current, txt[current+1])
# Set dictionary
keys = dic.keys()
index_dic = x+txt[current+1]
if index_dic in keys:
dic[index_dic] += 1/total
else:
dic[index_dic] = 1/total
find_next(txt, x, current+1, dic)
这个函数统计字母x+另一个出现的频率。但是,当文本以 x 结尾时,函数会因为超出范围而失败。我看到它在错误行 txt[current+1] 中,但我无法弄清楚如何循环返回。我的意思是,当我到达最后一个字母时,回到第一个并结束。
示例:
f = "this is amazing"
如果我启动 find_next (f, 'g', 0, {}) 函数最后会失败,因为我不知道如何将 g 连接到第一个字母 t。
我想这可以解决。但是,当我计算唯一字母(a、b、c、...)和二元字母(ae、ar、at、bg、bj、...)的频率时,接下来要做什么……?八卦之类的?我想不通算法。
提前致谢
解决这个问题的典型方法如下:
分析部分
创建一个n维数组,用于统计已有文本的n-gram(这里不需要递归,这是一个简单的迭代),其中第n维对应n-gram的第n个字母。请注意,这里通常应将非字母映射到单词分隔符以减少特殊情况。
生成部分
- 对于每个要生成的新字母,根据已经生成的最后 n-1 个字母,为下一个字符创建一个简单的概率 table。
- 生成一个随机数以选择下一个可能的字符。
最近翻到了Shannon的书,看到了有趣的一章:http://math.harvard.edu/~ctm/home/text/others/shannon/entropy/entropy.pdf
我想做的是在 python 中创建一个函数,这样给定一个文本和一个顺序,创建另一个长度为 N 的文本,其随机属性的 k 阶近似文字:
def create_text(text, N, n)
但是,我不知道实现这样一个功能的算法。我想我应该计算字母的频率,但是我如何根据给定的顺序将一些字母与其他字母相关联?
我的尝试:
计算一个字母出现的频率很容易。我开始计算两个字母的频率(我认为它们被称为双字母组)。好吧,我实现了一个递归函数,它似乎适用于小的 tetx,但对于更大的 tetx,它恰好超过了递归深度。当我试图改变递归深度的限制时,它就挂了。然而,对于小文本,它几乎可以工作:
# Input: text, letter, (recursive argument), dictionary for bigrams
def find_next (txt, x, index_txt, dic):
total = txt.count(x)
current = txt.find(x, index_txt)
if current == -1: return
print (current, txt[current+1])
# Set dictionary
keys = dic.keys()
index_dic = x+txt[current+1]
if index_dic in keys:
dic[index_dic] += 1/total
else:
dic[index_dic] = 1/total
find_next(txt, x, current+1, dic)
这个函数统计字母x+另一个出现的频率。但是,当文本以 x 结尾时,函数会因为超出范围而失败。我看到它在错误行 txt[current+1] 中,但我无法弄清楚如何循环返回。我的意思是,当我到达最后一个字母时,回到第一个并结束。
示例:
f = "this is amazing"
如果我启动 find_next (f, 'g', 0, {}) 函数最后会失败,因为我不知道如何将 g 连接到第一个字母 t。
我想这可以解决。但是,当我计算唯一字母(a、b、c、...)和二元字母(ae、ar、at、bg、bj、...)的频率时,接下来要做什么……?八卦之类的?我想不通算法。
提前致谢
解决这个问题的典型方法如下:
分析部分
创建一个n维数组,用于统计已有文本的n-gram(这里不需要递归,这是一个简单的迭代),其中第n维对应n-gram的第n个字母。请注意,这里通常应将非字母映射到单词分隔符以减少特殊情况。
生成部分
- 对于每个要生成的新字母,根据已经生成的最后 n-1 个字母,为下一个字符创建一个简单的概率 table。
- 生成一个随机数以选择下一个可能的字符。