R/python:从训练句子构建模型

R/python:从训练句子构建模型,python,r,nltk,text-mining,tm,Python,R,Nltk,Text Mining,Tm,我正在努力实现的目标: 我已经寻找了很长一段时间的方法,但我无法找到(有效的)方法: 从例句中建立一个模型,同时考虑词序和同义词 根据该模型映射一个句子,并获得一个相似性分数(因此,一个分数表示该句子在多大程度上符合该模型,换句话说,符合用于训练该模型的句子) 我尝试的内容: Python:nltk与gensim结合使用(据我所知,它只能够使用单词相似性(但不考虑顺序) 账户) R:使用tm构建了一个TermDocumentMatrix,它看起来很有希望,但无法将任何东西映射到这个矩阵。此

我正在努力实现的目标:
我已经寻找了很长一段时间的方法,但我无法找到(有效的)方法:

  • 从例句中建立一个模型,同时考虑词序和同义词
  • 根据该模型映射一个句子,并获得一个相似性分数(因此,一个分数表示该句子在多大程度上符合该模型,换句话说,符合用于训练该模型的句子)
我尝试的内容:

  • Python:
    nltk
    gensim
    结合使用(据我所知,它只能够使用单词相似性(但不考虑顺序) 账户)

  • R:
    使用
    tm
    构建了一个
    TermDocumentMatrix
    ,它看起来很有希望,但无法将任何东西映射到这个矩阵。此外,这个
    TermDocumentMatrix
    似乎考虑了顺序,但忽略了同义词(我认为)。

    我知道柠檬化没那么顺利哈:)

问题:

是否有任何方法可以使用R或Python实现上述步骤?一个简单的示例代码会很好(或者参考一个好的教程)

有很多方法可以完成上面描述的工作,当然,要找到一个优化的解决方案需要大量的测试。但是这里有一些有用的功能可以帮助您使用python/nltk解决这个问题

从例句中建立一个模型,同时考虑词序和语法 同义词考虑在内

1。标记化

在这一步中,你需要将各个句子分解成一个单词列表

示例代码:

import nltk
tokenized_sentence = nltk.word_tokenize('this is my test sentence')

print(tokenized_sentence)

['this', 'is', 'my', 'test', 'sentence']  
from nltk.corpus import wordnet as wn
synset_list = wn.synsets('motorcar')

print(synset_list)

[Synset('car.n.01')]
 print( wn.synset('car.n.01').lemma_names() )

 ['car', 'auto', 'automobile', 'machine', 'motorcar']
2。查找每个单词的同义词。

示例代码:

import nltk
tokenized_sentence = nltk.word_tokenize('this is my test sentence')

print(tokenized_sentence)

['this', 'is', 'my', 'test', 'sentence']  
from nltk.corpus import wordnet as wn
synset_list = wn.synsets('motorcar')

print(synset_list)

[Synset('car.n.01')]
 print( wn.synset('car.n.01').lemma_names() )

 ['car', 'auto', 'automobile', 'machine', 'motorcar']
如果您不熟悉语法集,请随意研究它,但现在只需知道上面返回的是一个列表,因此可能会返回多个语法集

从synset可以获得同义词列表

示例代码:

import nltk
tokenized_sentence = nltk.word_tokenize('this is my test sentence')

print(tokenized_sentence)

['this', 'is', 'my', 'test', 'sentence']  
from nltk.corpus import wordnet as wn
synset_list = wn.synsets('motorcar')

print(synset_list)

[Synset('car.n.01')]
 print( wn.synset('car.n.01').lemma_names() )

 ['car', 'auto', 'automobile', 'machine', 'motorcar']
很好,现在您可以将句子转换为单词列表,并且可以在句子中找到所有单词的同义词(同时保留句子的顺序)。此外,您可能需要考虑删除停用词和填充令牌,所以如果您认为这有帮助的话,可以自由地查找这些概念。p> 当然,您需要为所有句子编写代码,并将数据存储在某些数据结构中,但这可能超出了本问题的范围

