我正在研究NLP项目,我想搜索一组文本,试图找到给定动词 - 对象对的频率。
目标是在给出几种不同的可能性时找到最可能的动词 - 对象对。例如,如果给出了字符串" Swing the stick"和#34;吃棒#34;我希望语料库能够证明某人挥动棍棒的可能性要大于吃一根棍子。
我一直在阅读有关n-gram和语料库语言学的内容,但我很难找到使用Java执行此类搜索的方法,是否有任何API可能有用?
答案 0 :(得分:1)
如果您正在寻找字符串相关性和频率,您可以使用TF-IDF指标和余弦相似性来处理非常简单的模型。如果您将字符串拆分为小块,并且让每个字符串代表一个文档,我认为您可以以非常简单的方式执行此操作。
简而言之,TF是术语频率 - 它计算给定文档中单词存在的总次数。所以考虑你的例子,并为它添加更多信息:
<强>文档1:强> 摆动棍子。吃胡萝卜棒。
<强>文档2:强> 摆动口香糖。
TF值是: Doc1:
swing: 1
the: 2
stick: 2
eat: 1
of: 1
carrot: 1
Doc2:
swing:1
the:1
stick:1
of:1
gum:1
IDF是逆文档频率。这是 - 给定单词中存在多少个文档?此指标用于帮助我们移除类似&#34;&#34;等字词的boas。 &#34;&#34;&#34;这是非常频繁,但不给我们很多语言信息。
回到你的榜样: 的文档1:强> 摆动棍子。吃胡萝卜棒。
<强>文档2:强> 摆动口香糖。
IDF值(对所有文档都是通用的):
swing: 2 (it occurs in 2 documents)
the: 2
stick: 2
eat: 1
of: 2
carrot: 1
gum:1
使用此计算文档中每个单词的TF * IDF值,并开发一个向量来表示文档: 摆动:2(发生在2个文件中)
<强>文档1:强>
the: (TF:2 * IDF:2) = 4
stick: (TF:2 * IDF:2) = 4
eat: (TF: 1 * IDF:1) = 1
of: (TF: 1 * IDF:2) = 2
carrot: (TF: 1 * IDF:1) = 1
gum:(TF:0 * IDF:1) = 0 (gum doesnt exist in doc1 so TF=0)
Doc2:
the: (TF:1 * IDF:2) = 2
stick: (TF:1 * IDF:2) = 2
eat: (TF:0 * IDF:1) = 0
of: (TF:1 * IDF:2) = 2
carrot: (TF:0 * IDF:1) = 0
gum:(TF:1 * IDF:1) =1
现在你有了代表每个文档的向量,你可以通过计算它们之间的点积来计算向量之间的角度来计算它们之间的相似性。
Doc2。 Doc1 = (顺序无关紧要)
the = (doc2: 2 * doc1: 4) = 8
stick: (doc2: 2 * doc1: 4) = 8
eat: (doc2: 0 * doc1: 1) = 0
of: (doc2: 2 * doc1: 2) = 4
carrot: (doc2: 0 * doc1: 1) = 0
gum:(doc2:1 * doc1: 0) = 0
向量的大小是2个向量之间的平方和的平方根: 在这种情况下,Doc1和Doc2之间的距离大小为:
root(8^2 + 8^2 + 0^2 + 4^2 + 0^2 + 0^2) = 12
一旦掌握了所有文档或字符串之间的距离,就可以找出哪些文档或字符串最相似,并且最有可能发生在彼此之间。 2弦之间的距离越小,它们越接近。如果2个弦的幅度更接近,则它们是相似的。
TF和IDF分数通常会转换为日志值,因此很容易计算其上的下游函数。
斯坦福信息检索书(第6章)中有一个很好的教程,可以在这里找到:http://nlp.stanford.edu/IR-book/
此外,perl中还有一些代码,以及一些快速而肮脏的解释: http://nlp-stuff.blogspot.com/2012/09/toy-example-for-computing-document.html http://nlp-stuff.blogspot.com/2012/09/toy-example-for-computing-tfidf.html