我想提取文本的句子,但是我需要结果的确切位置。当前tokenize.sent_tokenize在NLTK中的实现不会返回提取句子的位置,因此我尝试了以下操作:
offset, length = 0, 0
for sentence in tokenize.sent_tokenize(text):
length = len(sentence)
yield sentence, offset, length
offset += length
Run Code Online (Sandbox Code Playgroud)
但是它不会返回句子的确切位置,因为sent_tokenize会在结果句子边界之外删除一些书写字符(例如,换行符,多余的空格和...)。我不想使用简单的正则表达式模式来拆分句子,我知道在这种情况下,这个问题很小。
谢谢。
为什么在实际实现中必须再次键入每个方法时,Java中使用的接口?什么是写出界面使事情变得容易的情况的例子?
interface ITurtle
{
void Fight();
void EatPizza();
}
interface ILeonardo : ITurtle
{
void UseKatana();
}
interface IRaphael : ITurtle
{
void UseSai();
}
interface IDonatello : ITurtle
{
void UseBo();
}
interface IMichelangelo : ITurtle
{
void UseNunchuku();
}
Run Code Online (Sandbox Code Playgroud)
如果我想创建一个可以完成所有4个的大乌龟怎么办?我想编码:
class GrandTurtle : IMichelangelo, IDonatello, IRaphael, ILeonardo
{
// Implementation not shown for brevity.
}
Run Code Online (Sandbox Code Playgroud)
这是否可能,因为现在,似乎我必须实施Fight(),EatPizza()每次4次.但我认为这两个常用功能将解决,只需要实施一次,对吧?
我可以创建4个中间接口而不继承ITurtle,然后GrandTurtle实现ITurtle.这解决了接口继承问题,但现在它在语义上看起来是错误的,因为它ITurtle看起来像第5个兄弟,它不是.另外,我希望能够创建特定于龟的类,例如class BostonLeonardo : ILeonardo.
我从许多地方读过,似乎是一场无休止的争论 - 有人说"接口内的继承"很精细,那些说不是 - 我要么不理解他们的解释,要么他们只是说这是不好的做法而不解释为什么.
Haskell是一门非常棒的语言.我喜欢它.但作为一名C++程序员并且具有一些关于计算机体系结构的基本知识,我真的想知道有关Haskell的实现细节.
我的意思是,例如,map功能.我知道语法,结果.但是,我想知道这个函数在RAM中是如何工作的.因为C族语言非常清楚语法和计算机行为之间的映射.
那么有没有人对功能程序语法背后的计算机行为有所了解?或者关于这个的任何书籍都像"在C++对象模型中"?
我们可以使用参数定义类型同义词,这与实际类型一起使用时效果很好:
type MyType t = t String String
data Test a b = Test a b
f :: MyType Test
f = undefined
main = undefined
Run Code Online (Sandbox Code Playgroud)
编译这会导致没有错误:
$ghc --make test.hs
[1 of 1] Compiling Main ( test.hs, test.o )
Linking test ...
Run Code Online (Sandbox Code Playgroud)
但是,当Test类型为同义词时,这不起作用:
type MyType t = t String String
data Test a b = Test a b
type Test' a b = Test a b
f :: MyType Test'
f = undefined
main = undefined
Run Code Online (Sandbox Code Playgroud)
这给出了以下错误:
$ghc …Run Code Online (Sandbox Code Playgroud) 我开始学习Haskell,虽然它通常很棒,但类型类系统的一些特殊性在数字化项目中引起了很多挫折.举一个具体的例子,如果我打开ghci并检查添加类型,我会得到:
Prelude> :t (+)
(+) :: Num a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)
添加是超级通用的,Num是最通用的类型等,所以一切都有意义.但是,如果我宣布了一些功能是除此之外,然后检查的类型是功能,类型类被还原成Integer!
Prelude> let add = (+)
Prelude> :t add
add :: Integer -> Integer -> Integer
Run Code Online (Sandbox Code Playgroud)
发生什么了?
假设我有类似的功能
foo = 8 + f1
where f1 = 8 + 9
f2 = 8 + 10
Run Code Online (Sandbox Code Playgroud)
f1显然必须进行评估,但f2不一定要评估.会不会呢?我可以看到评估每个where表达式是一个性能问题.
我最近做了一个验证字符串的练习题.
使用该
Maybe类型编写一个函数,该函数计算字符串中元音的数量和辅音的数量.如果元音的数量超过辅音的数量,则该函数返回Nothing.
我为每个计数元音和计数辅音结束了两个函数:
isVowel :: Char -> Bool
isVowel c = c `elem` "aeiou"
countVowels :: String -> Integer
countVowels [] = 0
countVowels (x:xs) =
if isVowel x
then countVowels xs + 1
else countVowels xs
countConsonants :: String -> Integer
countConsonants [] = 0
countConsonants (x:xs) =
if not $ isVowel x
then countConsonants xs + 1
else countConsonants xs
Run Code Online (Sandbox Code Playgroud)
然后只是比较两者的值来得到我的答案.
makeWord :: String -> Maybe String
makeWord [] = Nothing
makeWord s =
if countVowels …Run Code Online (Sandbox Code Playgroud) 我正在通过Richard Bird和Ross Paterson 的文章De Bruijn表示法作为嵌套数据类型.在一个点上,定义了一个术语的折叠操作:
infixl 9 :@
data Expr a =
Var a
| (Expr a) :@ (Expr a)
| Lam (Expr (Maybe a)
foldT ::
(forall a. a -> n a) ->
(forall a. n a -> n a -> n a) ->
(forall a. n (Maybe a) -> n a) ->
Expr b -> n b
foldT v _ _ (Var x) = v x
foldT v a l (fun :@ arg) = a (foldT …Run Code Online (Sandbox Code Playgroud) 我试图了解类型同义词以及如何实际使用它们。
这是类型的同义词:
empty = const Nothing
type KVS a b = a -> Maybe b
Run Code Online (Sandbox Code Playgroud)
我想制作一个函数,KVS以使用以下代码插入一对:
insert k v kvs = \k' -> if k' == k then Just v else kvs k'
Run Code Online (Sandbox Code Playgroud)
我对这段代码的疑问是:
k'在lambda?它代表什么?if k' == k检查?我不明白的概念Just和Maybe,但代码这个特殊的一块是我无法绕到我的头。
关于函数式编程的解释会很好。