如何在训练Mallet LDA之前将文档细分为句子

时间:2018-02-17 18:08:56

标签: lda mallet

在训练MALLET LDA之前,你们有什么建议可以将文件细分为句子吗?

提前谢谢

3 个答案:

答案 0 :(得分:1)

根据您对句子的定义,可以使用String.split("\\.\\s")在Java中完成。假设用户以句点结束句子并开始使用空格的新句子。由于split的参数是正则表达式,因此转义期间。 \\s表示“任何空格”,它还会处理行尾和制表符。

String test = "Hello. World. Cat eats dog.";
String[] splitString = test.split("\\.\\s");

splitString的内容现在为{"Hello", "World", "Cat eats dog."},请注意,由于后面没有空格,因此未删除最后一个句点。您现在可以将句子写入文件。您可以使用BufferedWriter:

来实现
try{
    String filename = "test";
    int i = 0;
    for(String sentence : splitString) {
        File file = new File(filename+""+i+""+".txt");
        file.createNewFile();
        /*returns false if the file already exists (you can prevent
          overriding like this)*/
        BufferedWriter writer = new BufferedWriter(new FileWriter(file));
        writer.append(sentence + "\n");
        i++;
     }
} catch(IOException ioexception)
{
    System.out.println(ioexception.getMessage());
    System.exit(1);
}

现在,这将在新文件中打印分割句子,每个文件都在不同的文件中。请注意,因为这会导致FAT32格式化系统(标准版)出现空间问题,因为它们为每个文件分配32kB,无论它是否至少为32kB(文件为8kB,但在驱动器上占用32kB空间)。这可能有点不切实际但它确实有效。现在您只需import-dir所有这些文件所在的目录,并使用LDA中的文件。您还可以在此处阅读所提供教程的一部分:

https://programminghistorian.org/lessons/topic-modeling-and-mallet#getting-your-own-texts-into-mallet

对于较大的文件(大约5000个句子及以上[导致至少160 MB的数据])我建议你进行拆分,但不是写入多个文件,而是只写一个并编写自己的导入方式使用MALLET API的数据。请查看http://mallet.cs.umass.edu/import-devel.php以获取开发者指南,并在http://mallet.cs.umass.edu/api/查看有关该更多信息。

答案 1 :(得分:1)

这些功能将准备将您的文档传递到您的LDA中。我还将考虑设置一个bow_corpus,因为LDA接受数字而不是句子。好像单词“ going”被词根化为“ go”,然后编号/索引为2343并按频率计数,它可能会弹出两次,因此bow_corpus将是LDA期望的(2343,2)。

# Gensim unsupervised topic modeling, natural language processing, statistical machine learning
import gensim
# convert a document to a list of tolkens
from gensim.utils import simple_preprocess
# remove stopwords - words that are not telling: "it" "I" "the" "and" ect.
from gensim.parsing.preprocessing import STOPWORDS
# corpus iterator 
from gensim import corpora, models

# nltk - Natural Language Toolkit
# lemmatized — words in third person are changed to first person and verbs in past and future tenses are changed 
# into present.
# stemmed — words are reduced to their root form.
import nltk
nltk.download('wordnet')
from nltk.stem import WordNetLemmatizer, SnowballStemmer
from nltk.stem.porter import *

# Create functions to lemmatize stem, and preprocess

# turn beautiful, beautifuly, beautified into stem beauti 
def lemmatize_stemming(text):
    stemmer = PorterStemmer()
    return stemmer.stem(WordNetLemmatizer().lemmatize(text, pos='v'))

# parse docs into individual words ignoring words that are less than 3 letters long
# and stopwords: him, her, them, for, there, ect since "their" is not a topic.
# then append the tolkens into a list
def preprocess(text):
    result = []
    for token in gensim.utils.simple_preprocess(text):
        if token not in gensim.parsing.preprocessing.STOPWORDS and len(token) > 3:
            nltk.bigrams(token)
            result.append(lemmatize_stemming(token))
    return result


# send the comments row through the preprocessing step
# map itterates through rows into a function

processed_docs = documents['Your Comments title header'].map(preprocess)

答案 2 :(得分:0)

例如,您可以使用OpenNLP句子检测工具。他们已经存在了一段时间,在大多数情况下表现得不错。

文档为here,可以下载模型here。请注意,1.5版本的型号与较新的opennlp-tools版本1.8.4完全兼容

如果您使用的是Maven,只需将以下内容添加到您的pom中即可。

<dependency>
  <groupId>org.apache.opennlp</groupId>
  <artifactId>opennlp-tools</artifactId>
  <version>1.8.4</version>
</dependency>

如果您计划将模型输入从文档切换为句子,请注意vanilla LDA(这也会影响Mallet中的当前实现,afaik)可能无法产生令人满意的结果,因为单词共现计数不是很明显句子。

我建议调查段落级别是否更有趣。可以使用换行符模式提取文档中的段落。例如,当您有两个连续的换行符时,会开始一个新段落。