我正在尝试创建一个程序来计算bigram概率。我的第一步是弄清楚一个句子的组合。
每个句子都以<s>
开头,以</s>
结尾。所以可以说我的例句是<s> my name is python </s>
,我的结果应该是(我有p个标签,因为我可以算出之后的概率)
p(my | <s>)
p(name | my )
p (is | name)
p (python | is)
p (</s> | python)
但是相反,我会得到如下结果:
Counter({('<', 's'): 1, ('s', '>'): 1, ('>', 'my'): 1, ('my', 'name'): 1, ('name', 'is'): 1, ('is', 'python'): 1, ('python', '<'): 1, ('<', '/s'): 1, ('/s', '>'): 1})
我如何将<s>
和</s>
分开作为一个单独的单词,而不将其拆分。
我的代码是:
text = "<s> my name is python </s>"
token = nltk.word_tokenize(text)
bigrams = ngrams(token,2)
print(Counter(bigrams))
修改
让我说我有一个文本文件
<s> a a b b c c </s> <s> a c b c </s> <s> b c c a b </s>
然后我打开此文本文件,并对它执行以下操作,并将其存储在列表中。
temp = re.split("\s+",line.rstrip('\n'))
bigramText.append(temp)
所以现在在我的列表中,我有:
[['<s>', 'a', 'a', 'b', 'b', 'c', 'c', '</s>'], ['<s>', 'a', 'c', 'b', 'c', '</s>'], ['<s>', 'b', 'c', 'c', 'a', 'b', '</s>']]
现在从这个阶段开始,我要进行计算以获得二元概率。我不知道我最初的问题是否可以帮助您得到结果,但必不可少的是,我试图找出这些组合发生了多少次,即您需要检查一个字母在另一个字母旁边出现的次数
答案 0 :(得分:0)
如果您可以按空间分割(通常是艰难的条件,则可能应该编写自己的bigrammizer)。我会保留我的身份而不是我的身份
def custom_bigrams(l):
return list(zip(l, l[1:]))
print(custom_bigrams(['<s>', 'my', 'name', 'is', 'python', '</s>']))
它打印
[('<s>', 'my'), ('my', 'name'), ('name', 'is'), ('is', 'python'), ('python', '</s>')]
要在列表中使用它,必须计算二元组,然后使用Counter中的更新方法。
your_list = [['<s>', 'a', 'a', 'b', 'b', 'c', 'c', '</s>'], ['<s>', 'a', 'c', 'b', 'c', '</s>'], ['<s>', 'b', 'c', 'c', 'a', 'b', '</s>']]
c = Counter()
for x in your_list:
c.update(custom_bigrams(x))
输出
Counter({('b', 'c'): 3, ('<s>', 'a'): 2, ('a', 'b'): 2, ('c', 'c'): 2, ('c', '</s>'): 2, ('a', 'a'): 1, ('b', 'b'): 1, ('a', 'c'): 1, ('c', 'b'): 1, ('<s>', 'b'): 1, ('c', 'a'): 1, ('b', '</s>'): 1})
答案 1 :(得分:0)
在分割'<s>'
和'</s>'
时,NLTK令牌生成器会出错是很正常的
您应该在调用令牌生成器之前将其删除,然后在令牌生成后添加它们。
text = "<s> my name is python </s>"
clean_text = text.replace('<s>','').replace('</s>','')
token = ['<s>'] + nltk.word_tokenize(clean_text) + ['</s>']
bigrams = ngrams(token,2)