[Stove AI] Машинное обучение 034-NLP Сегментация текста

машинное обучение искусственный интеллект NLP Jieba

[Stove AI] Машинное обучение 037-NLP Блокировка текста

(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, NLTK 3.3)

Сегментация текста заключается в разделении большого фрагмента текста на несколько небольших фрагментов текста с целью получения небольшой части фрагмента текста, либо разделения небольшой части фиксированного количества слов и т. д. Часто используется для очень больших текстов. Обратите внимание, что сегментация текста отличается от сегментации слов.Цель сегментации слов — разделить фрагмент текста на слова, а цель сегментации текста — разделить большой фрагмент текста на несколько небольших фрагментов текста.


1. Фрагментирование текста НЛП

В разных приложениях может потребоваться блокировать большие куски текста по разным правилам, здесь нам нужно получить блоки с одинаковым количеством слов, поэтому мы можем написать функции для реализации таких обычных блоков. код показывает, как показано ниже.

from nltk.tokenize import word_tokenize
def split(dataset,words_num):
    '''
    将dataset这一整段文本分割成N个小块,
    使得每个小块中含有单词的数目等于words_num'''
    words=dataset.split(' ') # 此处用空格来区分单词是否合适?
    # words=word_tokenize(dataset) # 用分词器来分词是否更合适一些?
    
    rows=int(np.ceil(len(words)/words_num)) # 即行数
    result=[] # 预计里面装的元素是rows行words_num列,最后一行可能少于words_num,故不能用np.array

    # words是list,可以用切片的方式获取
    for row in range(rows):
        result.append(words[row*words_num:(row+1)*words_num])
    return result

Затем используйте текст в «Эмме» Джейн Остин в качестве набора данных. Поскольку этот набор данных слишком велик и имеет длину 192427, мы получаем здесь только первые 1000 слов для тестирования.

# 测试一下
# 数据集暂时用简·奥斯丁的《爱玛》中的文本
dataset=nltk.corpus.gutenberg.words('austen-emma.txt')
print(len(dataset)) # 192427 代表读入正常
result=split(" ".join(dataset[:1000]), 30) # 只取前面的1000个单词,每30个单词分一个块,一共有34个块
print(len(result))
print(result[0])
print(len(result[0]))
print(result[-1])
print(len(result[-1]))

-------------------- потерять ----------------------- выход -------------------- -------------

192427 34 ['[', 'Emma', 'by', 'Jane', 'Austen', '1816', ']', 'VOLUME', 'I', 'CHAPTER', 'I', 'Emma', 'Woodhouse', ',', 'handsome', ',', 'clever', ',', 'and', 'rich', ',', 'with', 'a', 'comfortable', 'home', 'and', 'happy', 'disposition', ',', 'seemed'] 30 ['its', 'separate', 'lawn', ',', 'and', 'shrubberies', ',', 'and', 'name', ','] 10

---------------------------Заканчивать---------------------- ---------------

Видно, что разбиение разбито на 34 блока, длина первого блока 30, а длина последнего блока 10, а функция разбиения точно делит текст на блоки.

########################резюме########################## ######

1. В этом примере фрагментация текста, по-видимому, не использует никаких функций в модуле NLTK, достаточно только функций обработки строк Python. Но в других сценариях приложений могут потребоваться более сложные функции для выполнения определенных функций блока.

2. В этом примере пробелы используются для различения слов. Этот метод сегментации слов не обязательно является точным. Упомянутая выше функция word_tokenize может использоваться для сегментации слов, что может быть более точным.

3. Если это китайская сегментация, вы можете использовать jieba, чтобы сначала сегментировать текст, а затем получить определенное количество слов для выполнения сегментации текста.Это легко распространить на китайский язык, имитируя приведенную выше функцию разделения, которая здесь опущена.

#################################################################


Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.

Использованная литература:

1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.