如何过滤单词排列以仅查找语义正确的ngrams?(Python 3,NLTK)

如何过滤单词排列以仅查找语义正确的ngrams?(Python 3,NLTK),python,python-3.x,nltk,linguistics,Python,Python 3.x,Nltk,Linguistics,我想从200个单词的列表中创建一些排列——这显然会产生一个问题,因为这会导致一些数量惊人的可能排列(一个短语中最多有5个单词)。为了有效限制这一数字,我采取了双管齐下的措施: 将单词通过词性过滤器,以便只创建和使用有语言发音的短语 根据实际ngrams的排列进行过滤——即具有较高的PMI/可能性分数 这个概念的第二部分让我感到疑惑——我知道NLTK提供了查找ngrams的能力,但我所看到的每个示例都分析了语料库,这很有意义,因为需要一个freqdist但是,是否可以找到单词排列的PMI? 是否可

我想从200个单词的列表中创建一些排列——这显然会产生一个问题,因为这会导致一些数量惊人的可能排列(一个短语中最多有5个单词)。为了有效限制这一数字,我采取了双管齐下的措施:

  • 将单词通过词性过滤器,以便只创建和使用有语言发音的短语
  • 根据实际ngrams的排列进行过滤——即具有较高的PMI/可能性分数
  • 这个概念的第二部分让我感到疑惑——我知道NLTK提供了查找ngrams的能力,但我所看到的每个示例都分析了语料库,这很有意义,因为需要一个freqdist但是,是否可以找到单词排列的PMI?

    是否可以根据自定义语料库中的常见搭配找到我的单词排列的PMI分数?可以手动完成吗?

    例如,虽然排列(冗长的tea)在语言学上是合理的,但它不是一种语境上的好排列

    我知道在文本块/语料库中查找常见搭配的代码,但这是一个非常独特的问题,我希望有人能给出一些建议。至少,帮我把脑袋绕在这上面

    范例

    **KW**
     Ball
     Bat
     Pinch
     Home
     Run
     Base
     Hitter
     Pitcher
     Call
     etc...
    
    更多背景:
    现在,有许多排列可以从这个列表中得到,但只有少数几个真正有意义。通过POS过滤器传递这个列表,我可以创建有语言意义的关键词,但不能创建语义正确的关键词,如“呼叫击球手”。这是我的奋斗,以某种方式创建语义正确的排列基于某种评分标准,如PMI。现在我的想法是刮一个网站,也就是说,在其中找到常见的语法图,然后根据语料库判断关键字排列的相对语义强度。但我正在努力概念化这一点,甚至不确定这是否可能。但真的,我很想听听关于如何有效地找到ngram排列的其他想法!这里的练习归结为有效地消除无意义的排列,而无需手动对所有内容进行分类/评分

    您没有透露您的POS列表,但除非您的关键字列表比您向我们展示的片段复杂得多,否则这似乎可以解决“查找列表上最长的单词序列”。确保短语合法性的唯一方法是它出现在输入语料库中,因此计算是一种转移注意力的方法。甚至POS过滤也可能是不必要的

    words='Ball|Bat|Pinch|Home|Run|Base|Hitter|Pitcher|Call'
    curl -s 'http://en.wikipedia.org/wiki/Baseball' |
    grep -Eio "\<($words)( +($words))+\>"
    
    (这非常简单,我不需要费心编写Python脚本。可以通过请求轻松完成。)


    在更一般的情况下,像“投手扔的球是一个唾沫球”这样的句子包含跨越树边界的片段,您希望过滤掉这些片段(如“投手的球”,如果您将“the”添加到单词列表中),然后您确实需要一些语言学(或统计学…)这里。

    在这里大声想一想-There已经清理了语料库,公布了所有出现超过40次的[1,2,3,4,5]克的列表,以及它们的频率计数。因此,您可以获取生成的每个ngram,并在Google ngram数据库中查找其频率。计数越高的ngram在语义上越有可能是正确的

    。。。缺点是,下载谷歌的整个ngram数据集就像1 TB,我不知道他们是否有api

    编辑:

    如果没有api,我会感到震惊。此外,谷歌似乎不是镇上唯一的游戏,一个快速搜索出现了:


    我用我认为非常漂亮的解决方案找到了自己的答案!它基于以下文章:。这里的想法是不要创建一堆随机垃圾排列,然后对它们进行筛选以找到语义正确的一个。其思想是首先只创建语义正确的排列。这可以通过根据n-1的基本原则或一个单词仅在语义上依赖于前面的单词的想法分阶段创建句子来实现。

    因此,我们的计划是在相关的语料库中找到所有的双字组及其出现频率。频率越高,表达式在语义上越正确。假设你有一个类似这样的列表,其中包含在语料库中出现10次的双格图

    The man
    a plan
    in Panama
    Panama City
    Man Who
    Who is
    is awesome
    
    在此基础上,根据N-1分阶段构造句子。因此,您从原始列表中获取一个起始关键字。从那里,在你的第二个列表中找到一个以同一个单词开头的二元组,然后再加上另一个单词,并将它们附加在一起。例如,从你的原始列表中选取“the”一词,在浏览了上述语料库之后,你现在应该将其作为短语“the MAN”。冲洗并用这个短语重复:寻找一个遵循n-1原则的二元图,现在找到一个以“man”开头的二元图。你现在有了“那个男人”。冲洗并重复!这将创建语义顺序正确的短语(显然,您将删除句子末尾的重复项)


    你们觉得怎么样?

    你们能为这个问题举一些例子吗?嗨,迈克,这实际上非常接近我所需要的!谢谢你让我使用微软的服务!快速提问——如果我从200个单词(大约是万亿个组合)创建排列,然后创建一个只输出高于某个分数的排列的屈服函数,api函数能够处理那么多的请求吗?这是一个很好的问题,我不知道。我知道这些数据库存在,但我自己从未使用过。如果你发现
    The man
    a plan
    in Panama
    Panama City
    Man Who
    Who is
    is awesome