R/python:从训练句子构建模型
R/python: build model from training sentences
我要实现的目标:
我一直在寻找一种方法很长一段时间,但我找不到一种(有效的)方法来解决这个问题:
- 根据例句构建模型,同时考虑词序和同义词。
- 将一个句子映射到该模型并获得相似度分数(因此该分数表示该句子与模型的匹配程度,换句话说与用于训练模型的句子匹配)
我试过的:
Python:
nltk
与 gensim
结合使用(据我所知,它只能使用单词相似度(但不接受顺序)进入
帐户)。
R:
使用 tm
构建了一个 TermDocumentMatrix
看起来很有前途但无法将任何内容映射到该矩阵。此外,此 TermDocumentMatrix
似乎考虑了顺序但错过了同义词(我认为)。
我知道词形还原不太顺利哈哈 :)
问题:
有什么方法可以使用 R 或 Python 实现上述步骤吗?一个简单的示例代码会很棒(或参考一个好的教程)
有很多方法可以完成您上面描述的事情,当然需要进行大量测试才能找到优化的解决方案。但是这里有一些有用的功能可以帮助使用 python/nltk.
解决这个问题
build a model from example sentences while taking word order and
synonyms into account.
1.标记化
在这一步中,您需要将单个句子分解成单词列表。
示例代码:
import nltk
tokenized_sentence = nltk.word_tokenize('this is my test sentence')
print(tokenized_sentence)
['this', 'is', 'my', 'test', 'sentence']
2。查找每个单词的同义词。
示例代码:
from nltk.corpus import wordnet as wn
synset_list = wn.synsets('motorcar')
print(synset_list)
[Synset('car.n.01')]
如果您不熟悉同义词集,请随意研究,但现在只知道上面的 returns 列表,因此可能会返回多个同义词集。
从同义词集中您可以获得同义词列表。
示例代码:
print( wn.synset('car.n.01').lemma_names() )
['car', 'auto', 'automobile', 'machine', 'motorcar']
太好了,现在您可以将句子转换为单词列表,并且可以找到句子中所有单词的同义词(同时保留句子的顺序)。此外,您可能需要考虑删除停用词和词干化标记,因此如果您认为有帮助,请随时查阅这些概念。
你当然需要编写代码来对所有句子执行此操作,并将数据存储在某种数据结构中,但这可能不在本题的讨论范围之内。
map a sentence against this model and get a similarity score (thus a
score indicating how much this sentence fits the model, in other words
fits the sentences which were used to train the model)
这很难回答,因为这样做的可能性是无穷无尽的,但这里有几个示例可以说明如何处理它。
如果你对二元分类感兴趣,你可以做一些简单的事情,比如,我以前见过这个句子的变体吗(变体是同一个句子,但单词被它们的同义词代替)?如果是这样,得分为 1,否则得分为 0。这可行,但可能不是您想要的。
另一个例子,将每个句子连同同义词一起存储在 python 词典中,并根据您可以将新句子对齐到词典的多远来计算分数。
示例:
training_sentence1 = 'This is my awesome sentence'
training_sentence2 = 'This is not awesome'
下面是关于如何存储这 2 个句子的示例数据结构:
my_dictionary = {
'this': {
'is':{
'my':{
'awesome': {
'sentence':{}
}
},
'not':{
'awesome':{}
}
}
}
}
然后你可以编写一个函数,为每个新句子遍历该数据结构,并根据它的深度,给它一个更高的分数。
结论:
以上两个示例只是解决相似性问题的一些可能方法。关于计算文本之间的语义相似度有无数 articles/whitepapers,所以我的建议是探索多种选择。
我故意排除了监督分类模型,因为您从未提到可以访问带标签的训练数据,但是如果您确实拥有黄金标准数据源,那条路线当然是可能的。
我要实现的目标:
我一直在寻找一种方法很长一段时间,但我找不到一种(有效的)方法来解决这个问题:
- 根据例句构建模型,同时考虑词序和同义词。
- 将一个句子映射到该模型并获得相似度分数(因此该分数表示该句子与模型的匹配程度,换句话说与用于训练模型的句子匹配)
我试过的:
Python:
nltk
与gensim
结合使用(据我所知,它只能使用单词相似度(但不接受顺序)进入 帐户)。R:
使用tm
构建了一个TermDocumentMatrix
看起来很有前途但无法将任何内容映射到该矩阵。此外,此TermDocumentMatrix
似乎考虑了顺序但错过了同义词(我认为)。
我知道词形还原不太顺利哈哈 :)
问题:
有什么方法可以使用 R 或 Python 实现上述步骤吗?一个简单的示例代码会很棒(或参考一个好的教程)
有很多方法可以完成您上面描述的事情,当然需要进行大量测试才能找到优化的解决方案。但是这里有一些有用的功能可以帮助使用 python/nltk.
解决这个问题build a model from example sentences while taking word order and synonyms into account.
1.标记化
在这一步中,您需要将单个句子分解成单词列表。
示例代码:
import nltk
tokenized_sentence = nltk.word_tokenize('this is my test sentence')
print(tokenized_sentence)
['this', 'is', 'my', 'test', 'sentence']
2。查找每个单词的同义词。
示例代码:
from nltk.corpus import wordnet as wn
synset_list = wn.synsets('motorcar')
print(synset_list)
[Synset('car.n.01')]
如果您不熟悉同义词集,请随意研究,但现在只知道上面的 returns 列表,因此可能会返回多个同义词集。
从同义词集中您可以获得同义词列表。
示例代码:
print( wn.synset('car.n.01').lemma_names() )
['car', 'auto', 'automobile', 'machine', 'motorcar']
太好了,现在您可以将句子转换为单词列表,并且可以找到句子中所有单词的同义词(同时保留句子的顺序)。此外,您可能需要考虑删除停用词和词干化标记,因此如果您认为有帮助,请随时查阅这些概念。
你当然需要编写代码来对所有句子执行此操作,并将数据存储在某种数据结构中,但这可能不在本题的讨论范围之内。
map a sentence against this model and get a similarity score (thus a score indicating how much this sentence fits the model, in other words fits the sentences which were used to train the model)
这很难回答,因为这样做的可能性是无穷无尽的,但这里有几个示例可以说明如何处理它。
如果你对二元分类感兴趣,你可以做一些简单的事情,比如,我以前见过这个句子的变体吗(变体是同一个句子,但单词被它们的同义词代替)?如果是这样,得分为 1,否则得分为 0。这可行,但可能不是您想要的。
另一个例子,将每个句子连同同义词一起存储在 python 词典中,并根据您可以将新句子对齐到词典的多远来计算分数。
示例:
training_sentence1 = 'This is my awesome sentence'
training_sentence2 = 'This is not awesome'
下面是关于如何存储这 2 个句子的示例数据结构:
my_dictionary = {
'this': {
'is':{
'my':{
'awesome': {
'sentence':{}
}
},
'not':{
'awesome':{}
}
}
}
}
然后你可以编写一个函数,为每个新句子遍历该数据结构,并根据它的深度,给它一个更高的分数。
结论:
以上两个示例只是解决相似性问题的一些可能方法。关于计算文本之间的语义相似度有无数 articles/whitepapers,所以我的建议是探索多种选择。
我故意排除了监督分类模型,因为您从未提到可以访问带标签的训练数据,但是如果您确实拥有黄金标准数据源,那条路线当然是可能的。