gpt4 book ai didi

python - 为自定义词汇创建 N-gram 模型

转载 作者:行者123 更新时间:2023-12-01 01:21:45 25 4
gpt4 key购买 nike

我想创建一个不适用于“英语单词”的 N-Gram 模型。我有一个自定义词汇列表,如下所示:

vocabs = [ [0.364, 0.227, 0.376], [0.875, 0.785, 0.376], ........ ]

我想说的是,我的词汇列表中的每个元素都需要被 N-Gram 模型视为一个“单词”。我的训练数据集将包含一些与我的词汇列表格式完全相同的数字,如下所示:

training_data = [ [0.344, 0.219, 0.374], [0.846, 0.776, 0.376], ........ ]

注意:在这个例子中,我想表明,训练“单词”(3个数字的列表)与我词汇表中的“单词”并不完全相同,但它们会非常相似。关闭。

现在,我的问题是,我可以构建一个可以使用训练数据进行训练的 N-Gram 模型吗?然后,使用该模型来预测新“单词”出现的概率。

我正在使用 python,并且可以使用“nltk”库找到很多 N-Gram 示例。但问题是大多数情况下都使用“英语单词”。由于我对 N-Gram 不是很熟悉,这些例子让我很困惑。如果有人能回答我的问题和/或指出一些学习 N-Gram 的教程(不是特定于 NLP),我将非常高兴。

谢谢。

编辑:

为了简化问题,我将尝试以不同的方式解释它:我有如下词汇表:

vocabs = [v1, v2, v3, ........vn]

我还有两个序列生成器(SG)。它们都从我的词汇中生成了一系列单词。

我的目标是从流数据中预测:哪个生成器当前正在生成序列(单词)。

现在我想使用我的标记训练数据(我已经有一些来自 SG 的标记数据)构建两个 N-gram 模型(每个 SG 一个)。最后,当我将流数据输入模型并通过比较 N-gram 模型的预测来选择可能的 SG 时。为了清楚起见,如果 SG1 的 N-gram 模型比 SG2 的 N-gram 模型给出更高的概率,我将确定当前的流数据是由 SG1 生成的。

希望解释有助于理解我的担忧。我非常感谢您为回答这个问题所做的努力。

注意:如果您知道任何其他模型可以很好地解决这个问题(比 N-gram 模型更好),请提及。

谢谢。

最佳答案

好吧,我不确定你到底想做什么。但无论如何我们还是要尝试一下。

首先,N-gram 是如何工作的:N-gram 是序列概率的非常简单的预测器。由于句子只是单词的序列,而单词只是字符的序列,因此它通常非常适合字符串:

问题:您有一个字母列表,您想找出序列中的下一个字母是什么。

letterSequence = ['a', 'b', None] 

如果您有一堆按顺序排列的字母,您可以记下这些顺序:

training_data = ['a', 'b', 'c',
'a', 'b', 'c',
'a', 'b', 'd',
'a', 'b', 'f',
'b', 'c', 'd']

乍一看,您可以看到序列“a”、“b”、“c”的概率是“a”、“b”、“d”或“a”的概率的两倍'、'b'、'f'。我们要做的就是计算同一个序列在training_data中出现的次数,并选择出现次数最多的一个。

def makeNestedDict(aDict, listOfKeys):
if len(listOfKeys) == 0:
if aDict != {}: return aDict
return 0
if listOfKeys[0] not in aDict:
aDict[listOfKeys[0]] = {}
aDict[listOfKeys[0]] = makeNestedDict(aDict[listOfKeys[0]], listOfKeys[1:])
return aDict

def makeCoreferenceDict(ressource):
#we'll use 3-grams but we could have chosen any n for n-grams
ngramDict = {}
index = 0
#we make sure we won't go further than the length of the list
while (index+2) < len(ressource):
k1 = ressource[index]
k2 = ressource[index+1]
k3 = ressource[index+2]
ngramDict = makeNestedDict(ngramDict, [k1, k2, k3])
ngramDict[k1][k2][k3] += 1 #counting
index += 1
return ngramDict

def predict(unkSequence, ngramDict):
import operator
corefDict = ngramDict[unkSequence[0]][unkSequence[1]]
return max(corefDict.items(), key=operator.itemgetter(1))

############################################
ngramDict = makeCoreferenceDict(training_data)
#the most common letter that follows 'a', 'b' is...
predict(letterSequence, ngramDict)
>>> ('c', 2) #... is 'c' and it appears twice in the data

您还可以通过替换行(在 makeCoreferenceDict 函数中)来获取预测分数,而不是获取最常见的元素:

ngramDict[k1][k2][k3] += 1 #counting

与:

ngramDict[k1][k2][k3] += 1.0/float(len(ressource)) #add to the score

所以:

def showScore(unkSequence, ngramDict):
return ngramDict[unkSequence[0]][unkSequence[1]]

############################################
ngramDict = makeCoreferenceDict(training_data)
#the most common letter that follows 'a', 'b' is...
showScore(letterSequence, ngramDict)
>>> {'c': 0.13333333333333333, 'd': 0.06666666666666667, 'f': 0.06666666666666667}

现在,n-gram 方法依赖于有限的元素集(字符、单词、自然数等)。现在,在您的示例中,“vocabs”和“training_data”几乎没有任何共同点。我认为你真正需要的是得到你的单词之间的距离分数。我猜是因为你所说的:

In the example I wanted to show that, the training "words" (list of 3 number) are not exactly the same as the "words" in my vocabulary but they will be very close.

在这种情况下,它会变得有点太复杂,无法在此处显示,但您可能需要测量之间的距离

“vocabs”中每个元素的每个数字

“training_data”中每个序列中每个元素的每个编号

然后比较它们并选择较小的分数。

如果这不是您问题的答案,请重新表述或给我们提供更多示例。无论如何,祝你好运。

关于python - 为自定义词汇创建 N-gram 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53751241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com