加工原料文本

  • 从网络和硬盘访问文本
    • 1.电子书
    • 2.处理的HTML
    • 3.读取本地文件
    • 4.NLP的流程
  • 字符串:字符串的基本操作
  • 使用Unicode进行文字处理
    • 1. 从文件中提取已编码文本
  • 使用正则表达式检测词组搭配
  • 规范化文本
    • 1. 词干提取器
    • 2. 词形归并
  • 用正则表达式为文本分词
    • 1. 分词的简单方法
    • 2. NLTK的正则表达式分词器
  • 分割
    • 1. 断句
    • 2. 分词

  文本的最重要来源无疑是网络。探索现成的文本集合,如我们在前面文章看到的语料库,是很方便的。然而,当需要解决工作中的问题时,那些现成的语料库并不适合,那怎么办呢?能不能构建自己的文件作为语料库呢?答案是肯定的。跟着我一起学习如何使用自己的文件构建自己的语料库,解决工作中的问题。

从网络和硬盘访问文本

1.电子书

  NLTK 语料库集合中有古腾堡项目的一小部分样例文本。然而,你可能对分析古腾堡项目的其它文本感兴趣。你可以在 http://www.gutenberg.org/catalog/上浏览 25,000 本免费在线书籍的目录,获得 ASCII 码文本文件的 URL。虽然 90%的古腾堡项目的文本是英语的,它还包括超过 50 种语言的材料,包括加泰罗尼亚语、中文、荷兰语、芬兰语、法语、德语、意大利语、葡萄牙语和西班牙语(每种语言都有超过 100 个文本)。
  编号 2554 的文本是《罪与罚》的英文翻译,我们可以如下方式访问它。

import requests
url = "https://www.gutenberg.org/files/2554/2554-0.txt"
raw = requests.get(url)
raw.encoding = "utf-8"# 因为书籍是这个编码,所以为了防止乱码
type(raw)
strlen(raw)
1176812raw[:75]
'\ufeffThe Project Gutenberg eBook of Crime and Punishment, by Fyodor Dostoevsky\r'

  变量 raw 包含一个有 1176812个字符的字符串。(我们使用 type(raw)可以看到它是一个符串。)这是这本书原始的内容,包括很多我们不感兴趣的细节,如空格、换行符和空行。请注意,文件中行尾的\r 和\n,这是 Python 用来显示特殊的回车和换行字符的方式(这个文件一定是在 Windows 机器上创建的)。对于语言处理,我们要将字符串分解为词和标点符号,正如我们在前面所学到的。这一步被称为分词,它产生我们所熟悉的结构,一个词汇和标点符号的链表。

import nltk
tokens = nltk.word_tokenize(raw)
type(tokens)
listlen(tokens)
244235tokens[:20]
['\ufeffThe', 'Project', 'Gutenberg', 'eBook', 'of', 'Crime', 'and', 'Punishment', ',', 'by', 'Fyodor', 'Dostoevsky', 'This', 'eBook', 'is', 'for', 'the', 'use', 'of', 'anyone']# 上面等同于下面
text = nltk.Text(tokens)
type(text)
nltk.text.Text
len(text)
257058
print(text[1020:1080])
['than', 'we', 'have', 'his', 'insight', 'impresses', 'us', 'as', 'wisdom', '...', 'that', 'wisdom', 'of', 'the', 'heart', 'which', 'we', 'seek', 'that', 'we', 'may', 'learn', 'from', 'it', 'how', 'to', 'live', '.', 'All', 'his', 'other', 'gifts', 'came', 'to', 'him', 'from', 'nature', ',', 'this', 'he', 'won', 'for', 'himself', 'and', 'through', 'it', 'he', 'became', 'great.', '”', 'CRIME', 'AND', 'PUNISHMENT', 'PART', 'I', 'CHAPTER', 'I', 'On', 'an', 'exceptionally']
text.collocations()
Katerina Ivanovna; Pyotr Petrovitch; Pulcheria Alexandrovna; Avdotya
Romanovna; Rodion Romanovitch; Marfa Petrovna; Sofya Semyonovna; old
woman; Project Gutenberg-tm; Porfiry Petrovitch; Amalia Ivanovna;
great deal; young man; Nikodim Fomitch; Project Gutenberg; Ilya
Petrovitch; Andrey Semyonovitch; Hay Market; Dmitri Prokofitch; Good
heavens

  请注意,古腾堡项目以一个排列的形式出现。这是因为从古腾堡项目下载的每个文本都包含一个首部,里面有文本的名称、作者、扫描和校对文本的人的名字、许可证等信息。有时这些信息出现在文件末尾页脚处。我们不能可靠地检测出文本内容的开始和结束,因此在从原始文本中挑出内容之前,我们需要手工检查文件以发现标记内容开始和结尾的独特的字符串。如图:

