如何在语料库中搜索字符串的频率



我正在进行一个NLP项目,我想在文本语料库中搜索,试图找到给定动宾对的频率。

其目的是在给定几种不同的可能性时,找出哪个动宾对最有可能。例如,如果给定字符串"摆动棍子"one_answers"吃棍子",我希望语料库能显示某人摆动棍子的可能性比吃棍子的可能性大得多。

我一直在读关于n-gram和语料库语言学的文章,但我很难找到使用Java执行这种类型搜索的方法,有什么API可能有用吗?

如果您正在寻找字符串相关性和频率,您可能可以使用TF-IDF度量和余弦相似性来创建一个非常简单的模型。我认为,如果你把字符串分成小块,让每个字符串代表一个文档,你可以用一种非常简单的方法来做到这一点。

简而言之,TF是术语频率,它计算一个单词在给定文档中存在的总次数。因此,考虑一下你的例子,并添加更多信息:

Doc1:挥动棍子。吃胡萝卜条。

Doc2:挥动口香糖棒。

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是文档频率的倒数。一个给定的单词存在于多少个文档中?这个度量用于帮助我们去除像"the"one_answers"of"这样非常频繁的单词的boas,但不会给我们很多语言信息。

回到您的示例:Doc1:挥动棍子。吃胡萝卜条。

Doc2:挥动口香糖棒。

IDF值为(所有文件通用):

swing: 2 (it occurs in 2 documents)
the: 2
stick: 2
eat: 1
of: 2
carrot: 1
gum:1

使用此计算文档中每个单词的TF*IDF值,并开发表示文档的向量:摆动:2(出现在2个文档中)

Doc1:

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

矢量的大小是两个矢量之间平方和的平方根:在这种情况下,Doc1和Doc2之间的距离大小为:

root(8^2 + 8^2 + 0^2 + 4^2 + 0^2 + 0^2) = 12

一旦你知道了所有文档或字符串之间的距离大小,你就可以找出哪些文档或字符串最相似,并且最有可能相邻出现。两个字符串之间的距离大小越小,它们就越近。如果两个字符串的大小更接近,则它们是相似的。

TF和IDF得分通常被转换为对数值,这样就可以很容易地计算其下游函数

斯坦福信息检索书(第6章)中有一个很好的教程,可在这里找到:http://nlp.stanford.edu/IR-book/

此外,perl中还有一些代码,以及一些快速而肮脏的解释:http://nlp-stuff.blogspot.com/2012/09/toy-example-for-computing-document.htmlhttp://nlp-stuff.blogspot.com/2012/09/toy-example-for-computing-tfidf.html

最新更新