Python 我如何使用nltk来获得下一个单词的机会?

Python 我如何使用nltk来获得下一个单词的机会?,python,nltk,markov-chains,Python,Nltk,Markov Chains,问题 我有一个问题,我有一个词,对第二个词可能是什么有一定的限制(例如“I_o___”)。我想要的是一个像“rode”、“love”和“most”这样的词的列表,告诉我每个词跟在“I”后面有多普遍 我希望能够得到两个元组的列表(nextword,probability),其中nextword是一个满足正则表达式的单词,probability是nextword在第一个单词之后出现的概率,由(在文本语料库中第一个单词之后出现的次数)/(第一个单词出现的次数)给出 像这样: [(nextword, f

问题

我有一个问题,我有一个词,对第二个词可能是什么有一定的限制(例如“I_o___”)。我想要的是一个像“rode”、“love”和“most”这样的词的列表,告诉我每个词跟在“I”后面有多普遍

我希望能够得到两个元组的列表(nextword,probability),其中nextword是一个满足正则表达式的单词,probability是nextword在第一个单词之后出现的概率,由(在文本语料库中第一个单词之后出现的次数)/(第一个单词出现的次数)给出

像这样:

[(nextword, follow_probability("I", nextword) for nextword in findwords('.o..')]
我的方法是首先生成满足正则表达式的可能单词列表,然后查找每个单词的概率。第一部分很简单,但我不知道如何做第二部分。理想情况下,我可以让一个函数为每个单词取一个参数,并返回第一个单词后面的第二个单词的概率

我尝试过的

  • 使用markovify库生成一个链和具有特定起始词且状态大小为1的句子
  • 使用nltk的BigramConsolutionFinder

试试这样的方法:

from collections import Counter, deque
from nltk.tokenize import regexp_tokenize
import pandas as pd

def grouper(iterable, length=2):
    i = iter(iterable)
    q = deque(map(next, [i] * length))
    while True:
        yield tuple(q)
        try:
            q.append(next(i))
            q.popleft()
        except StopIteration:
            break

def tokenize(text):
    return [word.lower() for word in regexp_tokenize(text, r'\w+')]

def follow_probability(word1, word2, vec):
    subvec = vec.loc[word1]
    try:
        ct = subvec.loc[word2]
    except:
        ct = 0
    return float(ct) / (subvec.sum() or 1)

text = 'This is some training text this this'
tokens = tokenize(text)
markov = list(grouper(tokens))
vec = pd.Series(Counter(markov))

follow_probability('this', 'is', vec)
输出:


试着这样做:

from collections import Counter, deque
from nltk.tokenize import regexp_tokenize
import pandas as pd

def grouper(iterable, length=2):
    i = iter(iterable)
    q = deque(map(next, [i] * length))
    while True:
        yield tuple(q)
        try:
            q.append(next(i))
            q.popleft()
        except StopIteration:
            break

def tokenize(text):
    return [word.lower() for word in regexp_tokenize(text, r'\w+')]

def follow_probability(word1, word2, vec):
    subvec = vec.loc[word1]
    try:
        ct = subvec.loc[word2]
    except:
        ct = 0
    return float(ct) / (subvec.sum() or 1)

text = 'This is some training text this this'
tokens = tokenize(text)
markov = list(grouper(tokens))
vec = pd.Series(Counter(markov))

follow_probability('this', 'is', vec)
输出:


阅读
language model
阅读
language model
这很好,但是
nltk
包中是否有函数或类可以直接使用而不是自己编写?这很好,但是
nltk
包中是否有函数或类可以直接使用而不是自己编写?