raw.find("PART I")
5575
raw.rfind("END OF THE PROJECT GUTENBERG EBOOK CRIME AND PUNISHMENT")
1158053
raw = raw[5575:1158053]

  方法 find()和 rfind()(反向的 find)帮助我们得到字符串切片需要用到的正确的索引值。我们用这个切片重新给 raw 赋值,所以现在 raw 以“PART I”开始一直到(但不包括)标记内容结尾的句子。这是我们第一次接触到网络的实际内容:在网络上找到的文本可能含有不必要的内容,并没有一个自动的方法来去除它。但只需要少量的额外工作,我们就可以提取出我们需要的材料。

2.处理的HTML

  网络上的文本大部分是 HTML 文件的形式。你可以使用网络浏览器将网页作为文本保存为本地文件,然后按照后面关于文件的小节描述的那样来访问它。不过,如果你要经常这样做,最简单的办法是直接让 Python 来做这份工作。第一步是像以前一样使用 requests。为了方便学习,我们还是使用上面的书籍,但这里已经不是txt文件了,而是html文件哦。

import requests
url = "https://www.gutenberg.org/files/2554/2554-h/2554-h.htm"
raw = requests.get(url)
raw.encoding = "utf-8"# 修正编码
raw = raw.text# 提取文本


  可以看到 HTML 的全部内容,包括 meta 元标签、图像标签、map 标签、JavaScript、表单和表格。从 HTML 中提取文本是极其常见的任务,NLTK 原本提供了一个辅助函数 nltk.clean_html()解析html,但是后来移除了,现在都是BeautifulSoup解析。解析完然后我们可以对原始文本进行分词,获得我们熟悉的文本结构:

from bs4 import BeautifulSoup
clean = BeautifulSoup(raw).get_text()
# 这里没有完全去解析,只是大概的处理了html
tokens = nltk.word_tokenize(clean)
print(tokens[:20])
['The', 'Project', 'Gutenberg', 'eBook', 'of', 'Crime', 'and', 'Punishment', ',', 'by', 'Fyodor', 'Dostoevsky', 'body', '{', 'margin-left', ':', '20', '%', ';', 'margin-right']

3.读取本地文件

  为了读取本地文件,我们需要使用 Python 内置的 open()函数,然后是 read()方法。假设你有一个文件 document.txt,你可以像这样加载它的内容:

f = open('document.txt',encoding="utf8")# 当然这里编码根据实际的来
raw = f.read()

4.NLP的流程

  到这里,其实讲解的nlp已经有了一个大概的流程,大概长下图这样,当然在这条流程后面还有很多操作。要正确理解它,这样有助于后续的操作。

字符串:字符串的基本操作

  现在是时候研究一个之前我们一直没有说明的基本数据类型了。在最开始的内容里,我们侧重于将文本作为一个词链表。我们并没有细致的探讨词汇以及它们是如何在编程语言中被处理的。通过使用 NLTK 中的语料库接口,我们可以忽略这些文本所在的文件。一个词的内容,一个文件的内容在编程语言中是由一个叫做字符串的基本数据类型来表示的。在这里,我们将详细探讨字符串,并展示字符串与词汇、文本和文件之间的联系。
  可以使用单引号或双引号来指定字符串,当字符串本身包含单引号时,要使用双引号,特殊的是字符串过长,这时使用三引号。
  字符串常用操作有拼接,使用 + ,重复,使用 * ,还有切片,切片的时候索引不能超出范围,不然会报错。当然字符串的操作不止这些,还有如下图

z = 'Python'
print(z + z)
print(z * 3)
PythonPython
PythonPythonPythonz[:3]
'Pyt'

