Python-NLTK Bigram将<s>和</s>保留为一个词

时间:2018-11-13 15:56:28

标签: python nltk

我正在尝试创建一个程序来计算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>']]

现在从这个阶段开始,我要进行计算以获得二元概率。我不知道我最初的问题是否可以帮助您得到结果,但必不可少的是,我试图找出这些组合发生了多少次,即您需要检查一个字母在另一个字母旁边出现的次数

2 个答案:

答案 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)