根据此模型映射一个句子,并获得相似性分数(因此 换句话说,分数表示这个句子有多符合模型 符合用于训练模型的句子)

这很难回答,因为这样做的可能性是无穷无尽的,但这里有几个例子可以说明如何处理它

如果你对二元分类感兴趣,你可以做一些简单的事情,比如,我以前见过这个句子的变体(变体是同一个句子,但单词被同义词替换)?如果是,分数为1,否则分数为0。这会起作用,但可能不是你想要的

另一个例子是,将每个句子连同同义词一起存储在python词典中,并根据您可以将新句子与词典对齐的距离来计算分数

示例:

训练句子1='这是我最棒的句子'

训练句子2='这并不可怕'

下面是一个关于如何存储这两个句子的示例数据结构:

my_dictionary = {
    'this': {
        'is':{
            'my':{
                'awesome': {
                    'sentence':{}
                }
            },
            'not':{
                'awesome':{}
            }
        }
    }
}
然后,您可以为每个新句子编写一个遍历该数据结构的函数,并根据它的深度给它一个更高的分数

结论:

以上两个例子只是处理相似性问题的一些可能方法。关于计算文本间语义相似度的文章/白皮书不计其数,所以我的建议是探索许多选项


我故意排除了监督分类模型,因为您从未提到过可以访问带标签的训练数据,但如果您确实拥有金标准数据源,当然这条路线是可能的

有很多方法可以实现上述目的,当然,要找到一个优化的解决方案,还需要大量的测试。但是这里有一些有用的功能可以帮助您使用python/nltk解决这个问题

从例句中建立一个模型,同时考虑词序和语法 同义词考虑在内

1。标记化

在这一步中,你需要将各个句子分解成一个单词列表

示例代码:

import nltk
tokenized_sentence = nltk.word_tokenize('this is my test sentence')

print(tokenized_sentence)

['this', 'is', 'my', 'test', 'sentence']  
from nltk.corpus import wordnet as wn
synset_list = wn.synsets('motorcar')

print(synset_list)

[Synset('car.n.01')]
 print( wn.synset('car.n.01').lemma_names() )

 ['car', 'auto', 'automobile', 'machine', 'motorcar']
2。查找每个单词的同义词。

示例代码:

import nltk
tokenized_sentence = nltk.word_tokenize('this is my test sentence')

print(tokenized_sentence)

['this', 'is', 'my', 'test', 'sentence']  
from nltk.corpus import wordnet as wn
synset_list = wn.synsets('motorcar')

print(synset_list)

[Synset('car.n.01')]
 print( wn.synset('car.n.01').lemma_names() )

 ['car', 'auto', 'automobile', 'machine', 'motorcar']
如果您不熟悉语法集,请随意研究它,但现在只需知道上面返回的是一个列表,因此可能会返回多个语法集

从synset可以获得同义词列表

示例代码:

import nltk
tokenized_sentence = nltk.word_tokenize('this is my test sentence')

print(tokenized_sentence)

['this', 'is', 'my', 'test', 'sentence']  
from nltk.corpus import wordnet as wn
synset_list = wn.synsets('motorcar')

print(synset_list)

[Synset('car.n.01')]
 print( wn.synset('car.n.01').lemma_names() )

 ['car', 'auto', 'automobile', 'machine', 'motorcar']
很好,现在您可以将句子转换为单词列表,并且可以在句子中找到所有单词的同义词(同时保留句子的顺序)。此外,您可能需要考虑删除停用词和填充令牌,所以如果您认为这有帮助的话,可以自由地查找这些概念。p> 当然,您需要为所有句子编写代码,并将数据存储在某些数据结构中,但这可能超出了本问题的范围

根据此模型映射一个句子,并获得相似性分数(因此 换句话说,分数表示这个句子有多符合模型 符合用于训练模型的句子)

这很难回答,因为这样做的可能性是无穷无尽的,但这里有几个例子可以说明如何处理它

如果你感兴趣的话