使用Unicode进行文字处理

  Unicode 支持超过一百万种字符。每个字符分配一个编号,称为编码点。在 Python 中,编码点写作\uXXXX 的形式,其中 XXXX 是四位十六进制形式数。在一个程序中,我们可以像普通字符串那样操纵 Unicode 字符串。然而,当 Unicode 字符被存储在文件或在终端上显示,它们必须被编码为字节流。一些编码(如 ASCII 和 Latin-2)中每个编码点使用单字节,所以它们可以只支持 Unicode 的一个小的子集就足够一种语言使用了。其它的编码(如 UTF-8)使用多个字节,可以表示全部的 Unicode字符。文件中的文本都是有特定编码的,所以我们需要一些机制来将文本翻译成 Unicode——翻译成 Unicode 叫做解码。相对的,要将 Unicode 写入一个文件或终端,我们首先需要将 Unicode 转化为合适的编码——这种将 Unicode 转化为其它编码的过程叫做编码。

1. 从文件中提取已编码文本

  假设我们有一个小的文本文件,我们知道它是如何编码的。例如:polish-lat2.txt 顾名思义是波兰语的文本片段。此文件是 Latin-2 编码的,也称为 ISO-8859-2。nltk.data.find()函数为我们定位文件。
  Python 的 codecs 模块提供了将编码数据读入为 Unicode 字符串和将 Unicode 字符串以编码形式写出的函数。codecs.open()函数有一个 encoding 参数来指定被读取或写入的文件的编码。让我们导入 codecs 模块,以“latin2”为 encoding 参数,调用它以 Unicode 打开我们的波兰语文件。

import nltk
import codecs
path = nltk.data.find('corpora/unicode_samples/polish-lat2.txt')
f = codecs.open(path, encoding='latin2')
f.read()
'Pruska Biblioteka Państwowa. Jej dawne zbiory znane pod nazwą\n"Berlinka" to skarb kultury i sztuki niemieckiej. Przewiezione przez\nNiemców pod koniec II wojny światowej na Dolny Śląsk, zostały\nodnalezione po 1945 r. na terytorium Polski. Trafiły do Biblioteki\nJagiellońskiej w Krakowie, obejmują ponad 500 tys. zabytkowych\narchiwaliów, m.in. manuskrypty Goethego, Mozarta, Beethovena, Bacha.\n'

  这里,我们将引入另一个模块chardet。该模块是一个非常优秀的编码识别模块,可以识别codecs读取的文件,然后通过detect()方法获取文件的编码格式,两者结合,可以实现编码格式的转换。这也是我工作中经常使用的处理编码格式的代码。

import chardet
import codecs
path = nltk.data.find('corpora/unicode_samples/polish-lat2.txt')
f = codecs.open(path, mode="rb")# 这里假设不知道文件的编码格式
test = f.read()
# 获取文件的编码格式。chardet.detect(test)返回一个字典,形如:{'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''}
source_encoding = chardet.detect(test)["encoding"]
content_encode = test.decode(source_encoding, errors="ignore").encode(encoding="utf8")
codecs.open(file_path, "wb").write(content_encode)# 保存
# 检查转化效果
chardet.detect(content_encode)["encoding"]
'utf-8'

使用正则表达式检测词组搭配

  许多语言处理任务都涉及模式匹配。例如:我们可以使用 endswith(‘ed’)找到以“ed”结尾的词,但是python自身的字符串匹配规则明显完成不了日益繁琐的需求,所以,正则表达式给我们一个更加强大和灵活的方法描述我们感兴趣的字符模式。
  关于re模块,介绍的书籍资料多的数不胜数,完全可以自行学习,也可见作者写的另一篇文章,这里不在累赘。
  关于re模块的介绍及简单应用

规范化文本

  在前面的程序例子中,我们在处理文本词汇前经常要将文本转换为小写,即 set(w.lower() for w in text)。通过使用 lower()我们将文本规范化为小写,这样一来“The”与 “the”的区别被忽略。我们常想比这走得更远,例如:去掉所有的词缀以及提取词干的任务等。更进一步的步骤是确保结果形式是字典中确定的词,即叫做词形归并的任务。我们依次讨论这些。首先,我们需要定义我们将在本节中使用的数据:

raw = """DENNIS: Listen, strange women lying in ponds distributing swords
... is no basis for a system of government. Supreme executive power derives from
... a mandate from the masses, not from some farcical aquatic ceremony."""
tokens = nltk.word_tokenize(raw)

1. 词干提取器

  NLTK 中包括了一些现成的词干提取器,如果你需要一个词干提取器,你应该优先使用它们中的一个,而不是使用正则表达式制作自己的词干提取器,因为 NLTK 中的词干提取器能处理的不规则的情况很广泛。Porter 和 Lancaster 词干提取器按照它们自己的规则剥离词缀。

