如何查找与特定单词分组的主题和短语(动词/形容词)?

时间:2019-02-21 14:27:54

标签: r text nlp

我有一个整洁的数据集,其中的列包含文本响应(即在赠款申请中),而行作为申请赠款的单个组织。我正在尝试查找与特定单词分组在一起的主题和短语(例如“ funder” /“ funding”)。更具体地说,哪些形容词和动词与这些标记组合在一起?

例如

    private void tbSource_KeyUp(object sender, KeyEventArgs e)
    {

        string appendTag, selectedText;
        appendTag = string.Empty;
        if (e.Control)
        {
            selectedText = tbSource.SelectedText;
            switch (e.KeyCode)
            {
                case Keys.U:
                    appendTag = @"<U>{0}</U>";
                    break;
                case Keys.B:
                    appendTag = @"<B>{0}</B>";
                    break;
                case Keys.R:
                    appendTag = @"<ruby>{0}<rt></rt></ruby>";
                    break;
                case Keys.T:
                    appendTag = @"(  )";
                    break;
                default:
                    appendTag = @"";
                    break;
            }

            if (e.KeyCode == Keys.U || e.KeyCode == Keys.B || e.KeyCode == Keys.R)
            {
                selectedText = string.Format(appendTag, selectedText);
                tbSource.SelectedText = selectedText;
            }
            else {
                tbSource.AppendText(appendTag);
            }    
        }           
    }

因此,“资金”可以与动词(如“创建”,“雇用”)和形容词短语(如“新网站”,“有才华的人”)组合在一起。

我正在R中进行此操作。是否有人建议使用此程序包或程序?我找到了cleanNLP,但不确定这是否是最方便的软件包。我需要标记所有单词吗?如果是这样,我对短语进行分组会不会有问题?

我对NLP /文本挖掘还很陌生,因此我对介绍性问题表示歉意。

谢谢!

1 个答案:

答案 0 :(得分:1)

这是一个值得探索的广阔领域。

我强烈建议您阅读tidytextmining书籍和软件包,以及作者的个人博客(https://juliasilge.comhttp://varianceexplained.org),那里有大量出色的工作可以帮助您入门,而且对于NLP的新手来说,它的编写非常好。

widyr和udpipe库对于您正在寻找的内容也非常有帮助。

这里有两个例子: 使用widyr,我们可以查看一个词(例如,资金)和与之相关的所有其他词之间的成对pmi。有关PMI的信息,请查看:https://stackoverflow.com/a/13492808/2862791

library(tidytext)
library(tidyverse)
texts <- tibble(text = c('This funding would help us create a new website and hire talented people',
                         'this random funding function talented people',
                         'hire hire hire new website funding',
                         'fun fun fun for all'))


tidy_texts %>%
        pairwise_pmi(word, id) %>%
        filter(item1 == 'funding') %>% 
        top_n(5, wt = pmi) %>%
        arrange(desc(pmi))

 item1   item2        pmi
   <chr>   <chr>      <dbl>
 1 funding this     -0.0205
 2 funding would    -0.0205
 3 funding help     -0.0205
 4 funding us       -0.0205

因此,要介绍形容词和短语,您可以按照boski的建议查看udpipe。 我还将重现上面的内容以计算PMI,因为它是一种非常直观,快速的度量标准

library(udpipe)
english <- udpipe_download_model(language = "english")
ud_english <- udpipe_load_model(english$file_model)

tagged <- udpipe_annotate(ud_english, x = texts$text)
tagged_df <- as.data.frame(tagged)


tagged_df %>%
        filter(upos == 'ADJ' | 
                       token == 'funding') %>%
        pairwise_pmi(token, doc_id) %>%
        filter(item1 == 'funding')


  item1   item2      pmi
  <chr>   <chr>    <dbl>
1 funding new      0.170
2 funding talented 0.170

您已经提到了cleanNLP,它是用于此类工作的出色库。这样可以轻松访问udpipe和spacyr以及其他一些方法来完成该形容词发现所需的标记和标记。

如果您可以跳过设置详细信息,则spacyr是我的首选,因为它速度最快,但是如果速度不是问题,我会选择udpipe,因为它非常易于使用。

我需要标记所有单词吗?如果是这样,我对短语进行分组会不会有问题?

因此udpipe和其他文本注释器对此有一个解决方案。 在udpipe中,您可以使用'keywords_collocation()'来识别出现频率比随机机会高出预期的单词。

我们需要一个比我上面写的三个垃圾句子更大的文本数据集,以得到可重复的示例。

但是您可以通过此博客找到很多信息: https://bnosac.github.io/udpipe/docs/doc7.html

很抱歉,此回复有点像是链接的集合……但是正如我所说的,这是一个很大的研究领域。