【问题标题】:Suggesting similar sentences建议相似的句子
【发布时间】:2017-08-24 00:39:07
【问题描述】:

我正在尝试创建一个句子自动完成模型,它会建议相似的句子。

问题:我有一个超过 20000 个句子的句子语料库。我想创建一个程序,当用户用他/她的键盘输入时,它会向用户建议类似的句子。

例如-

user: wh
suggestions: [{'what is your name?'},{'what is your profession?'},{'what do you want?'}, {'where are you?'}]

user: what is your
suggestions: [{'what is your name?'},{'what is your profession?'}]

注意:

  1. 单词的顺序很重要,即句子的前缀和用户输入应该相同。
  2. 句子建议来自可用的文本语料库。

我的方法:- 到目前为止,我只提出了一个使用 trie 数据结构将每个句子存储在文本语料库中的解决方案。

我想知道是否有任何机器学习技术可以用于句子建议,同时考虑句子前缀。 我真的很感激任何能给我指出正确方向的人。

【问题讨论】:

  • 如果你想做一个确切的前缀并且不涉及概率建议,我认为这里不需要使用机器学习。
  • @Unni 保持前缀不变,可能会有很多句子。建议那些更频繁出现的将涉及某种语言建模。
  • @Will_of_fire:OP 没有在问题中说明任何涉及排名的内容。我的评论是假设一个布尔检索问题。 top-k 检索将涉及排名步骤。这可以以多种方式实现。语言模型绝对是其中之一。
  • 对于句子建议,您必须使用机器学习技术,例如用词汇创建分词器、词/句子嵌入、给定句子和训练句子之间的语义相似度可以用欧几里德距离、余弦相似度来衡量...供python参考参考pypi.org/project/similar-sentences

标签: python machine-learning nlp


【解决方案1】:

文本生成是 RNN 的常见应用。给定一个句子前缀,可以训练神经网络来预测最可能的下一个单词。 可以找到由 Andrej Karpathy 撰写的一篇非常有趣的文章 here 以及相应的 github repo

另一种流行的方法是利用马尔可夫链生成文本(例如参见here

【讨论】:

    【解决方案2】:

    如果要使用Lucene相关性,MoreLikeThis类似的句子。或者你可以应用余弦相似度。希望这会有所帮助。

    public static void main(String[] args) throws IOException {
        Main m = new Main();
        m.init();
        m.writerEntries();
        m.findSilimar("doduck prototype");
    }
    
    private Directory indexDir;
    private StandardAnalyzer analyzer;
    private IndexWriterConfig config;
    
    public void init() throws IOException{
        analyzer = new StandardAnalyzer(Version.LUCENE_42);
        config = new IndexWriterConfig(Version.LUCENE_42, analyzer);
        config.setOpenMode(OpenMode.CREATE_OR_APPEND);
    
        indexDir = new RAMDirectory(); //do not write on disk
    
    }
    
    public void writerEntries() throws IOException{
        IndexWriter indexWriter = new IndexWriter(indexDir, config);
        indexWriter.commit();
    
        Document doc1 = createDocument("1","doduck","prototype your idea");
        Document doc2 = createDocument("2","doduck","love programming");
        Document doc3 = createDocument("3","We do", "prototype");
        Document doc4 = createDocument("4","We love", "challange");
        indexWriter.addDocument(doc1);
        indexWriter.addDocument(doc2);
        indexWriter.addDocument(doc3);
        indexWriter.addDocument(doc4);
    
        indexWriter.commit();
        indexWriter.forceMerge(100, true);
        indexWriter.close();
    }
    
    private Document createDocument(String id, String title, String content) {
        FieldType type = new FieldType();
        type.setIndexed(true);
        type.setStored(true);
        type.setStoreTermVectors(true); //TermVectors are needed for MoreLikeThis
    
        Document doc = new Document();
        doc.add(new StringField("id", id, Store.YES));
        doc.add(new Field("title", title, type));
        doc.add(new Field("content", content, type));
        return doc;
    }
    
    
    private void findSilimar(String searchForSimilar) throws IOException {
        IndexReader reader = DirectoryReader.open(indexDir);
        IndexSearcher indexSearcher = new IndexSearcher(reader);
    
        MoreLikeThis mlt = new MoreLikeThis(reader);
        mlt.setMinTermFreq(0);
        mlt.setMinDocFreq(0);
        mlt.setFieldNames(new String[]{"title", "content"});
        mlt.setAnalyzer(analyzer);
    
    
        Reader sReader = new StringReader(searchForSimilar);
        Query query = mlt.like(sReader, null);
    
        TopDocs topDocs = indexSearcher.search(query,10);
    
        for ( ScoreDoc scoreDoc : topDocs.scoreDocs ) {
            Document aSimilar = indexSearcher.doc( scoreDoc.doc );
            String similarTitle = aSimilar.get("title");
            String similarContent = aSimilar.get("content");
    
            System.out.println("====similar finded====");
            System.out.println("title: "+ similarTitle);
            System.out.println("content: "+ similarContent);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-23
      • 2011-04-05
      • 2017-01-10
      • 2020-12-27
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 2016-08-27
      相关资源
      最近更新 更多