Java 词的文本分析算法

Java 词的文本分析算法,java,php,algorithm,string,nlp,Java,Php,Algorithm,String,Nlp,我想要一个算法,可以在一个文本块中创建所有可能的短语。例如,在文本中: "My username is click upvote. I have 4k rep on stackoverflow" 它将创建以下组合: "My username" "My Username is" "username is click" "is click" "is click upvote" "click upvote" "i have" "i have 4k" "have 4k" .. 你明白了。基本上,重点

我想要一个算法,可以在一个文本块中创建所有可能的短语。例如,在文本中:

"My username is click upvote. I have 4k rep on stackoverflow"
它将创建以下组合:

"My username"
"My Username is"
"username is click"
"is click"
"is click upvote"
"click upvote"
"i have"
"i have 4k"
"have 4k"
..

你明白了。基本上,重点是从一个句子中找出所有可能的“短语”组合。关于如何最好地实现这一点,您有什么想法吗?

好吧,我不知道PHP或java,但基本上您希望文本中的所有单词都有一个双循环。下面是一些伪代码:

words = split(text)
n = len(words)
for i in 1...n-1 {        // i = first word in phrase 
    for j in i+1...n {       // j = last word in phrase
        phrase = join(words[i:j])
        print phrase
    }
}
注意,第二个循环从i开始,而不是1。这将为您提供从字号i到字号j的所有短语,字号j大于i(因此所有短语至少有两个单词)

啊,我刚刚意识到你可能不希望短语跨越句子的界限。因此,您需要一个外部循环,首先将文本拆分为句子,然后在每个句子上运行此循环


如果你有任何编程经验,这似乎很清楚,但以防万一:
for
语句是循环[like
for(i=1;i好吧,我不懂PHP或java,但基本上你希望文本中的所有单词都有一个双循环。下面是一些伪代码:

words = split(text)
n = len(words)
for i in 1...n-1 {        // i = first word in phrase 
    for j in i+1...n {       // j = last word in phrase
        phrase = join(words[i:j])
        print phrase
    }
}
请注意,第二个循环从i开始,而不是1。这将为您提供从单词i开始到单词j的所有短语,这些单词的数量大于i(因此所有短语至少有两个单词)

啊,我刚刚意识到你可能不希望短语跨越句子边界。所以你需要一个外部循环,首先将文本分割成句子,然后在每个句子上运行这个循环


如果您有任何编程经验,这一点似乎很清楚,但以防万一:for
语句是循环[like
for](i=1;i基本上,你需要首先将文本块分割成句子。这很棘手,即使是在英语中,因为你需要注意句点、问号、感叹号和任何其他句子终止符

然后在删除所有标点符号(逗号、分号、冒号等)后,一次处理一个句子

然后,当您只剩下一组单词时,它会变得更简单:

for i = 1 to num_words-1:
    for j = i+1 to num_words:
        phrase = words[i through j inclusive]
        store phrase
就是这样,非常简单(在文本块的初始按摩之后,这可能不像您想象的那么简单)

这将在每个句子中为您提供两个或更多单词的所有短语

分句、分词、删除标点符号等等都是最难的,但我已经向您展示了一些简单的初始规则。其余的应该在每次文本块破坏算法时添加

更新:

根据要求,以下是一些Java代码,其中给出了以下短语:

public class testme {
    public final static String text =
        "My username is click upvote." +
        " I have 4k rep on stackoverflow.";

哪些产出:

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:-)。它只是为了说明如何根据您的要求从句子中输出单词分组


它并没有完成我在原始答案中提到的所有奇特的句子检测和标点符号删除。

基本上,你需要先将文本块分割成句子。这足够棘手,即使是在英语中,因为你需要注意句点、问号、感叹号和任何其他句子终止符

然后在删除所有标点符号(逗号、分号、冒号等)后,一次处理一个句子

然后,当您只剩下一组单词时,它会变得更简单:

for i = 1 to num_words-1:
    for j = i+1 to num_words:
        phrase = words[i through j inclusive]
        store phrase
就是这样,非常简单(在文本块的初始按摩之后,这可能不像您想象的那么简单)

这将在每个句子中为您提供两个或更多单词的所有短语

分句、分词、删除标点符号等等都是最难的,但我已经向您展示了一些简单的初始规则。其余的应该在每次文本块破坏算法时添加

更新:

根据要求,以下是一些Java代码,其中给出了以下短语:

public class testme {
    public final static String text =
        "My username is click upvote." +
        " I have 4k rep on stackoverflow.";

哪些产出:

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:-)。它只是为了说明如何根据您的要求从句子中输出单词分组


它并没有完成我在原始答案中提到的所有奇特的句子检测和标点符号删除。

只是标记句子并使用组合生成器。该算法由Kenneth H.Rosen描述,离散数学及其应用,第二版(纽约:McGraw-Hill,1991),第284-286页

下面是代码和使用示例:

只需标记句子并使用组合生成器。该算法由Kenneth H.Rosen描述,离散数学及其应用,第二版(纽约:McGraw-Hill,1991),第284-286页

下面是代码和使用示例:

可以玩
str\u word\u count();
并根据需要构建它。

可以玩
str\u word\u count()
并按您喜欢的方式构建它。

您可能已经知道此类短语的技术术语是木瓦。您可以使用Lucene的木瓦作为输入文本。

您可能已经知道此类短语的技术术语是木瓦。您可以使用Lucene的木瓦作为输入文本。

但是这些短语的规则是什么构建?从外观上看,它是2-3个连续的单词…自然语言处理==痛苦的世界我一点也不清楚这个问题是否涉及任何自然语言处理!问题中定义的“短语”似乎没有任何语义。“你明白了。”啊,这是一个伟大规范的经典标志。但是这些短语的规则是什么?从外观上看,它是2-3个连续的单词…自然语言处理==痛苦的世界我一点也不清楚这个问题是否涉及任何自然语言处理。“短语”中似乎没有任何语义在任务中定义