当前位置: 首页 > 面试题库 >

给了个链接线上写代码,要求写读文本、文本预处理、特征提取和建模的基本过程,不过写到特征就没写了

温翔宇
2023-03-14
本文向大家介绍给了个链接线上写代码,要求写读文本、文本预处理、特征提取和建模的基本过程,不过写到特征就没写了相关面试题,主要包含被问及给了个链接线上写代码,要求写读文本、文本预处理、特征提取和建模的基本过程,不过写到特征就没写了时的应答技巧和注意事项,需要的朋友参考一下

参考回答:

收集数据

总所周知,数据挖掘模型中非常重要的部分是训练模型,训练集与测试集便是整个数据挖掘过程中花费时间最多的过程。数据集通过有如下的一些途径获得:

经典数据集:Python NLTK 便提供了非常多经典的数据集。很多数据集都是手工标注而成,所以使用的时候不得不感叹工程的浩大。例如NLP中使用的Penn TreeBank,有兴趣的同学可以看看他们的论文《Building a Large Annotated Corpus of English: The Penn TreeBank》,那简直就是一部辛酸史啊!

从网页上抓取:直接动手写一个爬虫爬取特定的网页不难,通过正则表达式就能够将有效的内容提取出来;当然,发扬拿来主义精神的话,我们可以使用Python中一些优秀的库,比如scrapy,beautifulsoup 等等。

日志、已有文件中分析:如果是海量数据的话可以使用hadoop这样的系统。结合传统SQL中的一些特殊功能,例如Partition,有时会有不错的效果,不过最多压缩空间、缩减特征再用SQL处理。

其他网络数据集:Stanford Large Network Dataset Collectionm,100+ Interesting Data Sets for Statistics

 

预处理

如果是网页内容,首先需要去掉Html Tag,lxml和html5lib是比较有名的Python库,beautifulsoup也对他们做了一层封装。不过别忘了,Python本身也自带了sgmllib这样的基本可扩展的解析器。如果是有特别的处理,其实正则表达式也是不错的选择。

处理编码,由于我主要是处理英文的数据,这一步基本也跳过了。

将文档分割成句子(可选)。很多时候我们采用的是词袋模型(bag of words),所以是否分割成句子也无所谓。比较简单的方法就是Python NLTK中的sent_tokenize()函数,用的是punkt算法,论文在这里。

将句子分割成词。首先用正则表达式可以自己完成;如果要利用已有工具,Python NLTK中的word_tokenize(),这个方式就是前文提到的Penn TreeBank语料库所使用的分词方法。听起来是不是很高大上,我是不会告诉你其实它也是正则表达式实现的,想知道具体实现,戳这里。分词其实主要干了这么几个事:1)将’分开. don't -> do n't, they'll -> they 'll; 2)将大部分标点当作单独的一个词; 3)将后一位是逗号或者引号的词分开; 4)单独出现在一行的句号分开。中文分词区别比较大,可以采用斯坦福或者ICTCLAS(中科院背景)的方案。

拼写错误纠正。推荐pyenchant,非常喜欢,因为简洁到四句语句就能完成。Windows 8中操作系统也直接提供了拼写检查的COM端口,不过就得多花时间研究啦。

POS Tagging(根据实际应用)。还是Nltk,首页就有介绍;斯坦福也提供了这类工具。这一块属于NLP的范畴,还是Parsing等应用,要了解NLP原理推荐Coursera上一门不错的课程Natural Language Processing

去掉标点。正则表达式即可,有的时间非常短的单词也可以一起去掉,len<3的常见的选择

去掉非英文字符的词(根据实际应用决定)。

转换成小写。

去掉停用词。就是在各种句子中都经常出现的一些词,I、and什么的。NLTK有一个Stopwords。Matthew L. Jockers提供了一份比机器学习和自然语言处理中常用的停词表更长的停词表。中文停用词戳这里。什么?你问我停用词怎么找到的,我想大概是IDF这样的算法吧。

