文本内容之间的关键词提取和相似度计算
背景
Web應用程序變得越來越智能。 從網站上使用服務的日子已經一去不復返了,用戶不得不填寫一個巨大的表格。 假設您有一個適合書迷的網站。 在Web 2.0之前,此類網站曾經以諸如年齡,閱讀書籍,喜歡的書籍類型,語言偏好,作者偏好等形式向用戶提出各種問題。如今,如今,一種常見的做法是要求用戶在自己(個人資料)上寫一個段落。 在此注釋中,用戶表達了一些細節,但是挑戰在于,如何從這種自由格式的文本中提取有用的信息,以及如何找到興趣相似的用戶?
這種用例已經變得如此普遍,以至于每個Java開發人員都應該了解一些有關從文本檢索信息的技巧。 在本文中,我將引導您完成一種簡單而有效的方法。
從文本中提取信息的過程
其中A和B是集合,而J(A,B)在0到1之間。
實施細節
根據以上幾點,可以開發一個庫來提取關鍵字并計算相似度。 但是,Apache Lucene是一個Java庫,具有大量用于執行關鍵字提取的API。 這是此API不同重要區域的簡要說明。
分詞器
Tokenizer將您的文本分成多個塊。 有不同的令牌生成器,根據您使用的令牌生成器,您可以獲得不同的輸出令牌流(文本塊序列)。
詞干
詞干用于獲取有疑問的單詞的基礎。 在很大程度上取決于所使用的語言。 諸如“ seaerch”,“ searched”,“ searching”等詞源于詞根“ search”。 在信息檢索領域,如果我們能找到根詞,這將非常有用,因為它可以減少噪聲,并且用更少的詞仍可以承載文檔的意圖。 著名的詞干提取算法之一是Porter Stemmer算法。
令牌過濾器
可以將令牌過濾器應用于令牌生成器的輸出以標準化或過濾令牌。 像LowerCaseFilter,它將令牌文本規范化為小寫字母或stopfilter抑制最頻繁且幾乎無用的單詞。 同樣,它在很大程度上取決于語言。 對于英語,這些停用詞是“ a”,“ the”,“ I”,“ be”,“ have”等。
分析儀
分析器是使用令牌生成器從輸入生成令牌,使用詞干提取器減少令牌,使用過濾器抑制/標準化令牌的更高級別的類。 這是粘接其他三個主要組件的類。 不同的分析器使用標記器和過濾器的不同組合。 例如,StandardAnalyzer使用StandardTokenizer從字符串中提取令牌,將其傳遞給LowerCaseFilter以將令牌轉換為小寫,然后將令牌流傳遞給StopFilter以除去最常用的英語單詞。 默認情況下,它不執行詞干。 可以通過根據需要混合和匹配標記器和標記過濾器來開發定制分析器。
代碼遍歷
可以從https://github.com/shamikm/similarity訪問該示例的源代碼。 以下是這些步驟的重點:
- 根據空間,逗號,句點等對英語單詞進行標記。使用StandardTokenizer可以完成此任務。
- 使用LowerCaseFilter將標記轉換為小寫
- 使用StopFilter停止常見的英語單詞
- 使用Porter Stemmer阻止英語單詞
從StemmAnalyzer類:
@Overridepublic TokenStream tokenStream(String fieldName, Reader reader) {(a).. final StandardTokenizer src = new StandardTokenizer(matchVersion, reader);TokenStream tok = new StandardFilter(matchVersion, src);(b).. tok = new LowerCaseFilter(matchVersion, tok);(c).. tok = new StopFilter(matchVersion, tok, getStopWords());(d).. return new PorterStemFilter(tok);}從JaccardIndexBasedSimilarity類:
public double calculateSimilarity(String oneContent, String otherContet) {Set<String> keyWords1 = keywordGenerator.generateKeyWords(oneContent);Set<String> keyWords2 = keywordGenerator.generateKeyWords(otherContet);Set<String> denominator = Sets.union(keyWords1,keyWords2);Set<String> numerator = Sets.intersection(keyWords1,keyWords2);return denominator.size()>0? (double)numerator.size()/(double)denominator.size() : 0;}這是一個示例測試案例,以演示代碼如何工作:
@Testpublic void calculateSim(){SimilarityCalculator calculator = new JaccardIndexBasedSimilarity();Assert.assertEquals(calculator.calculateSimilarity("They Licked the platter clean","Jack Sprat could eat no fat"),0.0);//1(lamb) out of 6(littl,lamb,mari,had,go,sure) words are sameAssert.assertEquals(calculator.calculateSimilarity("Mary had a little lamb", "The lamb was sure to go."), 0.16, 0.02);Assert.assertEquals(calculator.calculateSimilarity("Mary had a little lamb","Mary had a little lamb"),1.0);}您可以脫機運行此過程,并找出一個用戶配置文件與數據庫中任何其他用戶的相似之處,并可以根據相似用戶正在閱讀的內容開始推薦用戶。
結論
從文本中檢索信息是當今的一種常見用例。 對這個關鍵領域有基本的了解對任何開發人員都有幫助。在本文中,我們研究了如何有效地使用Apache Lucene API來提取關鍵字并計算文本之間的相似度。
資源:
- http://en.wikipedia.org/wiki/Jaccard_index
- http://tartarus.org/martin/PorterStemmer/
- http://www.manning.com/ingersoll/
- http://www.amazon.com/Algorithms-Intelligent-Web-Haralambos-Marmanis/dp/1933988665
翻譯自: https://www.javacodegeeks.com/2014/07/keyword-extraction-and-similarity-calculation-among-textual-content.html
總結
以上是生活随笔為你收集整理的文本内容之间的关键词提取和相似度计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星note5报价(note5价格)
- 下一篇: 构建用于测试的超大型内存InputStr