porter = nltk.PorterStemmer()
lancaster = nltk.LancasterStemmer()
print([porter.stem(t) for t in tokens])
['denni', ':', 'listen', ',', 'strang', 'women', 'lie', 'in', 'pond', 'distribut', 'sword', 'is', 'no', 'basi', 'for', 'a', 'system', 'of', 'govern', '.', 'suprem', 'execut', 'power', 'deriv', 'from', 'a', 'mandat', 'from', 'the', 'mass', ',', 'not', 'from', 'some', 'farcic', 'aquat', 'ceremoni', '.']print([lancaster.stem(t) for t in tokens])
['den', ':', 'list', ',', 'strange', 'wom', 'lying', 'in', 'pond', 'distribut', 'sword', 'is', 'no', 'bas', 'for', 'a', 'system', 'of', 'govern', '.', 'suprem', 'execut', 'pow', 'der', 'from', 'a', 'mand', 'from', 'the', 'mass', ',', 'not', 'from', 'som', 'farc', 'aqu', 'ceremony', '.']

  从结果来看,Porter 词干提取器正确处理了词 lying(将它映射为 lie),而 Lancaster 词干提取器并没有处理好。但是词干提取过程没有明确定义,我们通常选择心目中最适合我们的应用的词干提取器。如果你要索引一些文本和使搜索支持不同词汇形式的话,Porter 词干提取器是一个很好的选择。

2. 词形归并

  WordNet 词形归并器删除词缀产生的词都是在它的字典中的词。这个额外的检查过程使词形归并器比刚才提到的词干提取器要慢。请注意,它并没有处理“lying”,但它将“women”转换为“woman”。

wnl = nltk.WordNetLemmatizer()
print([wnl.lemmatize(t) for t in tokens])
['DENNIS', ':', 'Listen', ',', 'strange', 'woman', 'lying', 'in', 'pond', 'distributing', 'sword', 'is', 'no', 'basis', 'for', 'a', 'system', 'of', 'government', '.', 'Supreme', 'executive', 'power', 'derives', 'from', 'a', 'mandate', 'from', 'the', 'mass', ',', 'not', 'from', 'some', 'farcical', 'aquatic', 'ceremony', '.']

  如果你想编译一些文本的词汇,或者想要一个有效词条(或中心词)列表,WordNet词形归并器是一个不错的选择。

用正则表达式为文本分词

  分词是将字符串切割成可识别的构成一块语言数据的语言单元。虽然这是一项基础任务,我们能够一直拖延到现在为止才讲,是因为许多语料库已经分过词了,也因为 NLTK中包括一些分词器。现在你已经熟悉了正则表达式,你可以学习如何使用它们来为文本分词,并对此过程中有更多的掌控权。

1. 分词的简单方法

  文本分词的一种非常简单的方法是在空格符处分割文本。示例摘自《爱丽丝梦游仙
境》中的文本。我们可以使用 raw.split()在空格符处分割原始文本。使用正则表达式能做同样的事情,匹配字符串中的所有空格符是不够的,因为这将导致分词结果包含“\n”换行符;我们需要匹配任何数量的空格符、制表符或换行符:

import re
raw = """'When I'M a Duchess,' she said to herself, (not in a very hopeful tone
... though), 'I won't have any pepper in my kitchen AT ALL. Soup does very
... well without--Maybe it's always pepper that makes people hot-tempered,'..."""
print(re.split(r' ', raw))
["'When", "I'M", 'a', "Duchess,'", 'she', 'said', 'to', 'herself,', '(not', 'in', 'a', 'very', 'hopeful', 'tone\n...', 'though),', "'I", "won't", 'have', 'any', 'pepper', 'in', 'my', 'kitchen', 'AT', 'ALL.', 'Soup', 'does', 'very\n...', 'well', 'without--Maybe', "it's", 'always', 'pepper', 'that', 'makes', 'people', "hot-tempered,'..."]print(re.split(r'[ \n\t]+', raw))
["'When", "I'M", 'a', "Duchess,'", 'she', 'said', 'to', 'herself,', '(not', 'in', 'a', 'very', 'hopeful', 'tone', '...', 'though),', "'I", "won't", 'have', 'any', 'pepper', 'in', 'my', 'kitchen', 'AT', 'ALL.', 'Soup', 'does', 'very', '...', 'well', 'without--Maybe', "it's", 'always', 'pepper', 'that', 'makes', 'people', "hot-tempered,'..."]
​

  正则表达式«[ \t\n]+»匹配一个或多个空格、制表符(\t)或换行符(\n)。其他空白字符,如回车和换页符,确实应该包含的太多。于是,我们将使用一个 re 库内置的缩写“\ s”,它表示匹配所有空白字符。前面的例子中第二条语句可以改写为 re.split(r’\s+’, raw)。

