Java 查找文档中的单词序列

Java 查找文档中的单词序列,java,android,string,algorithm,Java,Android,String,Algorithm,使用Java(在Android上)我试图找到一种方法(快速方法…)来解决这个问题: 我有一个单词列表(大约10到30个)和一个文档。文档的长度也可能有所不同,大约2500到10000字。这份文件是一本书的一部分 我想在这个文档中找到一个字符串(句子…),它包含了我列表中数量较多的单词。文档中的单词顺序必须与我的单词列表相同。通常情况下,文档中的单词之间不应相差太远,我列表中的每个单词之间可能最多有2到3个单词 更清楚地说,让我们以小数据为例 我的词表是: 计件工作日 我的文件: 就这样,非常小心

使用Java(在Android上)我试图找到一种方法(快速方法…)来解决这个问题:

我有一个单词列表(大约10到30个)和一个文档。文档的长度也可能有所不同,大约2500到10000字。这份文件是一本书的一部分

我想在这个文档中找到一个字符串(句子…),它包含了我列表中数量较多的单词。文档中的单词顺序必须与我的单词列表相同。通常情况下,文档中的单词之间不应相差太远,我列表中的每个单词之间可能最多有2到3个单词

更清楚地说,让我们以小数据为例

我的词表是:

计件工作日

我的文件:

就这样,非常小心。你必须注意停车 通常,所有的猴面包树,在它们能被吃到的第一刻 区别于它们在树上如此相似的蔷薇丛 他们最早的青春。这是一项非常乏味的工作,”小王子说 有一天他对我说:“你应该这么做。” 画一幅漂亮的画,让你住的孩子们能看到 这一切到底是怎么回事。如果他们 我们总有一天要去旅行。“有时候,”他补充道,“没有伤害 把一件工作推迟到另一天。但是 当这是一个猴面包树的问题,这总是意味着一场灾难。我 知道一个星球上住着一个懒惰的人。他忽略了三个 小灌木丛……”所以,正如小王子向我描述的那样,我 我画了一张那个星球的图。我不太喜欢这个 但猴面包树的危险性却很小 理解,这样巨大的风险将由任何 可能在小行星上迷路,这一次我突破了我的 “孩子们,”我直截了当地说,“小心猴面包树!”!"

目标是在文档中找到字符串“将一项工作推迟到另一天没有坏处”

目前,我唯一能想到的是:

1-查找文档中我的列表中第一个单词的第一个匹配项

2-将列表中的字数乘以2或3,得到我必须在文档中检查的字符串长度(关于文档中列表中字数之间的最大字数)

3-通过拆分和循环搜索此文档字符串中我列表中的其他单词(具有我在步骤2中获得的字符串长度)

如果我认为在这个字符串中出现的单词是不够的(可能在50%左右),那么从列表中的第一个单词的下一个单词开始,继续在文档中搜索。< /P> 但我担心这可能会很长,太长,特别是因为我在移动设备上工作……所以我来这里是想了解一些我可能没有想到的想法,或者一些可以帮助我完成这项任务的LIB。我也想过正则表达式,但我不确定这是否是一种更好的方法

@古科夫命题

考虑到最后我的单词列表不能与我的文本顺序不同,它简化了算法。@gukoff答案的开头就足够了。无需实现LIS算法或颠倒列表

//Section = input text
//wordsToFind = words to find in text separated by space
private ArrayList<ArrayList<Integer>> test1(String wordsToFind, Section section) {
    //1. Create the index of your words array.
    String[] wordsArray = wordsToFind.split(" ");

    ArrayList<Integer> indexesSentences = new ArrayList<>();
    ArrayList<ArrayList<Integer>> sentenceArrayIndexes = new ArrayList<>();
    ArrayList<Integer> wordsToFindIndexes = new ArrayList<>();

    for(Sentence sentence:section.getSentences()) {
        indexesSentences.clear();
        for(String sentenceWord:sentence.getWords()) {
            wordsToFindIndexes.clear();
            int j = 0;
            for(String word:wordsArray) {
                if(word.equals(sentenceWord)) {
                    wordsToFindIndexes.add(j+1);
                }
                j++;
            }
            //Collections.reverse(wordsToFindIndexes);
            for(int idx:wordsToFindIndexes) {
                indexesSentences.add(idx);
            }
        }
        sentenceArrayIndexes.add((ArrayList<Integer>)indexesSentences.clone());
    }
    return sentenceArrayIndexes;
}

public class Section {
    private ArrayList<Sentence> sentences;

    public Section (String text) {
        sentences = new ArrayList<>();

        if(text == null || text.trim() == "") {
            throw new IllegalArgumentException("Text not valid");
        }
        String formattedText = text.trim().replaceAll("[^a-zA-Z. ]", "").toLowerCase();
        String[] sentencesArray = formattedText.split("\\.");
        for(String sentenceStr:sentencesArray) {
            if(sentenceStr.trim() != "") {
                sentences.add(new Sentence(sentenceStr));
            }
        }
    }

    public ArrayList<Sentence> getSentences() {
        return sentences;
    }

    public void addSentence(Sentence sentence) {
        sentences.add(sentence);
    }
}
//节=输入文本
//wordsToFind=要在文本中查找的单词,以空格分隔
私有ArrayList test1(字符串字查找,部分){
//1.创建单词数组的索引。
字符串[]wordsArray=wordsToFind.split(“”);
ArrayList Indexesentences=新的ArrayList();
ArrayList语句ArrayIndex=新的ArrayList();
ArrayList wordsToFindIndex=新的ArrayList();
for(句子:section.get句子()){
index.clear();
for(String-sentenceWord:句子.getWords()){
wordsToFindIndexes.clear();
int j=0;
for(字符串字:wordsArray){
if(单词等于(句子单词)){
添加(j+1);
}
j++;
}
//集合。反向(wordsToFindIndexes);
for(int-idx:wordsToFindIndexes){
添加索引内容(idx);
}
}
添加((ArrayList)indexesentences.clone());
}
返回语句数组索引;
}
公共课组{
私刑;
公共部分(字符串文本){
句子=新数组列表();
如果(text==null | | text.trim()==“”){
抛出新的IllegalArgumentException(“文本无效”);
}
String formattedText=text.trim().replaceAll(“[^a-zA-Z.]”,“”)。toLowerCase();
String[]sentencesArray=formattedText.split(“\\”);
for(字符串语句str:sentencesArray){
如果(语句str.trim()!=“”){
添加(新句子(句子str));
}
}
}
公共数组列表getSequences(){
返回句子;
}
公共无效附加条款(判决){
添加(句子);
}
}

考虑到您的文档大小,这里有一个简单的方法应该足够好:

  • 制作一个大小为
    n
    数组(称之为
    words
    ),其中
    n
    文档中的字数
  • 现在填充此数组,以便
    单词[i]=0
    如果您的
    列表中没有与此单词匹配的单词
    words[i]=k
    如果您的
    列表中的
    kth
    单词与该单词匹配(
    1
    基于索引)

    示例:如果您的文档是
    ,那么将一项工作推迟到另一天是没有坏处的。
    而单词列表是
    工作日坏处
    (按此顺序),那么您的
    单词
    数组将如下所示
    [0,0,0,3,0,0,0,0,4,0,1,0,0,2]

  • {
        "a": [1, 5],
        "dog": [2],
        "is": [3],
        "not": [4],
        "human": [6]
    }