use*_*157 9 python linguistics nltk python-3.x
我想从200个单词的列表中创建一些排列 - 这显然会产生一个问题,因为这会导致一些可能的排列非常庞大(一个短语中最多5个单词).为了有效地限制这个数字,我有一个双管齐下的攻击:
这个概念的第二部分让我感到疑惑 - 我知道NLTK提供了查找ngrams的能力,但我见过的每个例子都分析了一个语料库,这是有道理的,因为需要一个freqdist. 但是,是否有可能找到单词排列的PMI?
是否有可能根据自定义语料库中的常见搭配找到我的单词排列的PMI分数? 可以手动完成吗?
例如,虽然排列(啰嗦茶)在语言上是合理的,但它不是一个上下文好的排列.
我知道在一个文本/语料库中找到常见搭配的代码,但这是一个非常独特的问题,我希望有人可以给出一些建议.至少,帮助我解决这个问题!
例
**KW**
Ball
Bat
Pinch
Home
Run
Base
Hitter
Pitcher
Call
etc...
Run Code Online (Sandbox Code Playgroud)
更多背景:现在,可以从这个列表中进行一些排列,但只有少数几个实际上有意义.通过POS过滤器传递此列表允许我创建具有语言意义的关键词 - 但不是那些在语义上正确的关键词,即"Call Ball Hitter".这是我的努力,以某种方式基于某种评分标准(如PMI)创建语义正确的排列.现在我的想法是抓一个网站,即http://en.wikipedia.org/wiki/Baseball,在其中找到常见的ngrams,然后以某种方式判断基于该语料库的关键词排列的相对语义强度.但我正在努力将这一概念化,并且不确定它是否可能.但实际上,我很想听听有关如何有效地找到ngram排列的任何其他想法!这里的练习归结为有效地消除荒谬的排列,而无需手动分类/评分一切!
只是在这里大声思考 - Google Books NGram Viewer已经删除了它的语料库并公开了所有[1,2,3,4,5] -grams的列表,这些列表出现了超过40次,并且它们的频率很重要.因此,您可以获取您生成的每个ngram,并在Google ngram数据库中查找其频率.具有更高计数的Ngrams更可能是语义上合理的.
...下行是下载谷歌的整个ngram数据集就像1 TB,我不知道他们是否有api.
编辑:
如果没有api,我会感到震惊.谷歌似乎也不是城里唯一的游戏,快速搜索出现了:
您不会透露您的 POS 列表,但除非您的关键字列表比您向我们展示的片段复杂得多,否则这似乎可以解决为“找到列表上最长的单词序列”。确保短语合法的唯一方法是它出现在输入语料库中,因此PMI计算是一种转移注意力的方法。也许连 POS 过滤都是不必要的。
words='Ball|Bat|Pinch|Home|Run|Base|Hitter|Pitcher|Call'
curl -s 'http://en.wikipedia.org/wiki/Baseball' |
grep -Eio "\<($words)( +($words))+\>"
Run Code Online (Sandbox Code Playgroud)
(我尝试过grep -w,但这对我来说在 OSX 上不能正常工作grep -o,所以我添加了\<...\>单词边界。)
此特定 URL 和部分关键字列表的输出如下(通过 过滤sort -u | uniq -c | sort -rn):
18 home run
2 base ball
1 pinch hitter
Run Code Online (Sandbox Code Playgroud)
(这很简单,我没有费心编写 Python 脚本。使用 Requests 可以轻松完成。)
在更一般的情况下,像“投手投掷的球是一个吐球”这样的句子包含跨越树边界的片段,您想要过滤掉这些片段(例如“*投手的球”,如果您将“the”添加到单词列表中)然后你确实需要一些语言学(或统计学......)。