不久前,斯坦福大学发布了最新的自然语言处理工具库——StanfordNLP。这个工具库不仅包含了丰富的语义分析工具,还配备了73个高精度的神经网络模型,可以处理53种不同的人类语言。是不是很厉害?接下来,我将教你如何在Python中使用StanfordNLP进行自然语言处理的实际操作。
在自然语言处理(NLP)的学习过程中,我们经常会遇到一个问题:是否可以为除了英语之外的其他语言构建模型?过去,这是一个难以解决的任务。因为每种语言都有其独特的语法和细微的语言差异,且除了英语外,其他语言的数据集相对较少。
然而,有了StanfordNLP,这一切变得简单得多。它声称可以支持53种不同的语言,包括印地语、日语和中文等。这对于从事多语言处理的研究者来说,无疑是一个巨大的福音。
StanfordNLP是由一系列预训练的神经网络模型组成,这些模型均来自于2017年和2018年的CoNLL会议。它们都是基于PyTorch训练而成的,用户可以使用自己的语料库进行训练和评估,功能强大且灵活。
此外,StanfordNLP还包含了官方的CoreNLP封装,后者是一款广受好评的NLP库,此前只能通过Java使用。如果你对CoreNLP感兴趣,可以参考相关教程,了解它在Python中的应用。
要在Python中安装和配置StanfordNLP,首先需要确保你使用的是Python 3.6或更高版本。我建议在Anaconda环境中创建一个独立的Python 3.7.1环境,具体步骤如下:
bash
conda create -n stanfordnlp python=3.7.1
bash
conda activate stanfordnlp
bash
pip install stanfordnlp
接着,你需要下载对应语言的模型。以英语为例,运行以下命令:
python
import stanfordnlp
stanfordnlp.download('en')
这个过程可能需要一些时间,因为需要下载大约300MB的内容。
安装完成后,我们可以开始进行一些基本的NLP任务。假设我们需要分析一段英文文本,首先需要建立一个处理管道:
python
nlp = stanfordnlp.Pipeline(processors="tokenize,mwt,lemma,pos")
doc = nlp("""The prospects for Britain’s orderly withdrawal from the European Union on March 29 have receded further, even as MPs rallied to stop a no-deal scenario. An amendment to the draft bill on the termination of London’s membership of the bloc obliges Prime Minister Theresa May to renegotiate her withdrawal agreement with Brussels. A Tory backbencher’s proposal calls on the government to come up with alternatives to the Irish backstop, a central tenet of the deal Britain agreed with the rest of the EU.""")
分词处理是自动进行的,可以通过以下代码查看结果:
python
doc.sentences[0].print_tokens()
通过词形还原可以提取单词的原形: ```python import pandas as pd
def extractlemma(doc): parsedtext = {'word': [], 'lemma': []} for sent in doc.sentences: for wrd in sent.words: parsedtext['word'].append(wrd.text) parsedtext['lemma'].append(wrd.lemma) return pd.DataFrame(parsed_text)
extract_lemma(doc) ```
词性分析同样简单: ```python import pandas as pd
def extractpos(doc): parsedtext = {'word': [], 'pos': [], 'exp': []} posdict = { # 词性标签和描述 } for sent in doc.sentences: for wrd in sent.words: if wrd.pos in posdict.keys(): posexp = posdict[wrd.pos] else: posexp = 'NA' parsedtext['word'].append(wrd.text) parsedtext['pos'].append(wrd.pos) parsedtext['exp'].append(posexp) return pd.DataFrame(parsedtext)
extract_pos(doc) ```
依存关系解析可以帮助我们更好地理解句子结构:
python
doc.sentences[0].print_dependencies()
StanfordNLP同样支持其他语言,例如印地语。你可以下载印地语模型:
python
stanfordnlp.download('hi')
然后使用以下代码处理印地语文本:
python
hindi_doc = nlp("""केंद्र की मोदी सरकार ने शुक्रवार को अपना अंतरिम बजट पेश किया. कार्यवाहक वित्त मंत्री पीयूष गोयल ने अपने बजट में किसान, मजदूर, करदाता, महिला वर्ग समेत हर किसी के लिए बंपर ऐलान किए. हालांकि, बजट के बाद भी टैक्स को लेकर काफी कन्फ्यूजन बना रहा. केंद्र सरकार के इस अंतरिम बजट क्या खास रहा और किसको क्या मिला, आसान भाषा में यहां समझें""")
extract_pos(hindi_doc)
CoreNLP是一个强大的NLP工具集,可以与StanfordNLP结合使用。首先需要下载并启动CoreNLP服务器:
bash
wget http://nlp.stanford.edu/software/stanford-corenlp-full-2018-10-05.zip
unzip stanford-corenlp-full-2018-10-05.zip
java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000
接着,你需要设置环境变量 $CORENLP_HOME,并在Python代码中连接到CoreNLP服务器:
```python
from stanfordnlp.server import CoreNLPClient
with CoreNLPClient(annotators=['tokenize', 'ssplit', 'pos', 'lemma', 'ner', 'depparse', 'coref'], timeout=30000, memory='16G') as client: text = "Chris Manning is a nice person. Chris wrote a simple sentence. He also gives oranges to people." ann = client.annotate(text) sentence = ann.sentence[0] ```
StanfordNLP是一款功能强大的自然语言处理工具,支持多种语言处理。尽管存在一些改进空间,如模型下载量较大,但其在处理效率和灵活性方面的表现依然令人印象深刻。现在正是学习和使用它的绝佳时机,希望你能从中受益。