词型转换。简单来讲,我们希望do、did、done都能统一的返回do。第一种方法叫stem,Porter是比较常见的一种基于规则的算法,网页有snowball工具,也是它的论文。Porter的结果差强人意,单词末尾有e、y的,基本上stem之后都不间了,例如replace->replac;末尾有重复单词的,基本只剩一个了,例如ill->il。NLTK中也有Stem库,算法应该是类似的。第二种方法叫lemmatization,就是基于词典做词型转换,NLTK的Stem库中便有WordNetLemmatizer可以使用。

去掉长度过小的词(可选)。如果之前做了,这里要再做一次,因为stem会改变词型。

重新去停用词。理由同上。

特征提取:

1、TF-IDF:

2、词频方法(Word Frequency):

3、文档频次方法(Document Frequency):

4、互信息(Mutual Information):

5、期望交叉熵(Expected Cross Entropy):

6、二次信息熵(QEMI):

7、信息增益方法(Information Gain):

8、x2统计量方法:

9、文本证据权(The Weight of Evidence forText):

10、优势率(Odds Ratio):

11、遗传算法(Genetic Algorithm, GA):

12、主成分分析法(Principal Component Analysis,PCA):

13、模拟退火算法(Simulating Anneal,SA):

14、N—Gram算法

文本建模:

LDA、pLSA、LSA

 类似资料:
  • 在许多任务中,例如在经典的垃圾邮件检测中,你的输入数据是文本。 长度变化的自由文本与我们需要使用 scikit-learn 来做机器学习所需的,长度固定的数值表示相差甚远。 但是,有一种简单有效的方法,使用所谓的词袋模型将文本数据转换为数字表示,该模型提供了与 scikit-learn 中的机器学习算法兼容的数据结构。 假设数据集中的每个样本都表示为一个字符串,可以只是句子,电子邮件或整篇新闻文章

  • 现在我知道这个问题已经被问了十亿次了。 我已经通读了其中的大部分(这个网站对我的问题没有太大帮助),我已经通读了文档,我已经通读了示例和教程。 我想做的是: 将hello world发送到可移动设备(连接到arduino) 到目前为止我所做的: 与使用内置设置的设备配对(我的应用程序中没有编程逻辑) 使用GATT服务器与设备连接。 然而,当我试图编写一个特征时,相应的状态返回布尔值总是false。

  • 本文向大家介绍使用python进行文本预处理和提取特征的实例,包括了使用python进行文本预处理和提取特征的实例的使用技巧和注意事项,需要的朋友参考一下 如下所示: 文本去除两个以上空格 bas4编码变成中文 文本去停用词 文本特征提取 以上这篇使用python进行文本预处理和提取特征的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 问题内容: 我正在尝试更改文本文件中的某些行,而不影响其他行。这就是文本文件“ text.txt”中的内容 我的目标是更改第4行和第5行,但其余部分保持不变。 即使代码有效,我想知道是否有更好,更有效的方法?是否可以仅通过行号读取文件? 问题答案: 您没有什么可以改善的。但是您必须将所有行都写入 一个新文件 ,无论已更改还是未更改。较小的改进将是: 使用该语句; 避免将行存储在列表中; 子句中不带

  • 使用 electron 的一大好处是可以访问用户的文件系统。这使你可以读取和写入本地系统上的文件。为了避免 Chromium 的限制以及对应用程序内部文件的改写,请确保使用 electron 的 API,特别是 app.getPath(name) 函数。这个帮助函数可以使你获得指向系统目录的文件路径,如用户的桌面、系统临时文件 等等。 使用案例 假设我们想为我们的应用程序提供本地的数据库存储。在这

  • 此代码检查一个5.1GB的大型文本文件,并检查是否有出现少于100次的单词。然后将5.1GB重写到输出文本文件中,并将这些单词替换为unk。主要问题是创建output.txt需要很长时间。我怀疑方法write_text()打开数据集文件和输出文件的方式会导致问题。 这个脚本背后的目标是:我有一个预构建的vocab和一个文本。这篇课文可能有新单词不在我的词汇表中,所以我想把它们添加到我的词汇表中。但