如何获得包含特定单词的整句?

时间:2013-05-24 11:36:39

标签: java nlp information-retrieval

我希望通过查找单词得到完整的句子和段落。 例如:如果我在文本中搜索“已发布”“数百名政治犯已被释放,审查规则已经放宽。欧盟和美国已取消对缅甸的大部分制裁。” 它应该回归“数百名政治犯已被释放,审查规则已经放宽。”和整段也是如此。

3 个答案:

答案 0 :(得分:1)

您的数据结构如何?

您可以通过查找1-2个新行字符来获取段落。对于句子,您需要做一些text segmentation。例如,使用适用于Python的NLTK库,您可以使用预训练的Punkt sentence segment-er,该文档在大型语料库中进行训练,以便了解Mr.U.S.A.之类的内容句子的结尾,即使它们包含句点(请参阅此问题:Python split text on sentences)。

一旦您可以将文本细分为段落和句子,您需要决定是否只想对语料库进行线性传递,或者更有可能使用information retrieval技术对数据进行索引,例如构建inverted index,或使用Apache Lunce等现有解决方案。

答案 1 :(得分:1)

使用indexOf,然后向前和向前搜索段落的分隔符。可能是<p>\n

public static String findParagraph(String source, String searchText, String paragraphSeparator)
{
    final int locationOfSearchTerm = source.indexOf(searchText);
    if (locationOfSearchTerm == -1) return null;

    int paragraphEnd = source.indexOf(paragraphSeparator, locationOfSearchTerm + searchText.length);

    //if we didn't find an end of a paragraph, we want to go the end
    if (paragraphEnd == -1) paragraphEnd = searchText.length;

    int paragraphStart = source.lastIndexOf(paragraphSeparator, locationOfSearchTerm);

    //if we didn't find a start of a paragraph, we want to go the beginning
    if (paragraphStart == -1) paragraphStart = 0;

    return searchText.subString(paragraphStart, paragraphEnd - 1);
}

答案 2 :(得分:0)

有很多方法可以做到这一点。这是一个:

创建一个关联句子和段落的地图:

Map<String, String> map = new HashMap<String, String>();
map.put("Hundreds of political prisoners have been released, and censorship rules have been relaxed.", The EU and US have lifted the majority of sanctions against Burma as a result.);
...

一旦您构建了包含所有文本的地图,您就可以这样搜索:

public Map<String, String> searchInSentence(String toFind, Map<String, String> texts){
    Map<String, String> result = new HashMap<String, String>();
    for(Entry<String, String> entry : texts.entrySet(){
       if(entry.getKey().contains(toFind){
           result.put(e.getKey(), e.getValue();
        }
    }

    return result;
}

它将返回一个Map,其中句子是键,段落是值。