Eu tenho um arquivo de texto. Preciso obter uma lista de frases.
Como isso pode ser implementado? Existem muitas sutilezas, como um ponto sendo usado em abreviações.
Minha antiga expressão regular funciona mal:
re.compile('(\. |^|!|\?)([A-Z][^;↑\.<>@\^&/\[\]]*(\.|!|\?) )',re.M)
Respostas:
O Natural Language Toolkit ( nltk.org ) tem o que você precisa. Esta postagem em grupo indica que isso acontece:
(Eu não tentei!)
fonte
nltk .tokenize.punkt.PunktSentenceTokenizer
.nltk.download()
primeiro e baixar os modelos ->punkt
'This fails on cases with ending quotation marks. If we have a sentence that ends like "this." This is another sentence.'
e minha saída['This fails on cases with ending quotation marks.', 'If we have a sentence that ends like "this."', 'This is another sentence.']
parece correta para mim.Esta função pode dividir todo o texto de Huckleberry Finn em frases em cerca de 0,1 segundos e lida com muitos dos casos extremos mais dolorosos que tornam a análise de frases não trivial, por exemplo, "O Sr. John Johnson Jr. nasceu nos EUA, mas obteve seu Ph. D. em Israel antes de ingressar na Nike Inc. como engenheiro. Ele também trabalhou no craigslist.org como analista de negócios. "
fonte
prefixes = "(Mr|St|Mrs|Ms|Dr|Prof|Capt|Cpt|Lt|Mt)[.]"
,websites = "[.](com|net|org|io|gov|me|edu)"
eif "..." in text: text = text.replace("...","<prd><prd><prd>")
Em vez de usar regex para dividir o texto em frases, você também pode usar a biblioteca nltk.
ref: https://stackoverflow.com/a/9474645/2877052
fonte
for sentence in tokenize.sent_tokenize(text): print(sentence)
Você pode tentar usar Spacy em vez de regex. Eu uso e faz o trabalho.
fonte
Aqui está uma abordagem intermediária que não depende de nenhuma biblioteca externa. Eu uso a compreensão de lista para excluir sobreposições entre abreviações e terminadores, bem como para excluir sobreposições entre variações em terminações, por exemplo: '.' vs. '. "'
Usei a função find_all de Karl a partir desta entrada: Encontre todas as ocorrências de uma substring em Python
fonte
...
e?!
.Para casos simples (onde as sentenças são encerradas normalmente), isso deve funcionar:
O regex é
*\. +
, que corresponde a um ponto cercado por 0 ou mais espaços à esquerda e 1 ou mais à direita (para evitar que algo como o ponto em re.split seja contado como uma mudança na frase).Obviamente, não é a solução mais robusta, mas funcionará bem na maioria dos casos. O único caso que isso não cobrirá são as abreviações (talvez percorra a lista de frases e verifique se cada string
sentences
começa com uma letra maiúscula?)fonte
SyntaxError: EOL while scanning string literal
:, apontando para o parêntese de fechamento (depoistext
). Além disso, a regex que você faz referência em seu texto não existe em seu exemplo de código.r' *[\.\?!][\'"\)\]]* +'
Você também pode usar a função de tokenização de frase em NLTK:
fonte
@Artyom,
Oi! Você pode fazer um novo tokenizer para russo (e alguns outros idiomas) usando esta função:
e então chame desta forma:
Boa sorte, Mara.
fonte
Sem dúvida, o NLTK é o mais adequado para esse fim. Mas começar com NLTK é muito doloroso (mas depois de instalá-lo - você colhe os frutos)
Portanto, aqui está o código baseado em revisão simples disponível em http://pythonicprose.blogspot.com/2009/09/python-split-paragraph-into-sentences.html
fonte
Tive que ler arquivos de legendas e dividi-los em frases. Após o pré-processamento (como remover informações de tempo, etc. nos arquivos .srt), a variável fullFile continha o texto completo do arquivo de legenda. A forma grosseira abaixo dividi-los nitidamente em frases. Provavelmente tive sorte porque as frases sempre terminavam (corretamente) com um espaço. Experimente primeiro e, se houver exceções, adicione mais verificações e saldos.
Oh! bem. Agora percebo que, como meu conteúdo era espanhol, não tive problemas em lidar com o "Sr. Smith" etc. Ainda assim, se alguém quiser um analisador rápido e sujo ...
fonte
Espero que isso ajude você no texto em latim, chinês, árabe
fonte
resultado:
Fonte: https://www.geeksforgeeks.org/nlp-how-tokenizing-text-sentence-words-works/
fonte