2. NLTK的正则表达式分词器

  函数 nltk.regexp_tokenize()与 re.findall()类似(我们一直在使用它进行分词)。然而,nltk.regexp_tokenize()分词效率更高,且不需要特殊处理括号。为了增强可读性,我们将正则表达式分几行写,每行添加一个注释。特别的“(?x)”“verbose 标志”告诉 Python 去掉嵌入的空白字符和注释。

text = 'That U.S.A. poster-print ex-costs-ed $12.40 ...'
pattern = r"""(?x)    # set flag to allow verbose regexps
(?:[A-Z]\.)+        # abbreviations, e.g. U.S.A.
|\w+(?:-\w+)*        # words with optional internal hyphens
|\$?\d+(?:\.\d+)?%?  # currency and percentages, e.g. $12.40, 82%
|\.\.\.            # ellipsis
|(?:[.,;"'?():-_`])  # these are separate tokens; includes ], [
"""
print(nltk.regexp_tokenize(text, pattern))['That', 'U.S.A.', 'poster-print', 'ex-costs-ed', '$12.40', '...']

代码说明:

使用一个多行的正则表达式,行内要有注释,使用verbose标志(?x)
理解?:
()表示捕获分组,()会把每个分组里的匹配的值保存起来,使用group(n)(n是一个数字,表示第n个捕获组的内容)
(?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来

# 为了理解非捕获分组,看这个例子
x = "set flag to allow verbose regexps"
re.findall(r't (\w+) t', x)
['flag']re.findall(r't (?:\w+) t', x)
['t flag t']re.findall(r't \w+ t', x)
['t flag t']

  看的出来,当?:出现时,虽然有()进行捕获分组,但是?:使得它失去了作用,其结果和没加()的结果一致。

  现在,分词是一个比你可能预期的要更为艰巨的任务。没有单一的解决方案能在所有领域都行之有效,我们必须根据应用领域的需要决定那些是标识符。在开发分词器时,访问已经手工标注好的原始文本是有益的,这可以让你的分词器的输出结果与高品质(或称“黄金标准”)的标注进行比较。NLTK 语料库集合包括宾州树库的数据样本,包括《华尔街日报》原始文本(nltk.corpus.treebank_raw.raw())和分好词的版本(nltk.corpus.treebank.words())。分词的最后一个问题是缩写的存在,如“didn’t”。如果我们想分析一个句子的意思,将这种形式规范化为两个独立的形式:“did”和“n’t”(不是 not)可能更加有用。我们可以通过查表来做这项工作。

分割

  分割是一个笼统的大类,分词可以看成是一个更普遍的分割问题的一个实例。

1. 断句

  在词级水平处理文本通常假定能够将文本划分成单个句子。正如我们已经看到,一些语料库已经提供在句子级别的访问。

import pprint
sent_tokenizer=nltk.data.load('tokenizers/punkt/english.pickle')
text = nltk.corpus.gutenberg.raw('chesterton-thursday.txt')
sents = sent_tokenizer.tokenize(text)
pprint.pprint(sents[171:175])['In the wild events which were to follow this girl had no\n''part at all; he never saw her again until all his tale was over.','And yet, in some indescribable way, she kept recurring like a\n''motive in music through all his mad adventures afterwards, and the\n''glory of her strange hair ran like a red thread through those dark\n''and ill-drawn tapestries of the night.','For what followed was so\nimprobable, that it might well have been a dream.','When Syme went out into the starlit street, he found it for the\n''moment empty.']

  断句是困难的,因为句号会被用来标记缩写而另一些句号同时标记缩写和句子结束,例如“U.S.A.”中的句号就是缩写而不是句子结束。

2. 分词

  对于一些书写系统,由于没有词边界的可视表示这一事实,文本分词变得更加困难。例如:
a. doyouseethekitty
b. seethedoggy
c. doyoulikethekitty
d. likethedoggy
  现在分词的任务变成了一个搜索问题:找到将文本字符串正确分割成词汇的字位串。我假定学习者接收词,并将它们存储在一个内部词典中。给定一个合适的词典,是能够由词典中的词的序列来重构源文本的。这种需要用到更加复杂的技术。后续慢慢学习。

一起来学自然语言处理----加工原料文本相关推荐

  1. Python自然语言处理 | 加工原料文本

    本章的目的是要回答下列问题: 我们怎样才能编写程序访问本地和网络上的文件,从而获得无限的语言材料? 我们如何把文档分割成单独的词和标点符号,这样我们就可以开始像前面章节中在文本语料上做的那样的分析? ...

  2. 《Python自然语言处理(第二版)-Steven Bird等》学习笔记:第03章 加工原料文本

    第03章 加工原料文本 3.1 从网络和硬盘访问文本 电子书 处理的HTML 处理搜索引擎的结果 处理RSS 订阅 读取本地文件 从PDF.MS Word 及其他二进制格式中提取文本 捕获用户输入 N ...

  3. 《用Python进行自然语言处理》第3章 加工原料文本

    1. 我们怎样才能编写程序访问本地和网络上的文件,从而获得无限的语言材料? 2. 我们如何把文档分割成单独的词和标点符号,这样我们就可以开始像前面章节中在文本语料上做的那样的分析? 3. 我们怎样编程 ...

  4. 自然语言处理NLP之文本蕴涵、智能问答、语音识别、对话系统、文本分类、情感计算

    自然语言处理NLP之文本蕴涵.智能问答.语音识别.对话系统.文本分类.情感计算 目录

  5. 自然语言处理NLP之文本摘要、机器翻译、OCR、信息检索、信息抽取、校对纠错

    自然语言处理NLP之文本摘要.机器翻译.OCR.信息检索.信息抽取.校对纠错 目录

  6. 自然语言处理(2)之文本资料库

    自然语言处理(2)之文本资料库 1.获取文本资料库 本章首先给出了一个文本资料库的实例:nltk.corpus.gutenberg,通过gutenberg实例来学习文本资料库.我们用help来查看它的 ...

  7. 【自然语言处理概述】文本词频分析

    [自然语言处理概述]文本词频分析 作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC) ...

  8. 【自然语言处理】【文本生成】Transformers中使用约束Beam Search指导文本生成

    Transformers中使用约束Beam Search指导文本生成 原文地址:https://huggingface.co/blog/constrained-beam-search 相关博客 [自然 ...

  9. 【自然语言处理】【文本生成】UniLM:用于自然语言理解和生成的统一语言模型预训练

    UniLM:用于自然语言理解和生成的统一语言模型预训练 <Unified Language Model Pre-training for Natural Language Understandi ...

