Как проверить слово в python? - PullRequest
0 голосов
/ 04 августа 2020

У меня есть список в Python вроде этого:

`list = ['thatCreation', 'happeningso', '’', 'comebecause',]

Вопрос:

Я хочу указать c слов:

For e.g. -> 'thatCreation' -> 'that', 'creation'
            'happeningso' -> 'happening', 'so'
            'comebeacause' -> 'come', 'because' `

Спасибо за аванс за решение в python.

Ответы [ 3 ]

1 голос
/ 04 августа 2020

Похоже, вы пытаетесь взять слова, слитые вместе в падеже верблюда, и разбить их на части. Есть отличный алгоритм под названием Viterbi , который делает это очень хорошо.

Я не могу объяснить, что за ним стоит c, но я недавно реализовал его в своей программе, и он действительно работает хорошо. Насколько я понимаю, он вычисляет вероятность каждого слова и разбивает его. Этот алгоритм может разбивать слова в любом случае.

def word_prob(word): return dictionary[word] / total
def words(text): return re.findall('[a-z]+', text.lower()) 
dictionary = Counter(words(open(words_path).read()))
max_word_length = max(map(len, dictionary))
total = float(sum(dictionary.values()))

def viterbi_segment(text):
    probs, lasts = [1.0], [0]
    for i in range(1, len(text) + 1):
        prob_k, k = max((probs[j] * word_prob(text[j:i]), j)
                        for j in range(max(0, i - max_word_length), i))
        probs.append(prob_k)
        lasts.append(k)
    words = []
    i = len(text)
    while 0 < i:
        words.append(text[lasts[i]:i])
        i = lasts[i]
    words.reverse()
    return words, probs[-1]

sentence = ' '.join(viterbi_segment('thatCreation'.lower())[0])
print('sentence: {0}'.format(sentence))
word = ''.join(a.capitalize() for a in split('([^a-zA-Z0-9])', sentence)
       if a.isalnum())
print('word: {0}'.format(word[0].lower() + word[1:]))

Вам нужен словарь из тонны слов, их несколько, но я использовал: https://raw.githubusercontent.com/first20hours/google-10000-english/master/google-10000-english-no-swears.txt

и обновил его новыми словами, которых в нем не было.

0 голосов
/ 04 августа 2020
import re
from collections import Counter

def viterbi_segment(text):
    probs, lasts = [1.0], [0]
    for i in range(1, len(text) + 1):
        prob_k, k = max((probs[j] * word_prob(text[j:i]), j)
                    for j in range(max(0, i - max_word_length), i))
    probs.append(prob_k)
    lasts.append(k)
    words = []
    i = len(text)
    while 0 < i:
        words.append(text[lasts[i]:i])
        i = lasts[i]
    words.reverse()
    return words, probs[-1]
    

def word_prob(word): return dictionary[word] / total
def words(text): return re.findall('[a-z]+', text.lower())   
dictionary = Counter(words(open('big.txt').read()))
max_word_length = max(map(len, dictionary))  
total = float(sum(dictionary.values()))
l = ['thatCreation', 'happeningso', 'comebecause',]

for w in l:
    print(viterbi_segment(w.lower()))

O/p will be - 
(['that', 'creation'], 1.63869514118246e-07)
(['happening', 'so'], 1.1607123777400279e-07)
(['come', 'because'], 4.81658105705814e-07)

Я получил решение моей проблемы от @Darius Bacon, и для этого вам нужно сделать все строки строчными. Спасибо, ребята, за вашу помощь.

Посетите эту ссылку для загрузки big.txt: https://norvig.com/big.txt

0 голосов
/ 04 августа 2020

Заимствовано из pytudes Питера Норвига для выполнения сегментации слов. Попробуйте ..

import re
import math
import random
import matplotlib.pyplot as plt
from collections import Counter
from itertools   import permutations
from typing      import List, Tuple, Set, Dict, Callable

!wget https://raw.githubusercontent.com/dwyl/english-words/master/words.txt

Word = str    # We implement words as strings
cat = ''.join # Function to concatenate strings together


def tokens(text) -> List[Word]:
    """List all the word tokens (consecutive letters) in a text. Normalize to lowercase."""
    return re.findall('[a-z]+', text.lower()) 

TEXT = open('big.txt').read()
WORDS = tokens(TEXT)


class ProbabilityFunction:
    def __call__(self, outcome):
        """The probability of `outcome`."""
        if not hasattr(self, 'total'):
            self.total = sum(self.values())
        return self[outcome] / self.total
    
class Bag(Counter, ProbabilityFunction): """A bag of words."""
    

Pword = Bag(WORDS)


def Pwords(words: List[Word]) -> float:
    "Probability of a sequence of words, assuming each word is independent of others."
    return Π(Pword(w) for w in words)

def Π(nums) -> float:
    "Multiply the numbers together.  (Like `sum`, but with multiplication.)"
    result = 1
    for num in nums:
        result *= num
    return result

def splits(text, start=0, end=20) -> Tuple[str, str]:
    """Return a list of all (first, rest) pairs; start <= len(first) <= L."""
    return [(text[:i], text[i:]) 
            for i in range(start, min(len(text), end)+1)]

def segment(text) -> List[Word]:
    """Return a list of words that is the most probable segmentation of text."""
    if not text: 
        return []
    else:
        candidates = ([first] + segment(rest)
                      for (first, rest) in splits(text, 1))
        return max(candidates, key=Pwords)

strings = ['thatCreation', 'happeningso', 'comebecause']
[segment(string.lower()) for string in strings]

- 2020-08-04 18: 48: 06 - https://raw.githubusercontent.com/dwyl/english-words/master/words.txt Разрешение raw.githubusercontent.com (raw.githubusercontent.com). .. 151.101.0.133, 151.101.64.133, 151.101.128.133, ... Подключение к raw.githubusercontent.com (raw.githubusercontent.com) | 151.101.0.133 |: 443 ... подключено. HTTP-запрос отправлен, ожидает ответа ... 200 OK Длина: 4863005 (4,6M) [text / plain] Сохранение в: 'words.txt.2'

words.txt.2 100% [=== ================>] 4,64 M 162 КБ / с за 25 с

2020-08-04 18:48:31 (192 КБ / с) - 'слова .txt.2 'сохранено [4863005/4863005]

[[' то ',' создание '], [' происходит ',' так '], [' пришло ',' потому что ']]

...