- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个不适用于“英语单词”的 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/
我正在阅读有关 n 元语法的内容,我想知道在实践中是否存在优先使用单元语法而不是双元语法的情况(或更高的N-grams)。据我了解,N越大,计算概率和建立向量空间的复杂性就越大。但除此之外,还有其他原
我一直在为我的一个新项目使用 ElasticSearch。我已将默认分析器设置为使用 ngram 标记过滤器。这是我的 elasticsearch.yml 文件: index: analysis:
我正在做一个项目,我需要一个 skip-gram 模型的预训练向量。我听说还有一个名为 skip-n-gram 模型的变体可以提供更好的结果。 我想知道自己训练模型需要什么?因为我只需要它们来为我的模
我正在尝试使用 Lucene (5.5.0) 进行一些字符串标记化(无索引)。我需要: 完全删除包含数字的单词,例如像 log4j 这样的单词应该从字符串中删除 我想将字符串拆分为单字术语和 2 克术
我正在尝试在 Scala 中编写基于 n-gram 的分离新闻算法。 如何为大文件生成 n-gram: 例如,对于包含“蜜蜂是蜜蜂的蜜蜂”的文件。 首先它必须选择一个随机的 n-gram。例如,蜜蜂。
给定一个大文本文件,我想使用 Apache Spark 提取字符 n-gram(并行执行任务)。 示例输入(2 行文本): 第 1 行:(Hello World,它) 第 2 行:(是美好的一天) 输
对我以前的post进行了更新,并做了一些更改: 说我有100条微博。 在这些推特中,我需要提取:1)食品名称,2)饮料名称。我还需要附上类型(饮料或食品)和一个id号(每个项目有一个唯一的id)为每个
我是Python新手,正在研究建筑行业契约(Contract)文件的多类文本分类。我在代码中实现 n 元语法时遇到问题,这些代码是我通过从不同的在线资源获得帮助而生成的。我想在我的代码中实现一元语法、
Gram-Schmidt 正交化算法的计算复杂度是多少? 假设一个m 行和k 列的矩阵,计算正交化需要多少次操作? 如果可能的话,我想要乘法和加法的确切数量。 编辑:在我看来,操作总数(乘法 + 加法
在Keras中可以使用n-gram吗? 例如,句子包含在X_train数据框中,带有“句子”列。 我通过以下方式使用Keras的 token 生成器: tokenizer = Tokenizer(lo
给定一个具有独立列的矩阵 A(不一定是正方形),我能够应用 Gram-Schmidt 迭代并使用 Matlab 的函数 qr 为其列空间(以正交矩阵 Q 的形式)生成正交基 A=[1,1;1,0;1,
我有一个 n-gram 列表 ('allo', 'stesso', 'modo', 'dell’italia,', 'che') ('stesso', 'modo', 'dell’italia,',
我有一个已经被标记化的文档列表: dat result[[2]] [1] "argentine" "crude" "oil"
使用什么算法来查找 ngram? 假设我的输入数据是一个单词数组和我想要查找的 ngram 的大小,我应该使用什么算法? 我要求提供代码,优先选择 R。数据存储在数据库中,因此也可以是 plgpsql
我有一个使用关键字 token 生成器(整个术语是 token )的字段类型,具有小写和边缘n-gram过滤器,例如“Robert Longo”存储为“r”,“ro”,...,“robert l”,“
我正在尝试使用三元组进行下一个单词预测。 我已经能够上传一个语料库并通过它们的频率识别最常见的三元组。我在 R 中使用了“ngrams”、“RWeka”和“tm”包。我按照这个问题寻求指导: What
我正在研究一个增强和替代通信 (AAC) 程序。我当前的目标是存储输入/口语文本的历史记录并搜索常用短语片段或单词 n-gram。我目前使用的是基于 lzw 压缩算法的实现,如 CodeProject
我正在构建一个基于 OpenGL3 的免费开源 3D 游戏引擎(这不是学校作业,而是为了个人技能发展和回馈开源社区)。我已经到了需要学习大量相关数学的阶段,所以我正在阅读一本很棒的教科书,名为“3D
我试图从从文本文档中提取的模式中提取 ngram,模式具有不同数量的术语。 例如:如果模式 p={t1,t2,t3} 我们需要提取 ngram 3 应该是这样的 t1 t2 t3 t1, t2 t2,
我正在编写一个 C 程序,以便在某个字符串中找到最频繁的 n-gram。 一个n-gram是一个 contiguous sequence of n items from a given sequenc
我是一名优秀的程序员,十分优秀!