精华内容
下载资源
问答
  • 文本处理

    千次阅读 2019-01-29 22:08:00
    富文本(Rich Text)或者叫做富文本格式,简单来说就是在文档中可以使用多种格式,比如字体颜色、图片和表格等等。它是与纯文本(Plain Text)相对而言的,...在Qt中提供了对富文本处理的支持。Qt中对富文本的处理...

     富文本(Rich Text)或者叫做富文本格式,简单来说就是在文档中可以使用多种格式,比如字体颜色、图片和表格等等。它是与纯文本(Plain Text)相对而言的,比如Windows上的记事本就是纯文本编辑器,而Word就是富文本编辑器。

    • 富文本文档结构
    • 文本块
    • 表格、列表与图片
    • 查找功能
    • 语法高亮与HTML

    1 富文本文档结构

    在Qt中提供了对富文本处理的支持。Qt中对富文本的处理分为了编辑操作和只读操作两种方式。

    • 编辑操作是使用基于光标的一些接口函数,这样更好的模拟了用户的编辑操作,更加容易理解,而且不会丢失底层的文档框架。
    • 而对于文档结构的概览,使用了只读的分层次的接口函数,它们有利于文档的检索和输出。

    对于文档的读取和编辑要使用不同方面的两组接口。

    • 文档的光标主要基于QTextCursor类
    • 文档的框架主要基于QTextDocument类

    一个富文本文档的结构被分为了几种元素来表示:

    • 框架(QTextFrame)
    • 文本块(QTextBlock)
    • 表格(QTextTable)
    • 列表(QTextList)

     每种元素的格式又使用相应的format类来表示:

    • 框架格式(QTextFrameFormat)
    • 文本块格式(QTextBlockFormat)
    • 表格格式(QTextTableFormat)
    • 列表格式(QTextListFormat)

    这些格式一般在编辑文档时使用,所以它们常和QTextCursor类配合使用。

    因为QTextEdit类就是一个富文本编辑器,所以在构建QTextEdit类的对象时就已经构建了一个QTextDocument类对象和一个QTextCursor类对象,只需调用它们进行相应的操作即可。

    一个空的文档包含了一个根框架(Root frame),这个根框架又包含了一个空的文本块(Block)。框架将一个文档分为多个部分,在根框架里可以再添加文本块、子框架和表格等。 

      

    设置根框架

    QTextDocument *document = ui->textEdit->document(); //获取文档对象
    
    QTextFrame *rootFrame = document->rootFrame();      // 获取根框架
    
    QTextFrameFormat format;                            // 创建框架格式
    
    format.setBorderBrush(Qt::red);                     // 边界颜色
    
    format.setBorder(3);                                // 边界宽度
    
    rootFrame->setFrameFormat(format);                  // 框架使用格式

    添加子框架

    QTextFrameFormat frameFormat;
    
    frameFormat.setBackground(Qt::lightGray);                // 设置背景颜色
    
    frameFormat.setMargin(10);                               // 设置边距
    
    frameFormat.setPadding(5);                               // 设置填衬
    
    frameFormat.setBorder(2);
    
    //设置边框样式
    frameFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Dotted); 
    
    QTextCursor cursor = ui->textEdit->textCursor();         // 获取光标
    
    cursor.insertFrame(frameFormat);                         // 在光标处插入框架

    2 文本块

    文本块QTextBlock类为文本文档QTextDocument提供了一个文本片段(QTextFragment)的容器。

     一个文本块可以看做是一个段落,但是它不能使用回车换行,因为一个回车换行就表示创建一个新的文本块。QTextBlock提供了只读接口,它是前面提到的文档分层次的接口的一部分,如果QTextFrame看做是一层,那么其中的QTextBlock就是另一层。

    文本块的格式由QTextBlockFormat类来处理,它主要涉及对齐方式,文本块四周的边白,缩进等内容。而文本块中的文本内容的格式,比如字体大小、加粗、下划线等内容,则由QTextCharFormat类来设置。

    遍历框架

    QTextDocument *document = ui->textEdit->document();
        QTextFrame *frame = document->rootFrame();
        QTextFrame::iterator it;                       // 建立QTextFrame类的迭代器
        for (it = frame->begin(); !(it.atEnd()); ++it) {
             QTextFrame *childFrame = it.currentFrame();// 获取当前框架的指针
             QTextBlock childBlock = it.currentBlock(); // 获取当前文本块
             if (childFrame)
                 qDebug() << "frame";
             else if (childBlock.isValid())
                 qDebug() << "block:" << childBlock.text();
        }
    

    遍历子框架

    QTextDocument *document = ui->textEdit->document();
        QTextBlock block = document->firstBlock();    // 获取文档的第一个文本块
        for (int i = 0; i < document->blockCount(); i++) {
            qDebug() << tr("文本块%1,文本块首行行号为:%2,长度为:%3,内容为:")
                        .arg(i).arg(block.firstLineNumber()).arg(block.length())
                        << block.text();
            block = block.next();                         // 获取下一个文本块
        }
    

     

    QTextCursor cursor = ui->textEdit->textCursor();
    QTextBlockFormat blockFormat;      // 文本块格式
    blockFormat.setAlignment(Qt::AlignCenter); // 水平居中
    cursor.insertBlock(blockFormat);   // 使用文本块格式
    QTextCharFormat charFormat;// 字符格式
    charFormat.setBackground(Qt::lightGray);   // 背景色
    charFormat.setForeground(Qt::blue);// 字体颜色
    // 使用宋体,12号,加粗,倾斜
    charFormat.setFont(QFont(tr("宋体"), 12, QFont::Bold, true)); 
    charFormat.setFontUnderline(true); // 使用下划线
    cursor.setCharFormat(charFormat);  // 使用字符格式
    cursor.insertText(tr("测试字体")); // 插入文本
    

    3 表格、列表和图片

    //插入表格   
        QTextCursor cursor = ui->textEdit->textCursor();
        QTextTableFormat format;          // 表格格式
        format.setCellSpacing(2);         // 表格外边白
        format.setCellPadding(10);        // 表格内边白
        cursor.insertTable(2, 2, format); // 插入2行2列表格
    //插入列表
       QTextListFormat format;           // 列表格式
        format.setStyle(QTextListFormat::ListDecimal);   // 数字编号
        ui->textEdit->textCursor().insertList(format);
    //插入图片
        QTextImageFormat format;          // 图片格式
        format.setName("logo.png");       // 图片路径
        ui->textEdit->textCursor().insertImage(format);
    

    4 查找功能

    //查找文本   
       QDialog *dlg = new QDialog(this);         // 创建对话框
        lineEdit = new QLineEdit(dlg);            // 创建行编辑器
        QPushButton *btn = new QPushButton(dlg);  // 创建按钮
        btn->setText(tr("查找下一个"));
        connect(btn,SIGNAL(clicked()),this,SLOT(findNext())); // 关联信号和槽
        QVBoxLayout *layout = new QVBoxLayout;    // 创建垂直布局管理器
        layout->addWidget(lineEdit);              // 添加部件
        layout->addWidget(btn);
        dlg->setLayout(layout);                   // 在对话框中使用布局管理器
        dlg->show();
    
    //查找下一个
       QString string = lineEdit->text();
        // 使用查找函数查找指定字符串,查找方式为向后查找
        bool isfind = ui->textEdit->find(string, QTextDocument::FindBackward);
        if(isfind){                // 如果查找成功,输出字符串所在行和列的编号
            qDebug() << tr("行号:%1 列号:%2")
                        .arg(ui->textEdit->textCursor().blockNumber())
                        .arg(ui->textEdit->textCursor().columnNumber());
        }

    5 语法高亮

    在使用Qt Creator编辑代码时可以发现,输入关键字时会显示不同的颜色,这就是所谓的语法高亮。

    在Qt的富文本处理中提供了QSyntaxHighlighter类来实现语法高亮。为了实现这个功能,需要创建QSyntaxHighlighter类的子类,然后重新实现highlightBlock()函数,使用时直接将QTextDocument类对象指针作为其父部件指针,这样就可以自动调用highlightBlock()函数了。

    例如,自定义的类为MySyntaxHighlighter,像这样来使用:      highlighter = new MySyntaxHighlighter(ui->textEdit->document());      这里创建了MySyntaxHighlighter类的对象,并且使用编辑器的文档对象指针作为其参数,这样,每当编辑器中的文本改变时都会调用highlightBlock()函数来设置语法高亮。

    重新实现highlightBlock()函数:

    QTextCharFormat myFormat;             // 字符格式
         myFormat.setFontWeight(QFont::Bold);
         myFormat.setForeground(Qt::green);
         QString pattern = "\\bchar\\b";       // 要匹配的字符,这里是“char”单词
         QRegExp expression(pattern);          // 创建正则表达式
         int index = text.indexOf(expression); // 从位置0开始匹配字符串
         // 如果匹配成功,那么返回值为字符串的起始位置,它大于或等于0
         while (index >= 0) {    
             int length = expression.matchedLength(); // 要匹配字符串的长度
             setFormat(index, length, myFormat);      // 对要匹配的字符串设置格式
             index = text.indexOf(expression, index + length); // 继续匹配
         }

    在这里主要是使用了正则表达式和QString类的indexOf()函数来进行字符串的匹配,如果匹配成功,则使用QSyntaxHighlighter类的setFormat()函数来设置字符格式。

    6 HTML

    在富文本处理中还提供了对HTML子集的支持,可以在QLabel或者QTextEdit添加文本时使用HTML标签或者CSS属性,例如:

    ui->textEdit->append(tr("<h1><font color=red>使用HTML</font></h1>"));  

    这里往编辑器中添加了文本,并且使用了HTML标签,

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  •  针对前面学习的 Python读取文本内容、中文文本预处理、利用jieba对中文进行分词、中文分词后去除停用词、调整jieba分词结果,我们已经掌握了中文文本处理的各个步骤的方法,现在对以上学习的知识做个总结,用一个...

    中文文本处理总结(读取文本、文本预处理、分词、去除停用词)

     针对前面学习的 Python读取文本内容中文文本预处理利用jieba对中文进行分词中文分词后去除停用词调整jieba分词结果,我们已经掌握了中文文本处理的各个步骤的方法,现在对以上学习的知识做个总结,用一个例子把它们汇总在一起,完成对中文的文本处理:

    import jieba
    import re
    import jieba.posseg as pseg
    
    filename = '白雪公主片段'    
    filepath1 = 'D:/大学工作所做文档/学习资料/毕业设计学习准备/编程学习/白雪公主片段.txt'
    filepath2 = 'D:/大学工作所做文档/学习资料/毕业设计学习准备/编程学习/stop_words.txt' 
    
    def stopwordslist(filepath2):    # 定义函数创建停用词列表
        stopword = [line.strip() for line in open(filepath2, 'r').readlines()]    #以行的形式读取停用词表,同时转换为列表
        return stopword
    
    def pretext(filename,filepath1):     #定义函数
        try:
            with open(filepath1,encoding='UTF-8') as file:
                contents = file.read()                      #读取文本文件
                print('【读取的文本为:】'+'\n'+contents)
                
                content1 = contents.replace(' ','')     # 去掉文本中的空格
                print('\n【去除空格后的文本:】'+'\n'+content1)
                
                pattern = re.compile("[^\u4e00-\u9fa5^a-z^A-Z^0-9]")    #只保留中英文、数字,去掉符号
                content2= re.sub(pattern,'',content1)      #把文本中匹配到的字符替换成空字符
                print('\n【去除符号后的文本:】'+'\n'+ content2)
                
        except FileNotFoundError: 
            message = "Sorry, the file " + filename + " does not exist." 
            print(message)
            
        else:
            cutwords = jieba.lcut(content2,cut_all=False)    #精确模式分词
            print ('\n【精确模式分词后:】'+ '\n'+"/".join(cutwords)) 
            
            stopwords = stopwordslist(filepath2)     # 这里加载停用词的路径
            words = ''
            for word in cutwords:     #for循环遍历分词后的每个词语
                if word not in stopwords:     #判断分词后的词语是否在停用词表内
                    if word != '\t':
                        words += word
                        words += "/"
            print('\n【去除停用词后的分词:】'+ '\n'+ words) 
            content3 = words.replace('/','')     # 去掉文本中的斜线
            
            lastword = pseg.lcut(content3)      #使用for循环逐一获取划分后的词语进行词性标注
            print('\n【对去除停用词后的分词进行词性标注:】'+ '\n')
            print([(words.word,words.flag) for words in lastword])    #转换为列表
            
    stopwordslist(filepath2)  #调用函数
    pretext(filename,filepath1)   #调用函数
    

    运行结果:

    【读取的文本为:】
        镜中的她有着棕黄色的头发, 直挺的鼻梁,以及如同大理石般的白色肌肤……。皇后非常重视肌肤的保养,不惜重金从先进的法国买来护肤的配方,并使用各种草药制成油膏,每天早上都给肌肤做最好的按摩。  然而岁月不饶人,皇后的美貌、是有衰退的一天。  不知从何时开始,皇后的肌肤已逐渐松弛, 眼角出现了细纹,而国王也似乎不再那么的享受鱼水之欢了;看来,国王已经对皇后不再感兴趣。 
      皇后当然也听说过国王想在 贵族千金 中寻找宠妃的传闻,因为在不打仗的时候,即使留在城内,国王也把大部分时间都花在探访皇亲国威上。 
    
    【去除空格后的文本:】
    镜中的她有着棕黄色的头发,直挺的鼻梁,以及如同大理石般的白色肌肤……。皇后非常重视肌肤的保养,不惜重金从先进的法国买来护肤的配方,并使用各种草药制成油膏,每天早上都给肌肤做最好的按摩。然而岁月不饶人,皇后的美貌、是有衰退的一天。不知从何时开始,皇后的肌肤已逐渐松弛,眼角出现了细纹,而国王也似乎不再那么的享受鱼水之欢了;看来,国王已经对皇后不再感兴趣。
      皇后当然也听说过国王想在贵族千金中寻找宠妃的传闻,因为在不打仗的时候,即使留在城内,国王也把大部分时间都花在探访皇亲国威上。
    
    【去除符号后的文本:】
    镜中的她有着棕黄色的头发直挺的鼻梁以及如同大理石般的白色肌肤皇后非常重视肌肤的保养不惜重金从先进的法国买来护肤的配方并使用各种草药制成油膏每天早上都给肌肤做最好的按摩然而岁月不饶人皇后的美貌是有衰退的一天不知从何时开始皇后的肌肤已逐渐松弛眼角出现了细纹而国王也似乎不再那么的享受鱼水之欢了看来国王已经对皇后不再感兴趣皇后当然也听说过国王想在贵族千金中寻找宠妃的传闻因为在不打仗的时候即使留在城内国王也把大部分时间都花在探访皇亲国威上
    
    【精确模式分词后:】
    镜中/的/她/有着/棕黄色/的/头发/直挺/的/鼻梁/以及/如同/大理石/般的/白色/肌肤/皇后/非常重视/肌肤/的/保养/不惜重金/从/先进/的/法国/买来/护肤/的/配方/并/使用/各种/草药/制成/油膏/每天/早上/都/给/肌肤/做/最好/的/按摩/然而/岁月不饶人/皇后/的/美貌/是/有/衰退/的/一天/不知/从/何时/开始/皇后/的/肌肤/已/逐渐/松弛/眼角/出现/了/细纹/而/国王/也/似乎/不再/那么/的/享受/鱼水之欢/了/看来/国王/已经/对/皇后/不再/感兴趣/皇后/当然/也/听说/过/国王/想/在/贵族/千金/中/寻找/宠妃/的/传闻/因为/在/不/打仗/的/时候/即使/留在/城内/国王/也/把/大部分/时间/都/花/在/探访/皇亲/国威/上
    
    【去除停用词后的分词:】
    镜中/有着/棕黄色/头发/直挺/鼻梁/如同/大理石/般的/白色/肌肤/皇后/非常重视/肌肤/保养/不惜重金/先进/法国/买来/护肤/配方/使用/草药/制成/油膏/每天/早上/肌肤/最好/按摩/岁月不饶人/皇后/美貌/衰退/一天/不知/皇后/肌肤/逐渐/松弛/眼角/出现/细纹/国王/似乎/享受/鱼水之欢/国王/皇后/感兴趣/皇后/听说/国王/贵族/千金/寻找/宠妃/打仗/留在/城内/国王/大部分/时间/探访/皇亲/国威/
    
    【对去除停用词后的分词进行词性标注:】
    
    [('镜', 'ng'), ('中', 'f'), ('有着', 'v'), ('棕黄色', 'n'), ('头发', 'n'), ('直挺', 'z'), ('鼻梁', 'n'), ('如同', 'd'), ('大理石', 'n'), ('般的', 'u'), ('白色', 'n'), ('肌肤', 'n'), ('皇后', 'n'), ('非常重视', 'l'), ('肌肤', 'n'), ('保养', 'v'), ('不惜重金', 'l'), ('先进', 'a'), ('法国', 'ns'), ('买来', 'v'), ('护肤', 'n'), ('配方', 'n'), ('使用', 'v'), ('草药', 'n'), ('制成', 'v'), ('油膏', 'n'), ('每天', 'r'), ('早上', 't'), ('肌肤', 'n'), ('最好', 'a'), ('按摩', 'v'), ('岁月不饶人', 'l'), ('皇后', 'n'), ('美貌', 'nz'), ('衰退', 'v'), ('一天', 'm'), ('不知', 'v'), ('皇后', 'n'), ('肌肤', 'n'), ('逐渐', 'd'), ('松弛', 'a'), ('眼角', 'n'), ('出现', 'v'), ('细纹', 'n'), ('国王', 'n'), ('似乎', 'd'), ('享受', 'v'), ('鱼水之欢', 'i'), ('国王', 'n'), ('皇后', 'n'), ('感兴趣', 'n'), ('皇后', 'n'), ('听说', 'v'), ('国王', 'n'), ('贵族', 'n'), ('千金', 'n'), ('寻找', 'v'), ('宠妃', 'n'), ('打仗', 'v'), ('留在', 'v'), ('城内', 's'), ('国王', 'n'), ('大部分', 'm'), ('时间', 'n'), ('探访', 'v'), ('皇亲', 'n'), ('国威', 'n')]
    

    即:

    【读取的文本为:】
    镜中的她有着棕黄色的头发, 直挺的鼻梁,以及如同大理石般的白色肌肤……。皇后非常重视肌肤的保养,不惜重金从先进的法国买来护肤的配方,并使用各种草药制成油膏,每天早上都给肌肤做最好的按摩。 然而岁月不饶人,皇后的美貌、是有衰退的一天。 不知从何时开始,皇后的肌肤已逐渐松弛, 眼角出现了细纹,而国王也似乎不再那么的享受鱼水之欢了;看来,国王已经对皇后不再感兴趣。
      皇后当然也听说过国王想在 贵族千金 中寻找宠妃的传闻,因为在不打仗的时候,即使留在城内,国王也把大部分时间都花在探访皇亲国威上。

    【去除空格后的文本:】
    镜中的她有着棕黄色的头发,直挺的鼻梁,以及如同大理石般的白色肌肤……。皇后非常重视肌肤的保养,不惜重金从先进的法国买来护肤的配方,并使用各种草药制成油膏,每天早上都给肌肤做最好的按摩。然而岁月不饶人,皇后的美貌、是有衰退的一天。不知从何时开始,皇后的肌肤已逐渐松弛,眼角出现了细纹,而国王也似乎不再那么的享受鱼水之欢了;看来,国王已经对皇后不再感兴趣。
      皇后当然也听说过国王想在贵族千金中寻找宠妃的传闻,因为在不打仗的时候,即使留在城内,国王也把大部分时间都花在探访皇亲国威上。

    【去除符号后的文本:】
    镜中的她有着棕黄色的头发直挺的鼻梁以及如同大理石般的白色肌肤皇后非常重视肌肤的保养不惜重金从先进的法国买来护肤的配方并使用各种草药制成油膏每天早上都给肌肤做最好的按摩然而岁月不饶人皇后的美貌是有衰退的一天不知从何时开始皇后的肌肤已逐渐松弛眼角出现了细纹而国王也似乎不再那么的享受鱼水之欢了看来国王已经对皇后不再感兴趣皇后当然也听说过国王想在贵族千金中寻找宠妃的传闻因为在不打仗的时候即使留在城内国王也把大部分时间都花在探访皇亲国威上

    【精确模式分词后:】
    镜中/的/她/有着/棕黄色/的/头发/直挺/的/鼻梁/以及/如同/大理石/般的/白色/肌肤/皇后/非常重视/肌肤/的/保养/不惜重金/从/先进/的/法国/买来/护肤/的/配方/并/使用/各种/草药/制成/油膏/每天/早上/都/给/肌肤/做/最好/的/按摩/然而/岁月不饶人/皇后/的/美貌/是/有/衰退/的/一天/不知/从/何时/开始/皇后/的/肌肤/已/逐渐/松弛/眼角/出现/了/细纹/而/国王/也/似乎/不再/那么/的/享受/鱼水之欢/了/看来/国王/已经/对/皇后/不再/感兴趣/皇后/当然/也/听说/过/国王/想/在/贵族/千金/中/寻找/宠妃/的/传闻/因为/在/不/打仗/的/时候/即使/留在/城内/国王/也/把/大部分/时间/都/花/在/探访/皇亲/国威/上

    【去除停用词后的分词:】
    镜中/有着/棕黄色/头发/直挺/鼻梁/如同/大理石/般的/白色/肌肤/皇后/非常重视/肌肤/保养/不惜重金/先进/法国/买来/护肤/配方/使用/草药/制成/油膏/每天/早上/肌肤/最好/按摩/岁月不饶人/皇后/美貌/衰退/一天/不知/皇后/肌肤/逐渐/松弛/眼角/出现/细纹/国王/似乎/享受/鱼水之欢/国王/皇后/感兴趣/皇后/听说/国王/贵族/千金/寻找/宠妃/打仗/留在/城内/国王/大部分/时间/探访/皇亲/国威/

    【对去除停用词后的分词进行词性标注:】

    [(‘镜’, ‘ng’), (‘中’, ‘f’), (‘有着’, ‘v’), (‘棕黄色’, ‘n’), (‘头发’, ‘n’), (‘直挺’, ‘z’), (‘鼻梁’, ‘n’), (‘如同’, ‘d’), (‘大理石’, ‘n’), (‘般的’, ‘u’), (‘白色’, ‘n’), (‘肌肤’, ‘n’), (‘皇后’, ‘n’), (‘非常重视’, ‘l’), (‘肌肤’, ‘n’), (‘保养’, ‘v’), (‘不惜重金’, ‘l’), (‘先进’, ‘a’), (‘法国’, ‘ns’), (‘买来’, ‘v’), (‘护肤’, ‘n’), (‘配方’, ‘n’), (‘使用’, ‘v’), (‘草药’, ‘n’), (‘制成’, ‘v’), (‘油膏’, ‘n’), (‘每天’, ‘r’), (‘早上’, ‘t’), (‘肌肤’, ‘n’), (‘最好’, ‘a’), (‘按摩’, ‘v’), (‘岁月不饶人’, ‘l’), (‘皇后’, ‘n’), (‘美貌’, ‘nz’), (‘衰退’, ‘v’), (‘一天’, ‘m’), (‘不知’, ‘v’), (‘皇后’, ‘n’), (‘肌肤’, ‘n’), (‘逐渐’, ‘d’), (‘松弛’, ‘a’), (‘眼角’, ‘n’), (‘出现’, ‘v’), (‘细纹’, ‘n’), (‘国王’, ‘n’), (‘似乎’, ‘d’), (‘享受’, ‘v’), (‘鱼水之欢’, ‘i’), (‘国王’, ‘n’), (‘皇后’, ‘n’), (‘感兴趣’, ‘n’), (‘皇后’, ‘n’), (‘听说’, ‘v’), (‘国王’, ‘n’), (‘贵族’, ‘n’), (‘千金’, ‘n’), (‘寻找’, ‘v’), (‘宠妃’, ‘n’), (‘打仗’, ‘v’), (‘留在’, ‘v’), (‘城内’, ‘s’), (‘国王’, ‘n’), (‘大部分’, ‘m’), (‘时间’, ‘n’), (‘探访’, ‘v’), (‘皇亲’, ‘n’), (‘国威’, ‘n’)]

     后面的学习将进行英文的分词处理以及关键词的筛选,谢谢你的阅读!

    展开全文
  • 本次学习应用于文本处理方面,主要的功能是为了实现删除文本中的空白行,便于我们阅读和储存。 java.io包为我们提供了相关的API,实现了对所有外部系统的输入输出操作,这就是我们这章所要学习的技术。 Java为我们...

    一、前言

    本次学习应用于文本处理方面,主要的功能是为了实现删除文本中的空白行,便于我们阅读和储存。

    java.io包为我们提供了相关的API,实现了对所有外部系统的输入输出操作,这就是我们这章所要学习的技术。

    Java为我们提供了多种多样的IO流,我们可以根据不同的功能及性能要求挑选合适的IO流。

    二、分析学习

    1)数据源

    数据源data source,提供数据的原始媒介。常见的数据源有:数据库、文件、其他程序、内存、网络连接、IO设备。如图所示。

    ​ 数据源分为:源设备、目标设备。

    1. 源设备:为程序提供数据,一般对应输入流。
    2. 目标设备:程序数据的目的地,一般对应输出流。
      1

    2)数据流

    是一个抽象、动态的概念,是一连串连续动态的数据集合。

    ​ 对于输入流而言,数据源就像水箱,流(stream)就像水管中流动着的水流,程序就是我们最终的用户。我们通过流(A Stream)将数据源(Source)中的数据(information)输送到程序(Program)中。

    ​ 对于输出流而言,目标数据源就是目的地(dest),我们通过流(A Stream)将程序(Program)中的数据(information)输送到目的数据源(dest)中。
    2

    3)流的概念细分

    按流的方向分类:

    ​ 1. 输入流:数据流向是数据源到程序(以InputStream、Reader结尾的流)。

    ​ 2. 输出流:数据流向是程序到目的地(以OutPutStream、Writer结尾的流)。

    按处理的数据单元分类:

    ​ 1. 字节流:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流,如FileInputStream、FileOutputStream。

    ​ 2. 字符流:以字符为单位获取数据,命名上以Reader/Writer结尾的流一般是字符流,如FileReader、FileWriter。

    按处理对象不同分类:

    ​ 1. 节点流:可以直接从数据源或目的地读写数据,如FileInputStream、FileReader、DataInputStream等。

    ​ 2. 处理流:不直接连接到数据源或目的地,是”处理流的流”。通过对其他流的处理提高程序的性能,如BufferedInputStream、BufferedReader等。处理流也叫包装流。

    ​ 节点流处于IO操作的第一线,所有操作必须通过它们进行;处理流可以对节点流进行包装,提高性能或提高程序的灵活性。

    三、编程学习

    1)任务要求

    • 完成一个 java application应用程序,实现文本文档的读取和写入,将修改后(删除空白行)的新内容存入到新的文本文档中。
    • 应用数据流的相关知识,使用BufferedReader/BufferedWriter处理流:将Reader/Writer对象进行包装,增加缓存功能,提高读写效率。使用InputStreamReader/OutputStreamWriter处理流:将字节流对象转化成字符流对象。

    2)程序代码

    /* 项目名称:Task_Shao
     * 创建时间:2019年1月23日
     * 创建者:Administrator
     * 创建地点:hb
     * 功能:删除空白行(java IO流)
     */
    import java.io.*;//导入java.io包中的所有类
    import java.util.Scanner;//导入java.util包中的Scanner类
    public class delete_blank_lines {//创建类名
    	public static void main(String[] args) throws Exception{//程序主函数入口
    		Scanner s = new Scanner(System.in);//获取键盘输入并赋值给s字符串
    	    Scanner t = new Scanner(System.in);//获取键盘输入并赋值给t字符串
    	    System.out.println("请输入想要打开的文本文档:");//输出提示信息
    	    String a = s.nextLine();//定义字符串变量,与用户输入的信息相等
    	    System.out.println("请输入想要写入内容的文本文档:");//输出提示信息
    	    String b = t.nextLine();//定义字符串变量,与用户输入的信息相等
    		File file=new File(b);//创建待写入文件		
    		if(!file.exists()) {//若指定路径下该文件不存在执行if语句
    			file.createNewFile();//在指定路径下新建该文件
    			}
    		//如果存在该文件夹则继续往下执行		
    		try{ //将逻辑语句用try包起来
            int i=0;//新建行号的符号i
    		String string=null;//新建空字符串
    		//FileInputStream fis = null;
            //BufferedInputStream bis = null;
            //FileOutputStream fos = null;
            //BufferedOutputStream bos = null;
    		//读出文档数据流方式
    		InputStreamReader isr=new InputStreamReader(new FileInputStream(a),"UTF-8");//选择编码方式,避免乱码
    		BufferedReader read=new BufferedReader(isr);//写入数据流方式
    		OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream(file),"UTF-8");//选择编码方式,避免乱码
    		BufferedWriter write=new BufferedWriter(osw);//写入数据流方式
    		while((string = read.readLine())!= null) {//readLine()方法,要读取的一行内容不为空就一直执行
    			if(string.equals("")) {//if条件语句
    			continue;//该行为空时不进行任何操作
    			}
    			else {//否则
    			i++;
    			//	write.write("["+i+"]");//可在文档中标出行号(有需要时可以取消该注释)
    			write.write(string+"\r\n");//在新文档中写入指定内容			
    			}
    		}	
    		write.close();//关闭流
    		read.close();//关闭流
    		System.out.println("所需内容已写入指定文档!");//输出提示信息	
            }
    		catch(Exception e) {//当代码异常时用catch捕获异常
    			e.printStackTrace();//printStackTrace()方法是打印异常信息在程序中出错的位置及原因
    		}		
    	}
    }
    

    3)执行结果(以西游记文本为例)

    2
    1
    3

    四、总结(Java中IO流类的体系

    Java为我们提供了多种多样的IO流,我们可以根据不同的功能及性能要求挑选合适的IO流,如图所示,为Java中IO流类的体系。

    ​ 注:这里只列出常用的类,详情可以参考JDK API文档。粗体标注为常用!

    113

    从上图发现,很多流都是成对出现的,比如:FileInputStream/FileOutputStream,显然是对文件做输入和输出操作的。我们下面简单做个总结:

    1. InputStream/OutputStream

    ​ 字节流的抽象类。

    2. Reader/Writer

    ​ 字符流的抽象类。

    3. FileInputStream/FileOutputStream

    ​ 节点流:以字节为单位直接操作“文件”。

    4. ByteArrayInputStream/ByteArrayOutputStream

    ​ 节点流:以字节为单位直接操作“字节数组对象”。

    5. ObjectInputStream/ObjectOutputStream

    ​ 处理流:以字节为单位直接操作“对象”。

    6. DataInputStream/DataOutputStream

    ​ 处理流:以字节为单位直接操作“基本数据类型与字符串类型”。

    7. FileReader/FileWriter

    ​ 节点流:以字符为单位直接操作“文本文件”(注意:只能读写文本文件)。

    8. BufferedReader/BufferedWriter

    ​ 处理流:将Reader/Writer对象进行包装,增加缓存功能,提高读写效率。

    9. BufferedInputStream/BufferedOutputStream

    ​ 处理流:将InputStream/OutputStream对象进行包装,增加缓存功能,提高 读写效率。

    10. InputStreamReader/OutputStreamWriter

    ​ 处理流:将字节流对象转化成字符流对象。

    11. PrintStream

    ​ 处理流:将OutputStream进行包装,可以方便地输出字符,更加灵活。

    建议

    ​ 上面的解释,一句话就点中了流的核心作用。大家在后面学习的时候,用心体会。
    希望大家在编程和学习的时候,多查看书籍和API集,实践才能出真知。大家都一起加油努力!~

    参考链接:
    https://blog.csdn.net/mas2005/article/details/82432068
    https://bbs.csdn.net/topics/380239879
    https://blog.csdn.net/bks429/article/details/51814520


    展开全文
  • 数据挖掘 NLP 之 文本挖掘 文本处理 通用流程  数据挖掘中的文本挖掘不论是对于企业应用,还是研究者工作,或者是参与数据竞赛项目,都是基础的工作。通过前面的一些实践工作,现总结出文本挖掘文本处理的...

    数据挖掘 NLP 之 文本挖掘 文本处理 通用流程


    原创作品, 转载请注明出处:[ Mr.Scofield  http://blog.csdn.net/scotfield_msn/article/details/72904092  ]

    From RxNLP.



               数据挖掘中的文本挖掘不论是对于企业应用,还是研究者工作,或者是参与数据竞赛项目,都是基础的工作。通过前面的一些实践工作,现总结出文本挖掘文本处理的通用流程。

              注意,这里的文本挖掘任务主要指的是如文本分类、文本聚类、信息抽取、情感分类等等的常规NLP问题。



              

    一、获取语料

              获取文本语料通常有以下几种方式:

                        1. 标准开放公开测试数据集,比如国内的中文汉语有搜狗语料、人民日报语料;国际English的有stanford的语料数据集、semavel的数据集等等

                        2. 爬虫抓取,获取网络文本,主要是获取网页HTML的形式,利用网络爬虫在相关站点爬取目标文本数据。



    二、文本预处理

              1.数据清洗

                        对于爬虫爬取的HTML原始文本,需要进行数据清洗过滤掉标签文本。网页中存在很多不必要的信息,比如说一些广告,导航栏,html、js代码,注释等等,我们并不感兴趣的信息,可以delete掉。如果是需要正文提取,可以利用标签用途、标签密度判定、数据挖掘思想、视觉网页块分析技术等等策略抽取出正文。


              2.分词(只针对中文文本)

                        对于中文文本数据,比如一条中文的句子,词语词之间是连续的,而数据分析的最小单位粒度我们希望是词语,所以我们需要进行分词工作,这样就给下一步的工作做准备。而对于英文文本句子,就不存在分词这一说法了,应为英文的句子的最小单位就是词语,词语之间是有空格隔开的。


              3.词性标注(可选)

                        词性标注POS的目的是为了让句子在后面的处理中融入更多的有用的语言信息。词性标注是一个经典的序列标注问题。不过对于有些文本处理任务,词性标注不是非必需的。


              4.去停用词

                        停用词stopword是指那些对文本特征没有任何贡献作用的词语,比如:啊、的、是的、你、我、…………还有一些标点符号,这些我们不想在文本分析的时候引入,因此需要去掉,这些词就是停用词。因为这些词在所有的文章中都大量存在,并不能反应出文本的意思,可以处理掉。当然针对不同的应用还有很多其他词性也是可以去掉的,比如形容词等。




    三、构造文本特征

              接下来,我们将考虑如何将文本符号转换成或者表示成能让学习模型能够处理的数据类型。很明显,我们需要将文本符号串转变为数字,更确切滴说是向量阵列:矩阵。


              1.词袋表示

                        词袋表示(bag of word, BOW), 即不考虑词语的原本在句子中的顺序,直接将每一个词语或者符号按照计数的方式,即出现的次数来进行统计。当然了,统计词频这只是最基本的方式。还有很多的处理,具体如下。

                        1.1 count

                                  先将关键的keywords作为文本特征,然后再用此最直接的方式进行句子表示,就是直接统计词频,然后将每一个句子或者文本篇章按照每一个特征出现的频率进行统计,这样处理后将得到句子或者文档对应的一个特征向量,向量的每个元素便是对应特征词的出现频数。

                        1.2 tf-idf

                                  与count类似,不过对其进行了改进。TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TFIDF,TF词频(Term Frequency),IDF反文档频率(Inverse DocumentFrequency)。TF表示词条,在文档d中出现的频率。IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。 

                                  不进行更多的描述,网上一大把。同样的,处理后将得到一个句子的特征向量,不过每个元素应该是一个[0, 1]的实数,表示一个概率。一个好的tf-idf需要进行很多的处理,比如进行光滑处理。


              2.词向量表示

                        词向量又名词嵌入word embedding,具体的无门槛科普请参考隔壁一篇博客《DeepNLP的表示学习·词嵌入来龙去脉·深度学习(Deep Learning)·自然语言处理(NLP)·表示(Representation)》。分布式表示的优点就是1.维度低,节省计算等等一堆资源;2.capture了相对位置的语义信息,这一点革命性的。当然了,不同类型的词向量有不同的能力,这里不啰嗦。下面举两个例子。

                        2.1 word2vec

                                  不是说word2vec只能用于神经网络的输入,词向量只是一种词的表示方式,同样适用于经典的ML模型。具体请参考博客《DeepNLP的表示学习·词嵌入来龙去脉·深度学习(Deep Learning)·自然语言处理(NLP)·表示(Representation)》

                        2.2 glove

                                  likewise.


    四、特征选择处理

              1.特征选择

              在文本挖掘与文本分类的有关问题中,常采用特征选择方法。原因是文本的特征一般都是单词(term),具有语义信息,使用特征选择找出的k维子集,仍然是单词作为特征,保留了语义信息,而特征提取则找k维新空间,将会丧失了语义信息。
              在解决一个实际问题的过程中,选择合适的特征或者构建特征的能力特别重要。这成为特征选择或者特征工程。特征选择时一个很需要创造力的过程,更多的依赖于直觉和专业知识,并且有很多现成的算法来进行特征的选择。 对于一个语料而言,我们可以统计的信息包括文档频率和文档类比例,所有的特征选择方法均依赖于这两个统计量,             目前,文本的特征选择方法主要有:DF, MI, IG, CHI,WLLR,WFO六种。

                        1)DF(Document Frequency)
                        2)MI(Mutual Information)
                        3)IG(Information Gain)
                        4)CHI(Chi-square)
                        5)WLLR(Weighted Log Likelihood Ration)

              具体地不过多地赘述,网络有资料,可以查阅相关论文。还有这些:WET(文档证据权重),OI,CC(相关系数)等常用的特征选择。

              除此之外还可以利用LDA进行特征优化。


              2.特征降维(非必须)

              对于文本类的数据挖掘项目,基本不考虑降维的问题。

              具体地有这些:LDA(线性特征抽取),PCA(主成分分析),FA(因子分析),SVD(奇异值分解),NMF(非负矩阵分解),LSI或者LSA(潜在语义分析)

              


    五、学习模型训练&适用

              接下来的工作就很清晰明了了,一旦将文本表示成了常规的广义特征数据结构后,我们所要做的就是跟其他的类型的数据挖掘一样,将这些特征喂入学习模型,然后适用于心得测试数据集,最后得到结果。

              1.模型训练学习

                        对于文本分类问题,我们可以采用KNN,SVM,Naive Bayes,决策树,GBDT,当然,直接上xgboost也是杠杠滴。

                        对于文本聚类问题,可选择K-means,agent,divided,DBSCAN 等模型。

              2.模型评估

                        当然最后也需要对模型进行必要的评估,以让模型optimized。

                        具体有这些指标可以参考:

                                  2.1 保持、随机二次抽样、交叉验证、自助法

                                  2.2 准确率,错误率,精确度,召回率

                                  2.3 ROC曲线、AUC曲线。






    refs:

    http://www.cnblogs.com/wangbogong/p/3251132.html

    http://blog.csdn.net/u011274209/article/details/51896757

    http://blog.csdn.net/u011955252/article/details/50802437






    展开全文
  • SQL 文本处理函数

    千次阅读 2018-10-05 17:20:42
    常用的文本处理函数: Left():返回串左边的值 Right():返回串右边的值 Length():返回串的长度 Locate():找出串的一个子串 Upper():将串转换为大写 Lower():将串转换为小写 Trim():去除...
  • Linux中几个简单实用的文本处理工具

    千次阅读 2018-07-31 17:34:41
    目录 文件查看: cat  rev 分页查看文件内容: ...显示文本前或者后行的内容 ...在Linux中有许多可以抽取文本的工具,熟悉掌握这些使用的小工具,能极大的提高工作效率。下面对这几个工具做简...
  • NLP——文本处理预处理

    万次阅读 2018-07-19 18:06:55
    NLP——文本处理预处理 词袋模型(Bag of Words, BoW) 从字面意义上来看,文档包含词、短语、句子和段落等要素,在多数文本分类方法中,都将文本中出现的这些要素作为文本特征,而且随着要素级别的增高,其表达的...
  • 本篇博客我们将介绍使用NLTK对英文文本进行一些基本处理,之后我们还会学习一些更高级的模型或方法,不过这些基本处理要熟练掌握,因为他们可以对我们的数据进行一些预处理,作为更高级模型或工具的输入。...
  • 8种Python文本处理工具集

    万次阅读 2018-10-29 20:01:51
    文本处理一般包括词性标注,句法分析,关键词提取,文本分类,情感分析等等,这是针对中文的,如果是对于英文来说,只需要基本的tokenize。本文为大家提供了以下这些工具包。 1.Jieba 【结巴中文分词】做最好的 ...
  • 文本处理 现有数据中,文本是最非结构化的形式,里面有各种各样的噪声;如果没有预处理,文本数据都不能分析。清理和标准化文本的整个过程叫做文本预处理(textpreprocessing),其作用是使文本数据没有噪声并且...
  • 常见的英文文本处理步骤

    千次阅读 2019-02-18 03:04:16
    常见的英文文本处理流程中都包含哪些步骤 1.导入相应的类库 import nltk from nltk import word_tokenize, sent_tokenize 2.导入数据 corpus = open(‘数据路径’,‘r’).read() 3.对文本进行断句处理 sentences = ...
  • 原文地址:https://zhuanlan.zhihu.com/p/25928551近来在同时做一个应用深度学习解决淘宝商品的类目预测问题的项目,恰好硕士毕业时论文题目便是文本分类问题,趁此机会总结下文本分类领域特别是应用深度学习解决...
  • python文本处理的函数总结

    千次阅读 2018-07-25 13:18:27
    就刚刚写的程序中,用到了map、strip和split函数 下面对这几个函数重新认识一下: strip函数:这个函数是字符串的方法 help(str.strip)之后 返回: strip(...)  S.strip([chars]) -&... Return a copy of ...
  • 文本处理-分词、向量化、TF-IDF理论和实现

    万次阅读 多人点赞 2018-06-28 18:00:18
    在做文本挖掘的时候,首先要做的预处理就是分词。英文单词天然有空格隔开容易按照空格分词,但是也有时候需要把多个单词做为一个分词,比如一些名词如“New York”,需要做为一个词看待。而中文由于没有空格,分词...
  • Python 文本处理的几个库

    千次阅读 2018-09-06 22:18:29
       
  • 机器学习中的文本处理

    千次阅读 2018-05-22 00:55:39
    为了在文本文档中执行机器学习,我们首先需要将文本内容转换为数字特征向量。 词袋模型 简单有效,通过以下步骤将文本转化为数值向量 -&amp;gt; (分词,计数,规范化和加权) 局限性: 不能涵盖词语间的...
  • Ctrl+F 即可查找~ R语言中处理字符串主要用到base包(R语言自带)和stringr包(需下载安装)的一些函数,现总结如下:1、字符串长度 nchar()函数用于计算字符串长度;nzchar()函数则用于判断字符串长度是否大于0...
  • grep、sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了。只不过,相比较而言,sed和awk功能更强大而已,且已...
  • shell 脚本之文本处理

    千次阅读 2016-12-27 21:01:46
    我学习shell 最初目的就是用于文本处理,以及自动化处理一些繁杂的操作,shell 脚本在这方面正是非常好用的工具。 本文只介绍常见的文本处理,对于其中涉及到的命令,以及正则表达式则不过多介绍;如果想用好shell,...
  • java解析富文本处理Img标签

    千次阅读 2018-05-16 14:23:40
     if (imgUrl.trim().startsWith("/")) { // 会去匹配我们富文本的图片的 src 的相对路径的首个字符,请注意一下  imgUrl =httpHost + imgUrl;  element.attr("src", imgUrl);  }  }  return url = doc....
  • grep 文本过滤命令sed 行编辑器awk 报告生成器一、grep命令grep 匹配条件 处理文件-a 不要忽略二进制数据。 -A&lt;显示列数&gt; 除了显示符合范本样式的那一行之外,并显示该行之后的内容。 -b 在显示...
  • Qt富文本处理

    千次阅读 2015-09-07 14:50:33
    1. Qt对富文本处理 1.1 操作方式 编辑操作:使用基于光标的接口函数,模拟用户的编辑操作,且不丢失底层文档框架;文档的光标基于QTextCursor类 只读操作:使用了只读的分层次接口函数,有利于文档的检索和...
  • 【python】文本处理:利用NLTK断句

    千次阅读 2017-04-05 18:49:02
    【python】文本处理:利用NLTK断句[Code]import nltk.datadef stripTags(s): intag = [False] def chk(c): if intag[0]: intag[0] = (c != '>') return False elif c == '<':
  • 原文地址:https://zhuanlan.zhihu.com/p/29076736导语传统的向量空间模型(VSM)假设特征项之间相互独立,这与实际情况是不相符的,为了解决这个问题,可以采用文本的分布式表示方式(例如 word embedding形式),...
  • linux 文本处理

    千次阅读 2016-07-12 23:34:05
    1.文本处理-echoecho -e "\033[40;35m...."背景颜色范围:40--4940:黑 41:深红 42:绿43:黄色 44:蓝色 45:紫色46:深绿 47:百色字体颜色范围:30-3930:黑 31:红 32:绿33:黄 34:蓝色 35:紫色36:深绿 37:百色eg: echo -e ...
  • SQL文本处理函数--soundex()函数

    万次阅读 2017-04-13 16:57:11
    总结 函数soundex()作用  soundex是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。soundex考虑了类似的发音字符和音节,使得对字符串进行发音比较而不是字母比较。虽然,soundex不是SQL概念,但是...
  • 1 使用echo命令输出文本echo [options] stringoptions: -n 不输出行尾的换行符2 使用echo支持转义字符echo -e\b 退格符(覆盖前一位)\c 禁止继续输出文本\n 换行符\r 回车符\t 水平制表符\v 垂直制表符\\ ...
  • 基于hadoop的海量文本处理系统

    热门讨论 2010-11-26 14:42:45
    基于hadoop的海量文本处理系统!基于hadoop的海量文本处理系统
  • 检查日志文件、读取配置 文件、处理数据元素,shell脚本可以帮助我们将文本文件中各种数据的日常处理任务自动化。但仅靠shell脚本命令来处理文本文件的内容有点力不从心的。如果想在shell脚本中处理任何类型的数据,...
  • 小程序中富文本处理

    千次阅读 2018-11-10 15:07:08
    在最近的小程序项目中用到了富文本, 小程序的富文本展示不是很复杂,有一个自带的组件 &lt;rich-text&gt;&lt;/rich-text&gt;. 直接用组件的话展示还是可能会有一些问题,比如图片展示不全,这些...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,299,497
精华内容 519,798
关键字:

文本处理