prose - это библиотека обработки естественного языка (только на английском, на данный момент) в Pure Go . Он поддерживает токенизацию, сегментацию, часть речи и извлечение по имени.
Вы можете найти более подробное резюме о производительности библиотеки здесь: Представление prose v2.0.0: привлечение NLP.
$ go get github.com/jdkato/prose/v2 package main
import (
"fmt"
"log"
"github.com/jdkato/prose/v2"
)
func main () {
// Create a new document with the default configuration:
doc , err := prose . NewDocument ( "Go is an open-source programming language created at Google." )
if err != nil {
log . Fatal ( err )
}
// Iterate over the doc's tokens:
for _ , tok := range doc . Tokens () {
fmt . Println ( tok . Text , tok . Tag , tok . Label )
// Go NNP B-GPE
// is VBZ O
// an DT O
// ...
}
// Iterate over the doc's named-entities:
for _ , ent := range doc . Entities () {
fmt . Println ( ent . Text , ent . Label )
// Go GPE
// Google GPE
}
// Iterate over the doc's sentences:
for _ , sent := range doc . Sentences () {
fmt . Println ( sent . Text )
// Go is an open-source programming language created at Google.
}
}Процесс создания документа придерживается следующей последовательности шагов:
tokenization -> POS tagging -> NE extraction
segmentation
Каждый шаг может быть отключен (при условии, что более поздние шаги не требуются), передавая соответствующую функциональную опцию . Например, чтобы отключить извлечение по имени-энту, вы бы сделали следующее:
doc , err := prose . NewDocument (
"Go is an open-source programming language created at Google." ,
prose . WithExtraction ( false )) prose включает в себя токенизатор, способный обрабатывать современный текст, в том числе пролеты персонажа, не являющиеся слов, показанные ниже.
| Тип | Пример |
|---|---|
| Адреса электронной почты | [email protected] |
| Хэштеги | #trending |
| Упоминания | @jdkato |
| URL | https://github.com/jdkato/prose |
| Смайлики | :-) , >:( , o_0 и т. Д. |
package main
import (
"fmt"
"log"
"github.com/jdkato/prose/v2"
)
func main () {
// Create a new document with the default configuration:
doc , err := prose . NewDocument ( "@jdkato, go to http://example.com thanks :)." )
if err != nil {
log . Fatal ( err )
}
// Iterate over the doc's tokens:
for _ , tok := range doc . Tokens () {
fmt . Println ( tok . Text , tok . Tag )
// @jdkato NN
// , ,
// go VB
// to TO
// http://example.com NN
// thanks NNS
// :) SYM
// . .
}
} prose включает в себя один из наиболее точных сегментов предложений, согласно золотым правилам, созданным разработчиками pragmatic_segmenter .
| Имя | Язык | Лицензия | Grs (английский) | Grs (другие) | Скорость† |
|---|---|---|---|---|---|
| Прагматический сегментатор | Рубин | Грань | 98,08% (51/52) | 100,00% | 3,84 с |
| проза | Идти | Грань | 75,00% (39/52) | N/a | 0,96 с |
| Тактафункер | Рубин | GNU GPLV3 | 65,38% (34/52) | 48,57% | 46,32 с |
| Opennlp | Ява | APLV2 | 59,62% (31/52) | 45,71% | 1,27 с |
| Standford Corenlp | Ява | GNU GPLV3 | 59,62% (31/52) | 31,43% | 0,92 с |
| Сплитта | Питон | APLV2 | 55,77% (29/52) | 37,14% | N/a |
| Панкт | Питон | APLV2 | 46,15% (24/52) | 48,57% | 1,79 с |
| SRX English | Рубин | GNU GPLV3 | 30,77% (16/52) | 28,57% | 6,19 с |
| Scapel | Рубин | GNU GPLV3 | 28,85% (15/52) | 20,00% | 0,13 с |
† Оригинальные тесты были выполнены с использованием четырехъядерного intel xeon e5 MacBook Pro 3,7 ГГц, работающего 10,9,5 , а
proseбыла приурочена с использованием MacBook Pro 2,9 ГГц Intel Core i7, работающего 10.13.3 .
package main
import (
"fmt"
"strings"
"github.com/jdkato/prose/v2"
)
func main () {
// Create a new document with the default configuration:
doc , _ := prose . NewDocument ( strings . Join ([] string {
"I can see Mt. Fuji from here." ,
"St. Michael's Church is on 5th st. near the light." }, " " ))
// Iterate over the doc's sentences:
sents := doc . Sentences ()
fmt . Println ( len ( sents )) // 2
for _ , sent := range sents {
fmt . Println ( sent . Text )
// I can see Mt. Fuji from here.
// St. Michael's Church is on 5th st. near the light.
}
} prose включает в себя теги, основанный на «Fast and Tagger TextBlob». Ниже приводится сравнение его производительности с реализацией NLTK того же тегигера на корпусе Treebank:
| Библиотека | Точность | Среднее значение 5 бега (сек) |
|---|---|---|
| Nltk | 0,893 | 7.224 |
prose | 0,961 | 2.538 |
(См. scripts/test_model.py для получения дополнительной информации.)
Полный список поддерживаемых POS -тегов приведен ниже.
| ЯРЛЫК | ОПИСАНИЕ |
|---|---|
( | Оставленный круглый кронштейн |
) | Правый круглый кронштейн |
, | запятая |
: | толстой кишки |
. | период |
'' | Закрывающая кавычка |
`` | Вступительная кавычка |
# | номер знака |
$ | валюта |
CC | соединение, координация |
CD | кардинальный номер |
DT | определяющий |
EX | экзистенциальный там |
FW | иностранное слово |
IN | соединение, подчинение или предлог |
JJ | прилагательное |
JJR | прилагательное, сравнительное |
JJS | прилагательное, превосходное |
LS | Список маркера элемента |
MD | Глагол, модальный вспомогательный |
NN | существительное, единственное или массовое |
NNP | существительное, правильное единственное число |
NNPS | существительное, правильное множественное число |
NNS | существительное, множественное число |
PDT | Предуторинг |
POS | притяжательное окончание |
PRP | местоимение, личное |
PRP$ | местоимение, притяжательное |
RB | наречие |
RBR | наречие, сравнительный |
RBS | наречие, превосходная |
RP | наречие, частица |
SYM | символ |
TO | Неосказание |
UH | вмешательство |
VB | Глагол, базовая форма |
VBD | Глагол, прошедшее время |
VBG | глагол, герунд или присутствие причастия |
VBN | Глагол, прошлое причастие |
VBP | глагол, не 3-й человек единственный присутствие |
VBZ | Глагол, 3 -й человек, единственный настоящий присутствие |
WDT | WH-Determiner |
WP | WH-Pronoun, личный |
WP$ | WH-Pronoun, притяжательный |
WRB | WH-Adverb |
prose v2.0.0 включает в себя значительную улучшенную версию Chunk Package V1.0.0, которая может по умолчанию идентифицировать людей ( PERSON ) и географических/политических сущностей ( GPE ).
package main
import (
"github.com/jdkato/prose/v2"
)
func main () {
doc , _ := prose . NewDocument ( "Lebron James plays basketball in Los Angeles." )
for _ , ent := range doc . Entities () {
fmt . Println ( ent . Text , ent . Label )
// Lebron James PERSON
// Los Angeles GPE
}
} Тем не менее, в попытке сделать эту функцию более полезной, мы сделали это простым для обучения ваших собственных моделей для конкретных вариантов использования. См. Вундеркинд + prose : радикально эффективное обучение машины в Go для учебника.