基本的に、最初にテキストのブロックを文に分割する必要があります。ピリオド、疑問符、感嘆符、その他の文の終了記号に注意する必要があるため、英語でも十分に注意が必要です。
次に、すべての句読点(コンマ、セミコロン、コロンなど)を削除した後、一度に1つの文を処理します。
次に、単語の配列が残っていると、次のようになります。
for i = 1 to num_words-1:
for j = i+1 to num_words:
phrase = words[i through j inclusive]
store phrase
それは、非常に単純です(テキストブロックの最初のマッサージの後、あなたが思うほど単純ではないかもしれません)。
これにより、すべての文に2つ以上の単語のすべてのフレーズが表示されます。
文への分離、単語への分離、句読点の削除などは最も難しいビットですが、従うべきいくつかの簡単な初期ルールをすでに示しました。残りは、テキストのブロックがアルゴリズムを破るたびに追加する必要があります。
アップデート:
要求に応じて、フレーズを与えるJavaコードを次に示します。
public class testme {
public final static String text =
"My username is click upvote." +
" I have 4k rep on stackoverflow.";
public static void procSentence (String sent) {
System.out.println ("==========");
System.out.println ("sentence [" + sent + "]");
// Split sentence at whitspace into array.
String [] sa = sent.split("\\s+");
// Process each starting word.
for (int i = 0; i < sa.length - 1; i++) {
// Process each phrase.
for (int j = i+1; j < sa.length; j++) {
// Build the phrase.
String phrase = sa[i];
for (int k = i+1; k <= j; k++) {
phrase = phrase + " " + sa[k];
}
// This is where you have your phrase. I just
// print it out but you can do whatever you
// wish with it.
System.out.println (" " + phrase);
}
}
}
public static void main(String[] args) {
// This is the block of text to process.
String block = text;
System.out.println ("block [" + block + "]");
// Keep going until no more sentences.
while (!block.equals("")) {
// Remove leading spaces.
if (block.startsWith(" ")) {
block = block.substring(1);
continue;
}
// Find end of sentence.
int pos = block.indexOf('.');
// Extract sentence and remove it from text block.
String sentence = block.substring(0,pos);
block = block.substring(pos+1);
// Process the sentence (this is the "meat").
procSentence (sentence);
System.out.println ("block [" + block + "]");
}
System.out.println ("==========");
}
}
出力:
block [My username is click upvote. I have 4k rep on stackoverflow.]
==========
sentence [My username is click upvote]
My username
My username is
My username is click
My username is click upvote
username is
username is click
username is click upvote
is click
is click upvote
click upvote
block [ I have 4k rep on stackoverflow.]
==========
sentence [I have 4k rep on stackoverflow]
I have
I have 4k
I have 4k rep
I have 4k rep on
I have 4k rep on stackoverflow
have 4k
have 4k rep
have 4k rep on
have 4k rep on stackoverflow
4k rep
4k rep on
4k rep on stackoverflow
rep on
rep on stackoverflow
on stackoverflow
block []
==========
さて、これはかなり基本的なJavaであることに注意してください(Java方言で書かれたCだと言う人もいるかもしれません:-)。これは、要求されたとおりに文から単語のグループ化を出力する方法を説明するためのものです。
元の回答で述べたような凝った文の検出と句読点の削除をすべて行うわけではありません。