文本预处理、词干提取、词形还原与循环神经网络在自然语言处理中的应用
立即解锁
发布时间: 2025-09-03 00:16:47 阅读量: 9 订阅数: 14 AIGC 


PyTorch NLP实战入门
### 文本预处理、词干提取、词形还原与循环神经网络在自然语言处理中的应用
#### 1. 文本预处理:数字替换
在文本处理中,为了使输出标准化,我们常常需要对数字进行统一处理。数字可以用数字形式(如 9、8、7)或文字形式(如 nine、eight、seven)表示。为了避免将“1”和“one”视为不同实体,我们可以将它们转换为统一的表示形式。以下是使用 Python 实现的代码:
```python
import inflect
def to_digit(digit):
i = inflect.engine()
if digit.isdigit():
output = i.number_to_words(digit)
else:
output = digit
return output
input_text = ["1","two","3"]
output_text = [to_digit(x) for x in input_text]
print('Input: ' + str(input_text))
print('Output: ' + str(output_text))
```
上述代码将数字转换为文字形式。不过,在处理电话号码时,可能不需要像处理普通数字那样进行转换。例如:
```python
input_text = ["0800118118"]
output_text = [to_digit(x) for x in input_text]
print('Input: ' + str(input_text))
print('Output: ' + str(output_text))
```
在这种情况下,完整的文本表示可能并不适用,有时我们可以选择从输入文本中删除长数字。
#### 2. 词干提取和词形还原的概念
在语言中,词形变化是通过修改共同的词根来表达不同的语法类别,如时态、语气或性别。这通常涉及改变单词的前缀或后缀,有时甚至是整个单词。例如:
- **动词时态变化**:
- “Run” -> “Runs”(添加 “s” 后缀变为现在时)
- “Run” -> “Ran”(将中间字母改为 “a” 变为过去时)
- “To be” -> “Is”(现在时)
- “To be” -> “Was”(过去时)
- “To be” -> “Will be”(将来时,添加情态动词)
- **名词词形变化**:
- “Cat” -> “Cats”(复数形式)
- “Cat” -> “Cat's”(所有格)
- “Cat” -> “Cats'”(复数所有格)
词干提取和词形还原就是找到这些词根的过程。词干提取是一种算法过程,通过截断单词的末尾来得到共同的词根;而词形还原则是利用真实的词汇和对单词本身的结构分析,来找到单词的真正词根,即词元。
#### 3. 词干提取
词干提取是通过修剪单词末尾来获取其词干的算法过程。在英语中,常用的词干提取器之一是 Porter Stemmer。以下是使用 Python 和 NLTK 实现 Porter Stemmer 的步骤:
1. **创建 Porter Stemmer 实例**:
```python
from nltk.stem import PorterStemmer
porter = PorterStemmer()
```
2. **对单个单词进行词干提取**:
```python
word_list = ["see","saw","cat", "cats", "stem",
"stemming","lemma","lemmatization","known","knowing","time",
"timing","football", "footballers"]
for word in word_list:
print(word + ' -> ' + porter.stem(word))
```
3. **对整个句子进行词干提取**:
```python
from nltk.tokenize import word_tokenize
def SentenceStemmer(sentence):
tokens=word_tokenize(sentence)
stems=[porter.stem(word) for word in tokens]
return " ".join(stems)
print(SentenceStemmer('The cats and dogs are running'))
```
Porter Stemmer 虽然在很多情况下能有效提取词干,但也存在局限性。例如,“saw” 无法正确还原为 “see”。这是因为词干提取是基于一系列逻辑规则,很难定义一套能正确处理所有单词的规则,尤其是英语中那些根据时态完全改变形式的单词。
#### 4. 词形还原
词形还原与词干提取不同,它将单词还原为其词元。例如,“ran” 的词干是 “ran”,而其词元是 “run”。词形还原过程会利用预计算的词元和相关单词,以及单词在句子中的上下文来确定正确的词元。我们可以使用 NLTK 中的 WordNet Lemmatizer 进行词形还原。以下是具体步骤:
1. **创建 WordNet Lemmatizer 实例**:
```python
from nltk.stem import WordNetLemmatizer
import nltk
nltk.download('wordnet')
wordnet_lemmatizer = WordNetLemmatizer()
```
2. **对一些单词进行词形还原**:
```python
print(wordnet_lemmatizer.lemmatize('horses'))
print(wordnet_lemmatizer.lemmatize('wolves'))
print(wordnet_lemmatizer.lemmatize('mice'))
print(wordnet_lemmatizer.lemmatize('cacti'))
```
词形还原在大多数情况下比词干提取效果更好,例如它能将 “mice” 还原为 “mouse”,而词干提取无法做到。但词形还原也有局限性,它依赖于内置的单词索引,对于新的或编造的单词可能无法很好地处理。例如:
```python
print(wordnet_lemmatizer.lemmatize('madeupwords'))
print(porter.stem('madeupwords'))
```
此外,词形还原需要单词的上下文信息才能正确还
0
0
复制全文
相关推荐










