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