最新文章

  1. 大数据量生成工具源代码(Delphi)
  2. 百度飞桨弯道超车了吗?!
  3. 在ubuntu 12.04 x64下编译hadoop2.4
  4. linux能运行英魂之刃吗,英魂之刃需要什么电脑配置
  5. vue-cli+uni-app+vue3.0+ts构建自定义条件编译(飞书)小程序
  6. JS库之Highlight.js高亮代码
  7. 【C语言】源代码的编译过程
  8. 玩转华为ENSP模拟器系列 | 配置TWAMP Light统计业务示例
  9. 使用sqlhelper类查询时假如不需要参数化,那到时SqlParameter这个传参怎么处理
  10. spss分析 sus量表高低分组
  11. 视频拍摄——视点和视角
  12. es like and or_广东生态所孙蔚旻团队ESamp;T发表利用稳定同位素示踪宏基因组分箱联用技术揭示砷污染土壤中的厌氧砷氧化微生物及其代谢途径...
  13. RegExp——正则表达式
  14. 阿里、百度、腾讯Java程序员面经(附带面试题答案)
  15. 进程fork和exec ---Unix网络编程笔记
  16. 特步2020年总收入81.72亿元,主品牌下半年显著复苏
  17. 洛谷——P2067 Cytus-Holyknight
  18. 计算机打印机端口配置,如何设置打印机端口
  19. 项目进度管理 试题分析
  20. Fast Detection of Curved Edges at Low SNR

热门文章

  1. 3D眩晕症及解决方法
  2. 区块链与实体产业相结合加速推进数字经济智能化发展
  3. 高德地图上半年公共交通报告:公交都市排行上海、厦门双榜首
  4. Dataset - DeepFashion 服装数据集
  5. IE6下text-overflow:ellipsis不生效
  6. 02.Win10诸多坑之windows search服务启动失败
  7. GEE(Google Earth Engine)学习——常用筛选器Filter操作
  8. 轻松玩转新编日语6 zz江沪
  9. 开发操作系统(1)最简单的操作系统
  10. 易迅网被指私自改促销订单 用户下单后被取消